x86: check remote MMIO remap permissions

When a domain is mapping pages from a different pg_owner domain, the
iomem_access checks are currently only applied to the pg_owner domain,
potentially allowing a domain with a more restrictive iomem_access
policy to have the pages mapped into its page tables. To catch this,
also check the owner of the page tables. The current domain does not
need to be checked because the ability to manipulate a domain's page
tables implies full access to the target domain, so checking that
domain's permission is sufficient.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Committed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Daniel De Graaf committed 2012-09-26 11:56:07 +02:00
1 parent 4047479dfa
commit 8e804aec45
1 file changed
+13
+13
View File
@@ -754,6 +754,19 @@ get_page_from_l1e(
return -EINVAL;
}
if ( pg_owner != l1e_owner &&
!iomem_access_permitted(l1e_owner, mfn, mfn) )
{
if ( mfn != (PADDR_MASK >> PAGE_SHIFT) ) /* INVALID_MFN? */
{
MEM_LOG("Dom%u attempted to map I/O space %08lx in dom%u to dom%u",
curr->domain->domain_id, mfn, pg_owner->domain_id,
l1e_owner->domain_id);
return -EPERM;
}
return -EINVAL;
}
if ( !(l1f & _PAGE_RW) ||
!rangeset_contains_singleton(mmio_ro_ranges, mfn) )
return 0;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.