> 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.