> From: Christopherson, Sean J
> Sent: Friday, May 31, 2019 4:32 PM
>
> ...to support (the equivalent) of existing Linux Security Module
> functionality.
>
> Because SGX manually manages EPC memory, all enclave VMAs are backed by the
> same vm_file,
> i.e. /dev/sgx/enclave, so that SGX can implement the necessary hooks to move
> pages in/out
> of the EPC. And because EPC pages for any given enclave are fundamentally
> shared between
> processes, i.e.
> CoW semantics are not possible with EPC pages, /dev/sgx/enclave must always
> be MAP_SHARED.
> Lastly, all real world enclaves will need read, write and execute permissions
> to EPC pages.
> As a result, SGX does not play nice with existing LSM behavior as it is
> impossible to
> apply policies to enclaves with any reasonable granularity, e.g. an LSM can
> deny access to
> EPC altogether, but can't deny potentially dangerous behavior such as mapping
> pages RW->RW
> or RWX.
>
> To give LSMs enough information to implement their policies without having to
> resort to
> ugly things, e.g. holding a reference to the vm_file of each enclave page,
> require
> userspace to explicitly state the allowed protections for each page (region),
> i.e. take
> ALLOW_{READ,WRITE,EXEC} in the ADD_PAGES ioctl.
>
> The ALLOW_* flags will be passed to LSMs so that they can make informed
> decisions when the
> enclave is being built, i.e. when the source vm_file is available. For
> example, SELinux's
> EXECMOD permission can be required if an enclave is requesting both
> ALLOW_WRITE and
> ALLOW_EXEC.
>
> Update the mmap()/mprotect() hooks to enforce the ALLOW_* protections, a la
> the standard
> VM_MAY{READ,WRITE,EXEC} flags.
>
> The ALLOW_EXEC flag also has a second (important) use in that it can be used
> to prevent
> loading an enclave from a noexec file system, on
> SGX2 hardware (regardless of kernel support for SGX2), userspace could EADD
> from a noexec
> path using read-only permissions and later mprotect() and ENCLU[EMODPE] the
> page to gain
> execute permissions. By requiring ALLOW_EXEC up front, SGX will be able to
> enforce noexec
> paths when building the enclave.
ALLOW_* flags shall be kept internal to LSM.
This patch is completely unnecessary.