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