• Sean Christopherson's avatar
    mm: Add 'mprotect' hook to struct vm_operations_struct · 95bb7c42
    Sean Christopherson authored
    Background
    ==========
    
    1. SGX enclave pages are populated with data by copying from normal memory
       via ioctl() (SGX_IOC_ENCLAVE_ADD_PAGES), which will be added later in
       this series.
    2. It is desirable to be able to restrict those normal memory data sources.
       For instance, to ensure that the source data is executable before
       copying data to an executable enclave page.
    3. Enclave page permissions are dynamic (just like normal permissions) and
       can be adjusted at runtime with mprotect().
    
    This creates a problem because the original data source may have long since
    vanished at the time when enclave page permissions are established (mmap()
    or mprotect()).
    
    The solution (elsewhere in this series) is to force enclave creators to
    declare their paging permission *intent* up front to the ioctl().  This
    intent can be immediately compared to the source data’s mapping and
    rejected if necessary.
    
    The “intent” is also stashed off for later comparison with enclave
    PTEs. This ensures that any future mmap()/mprotect() operations
    performed by the enclave creator or done on behalf of the enclave
    can be compared with the earlier declared permissions.
    
    Problem
    =======
    
    There is an existing mmap() hook which allows SGX to perform this
    permission comparison at mmap() time.  However, there is no corresponding
    ->mprotect() hook.
    
    Solution
    ========
    
    Add a vm_ops->mprotect() hook so that mprotect() operations which are
    inconsistent with any page's stashed intent can be rejected by the driver.
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Co-developed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Acked-by: default avatarJethro Beekman <jethro@fortanix.com>
    Acked-by: default avatarDave Hansen <dave.hansen@intel.com>
    Acked-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Acked-by: default avatarHillf Danton <hdanton@sina.com>
    Cc: linux-mm@kvack.org
    Link: https://lkml.kernel.org/r/20201112220135.165028-11-jarkko@kernel.org
    95bb7c42
mprotect.c 17.3 KB