RE: [RFC PATCH 7/9] x86/sgx: Enforce noexec filesystem restriction for enclaves

From: Xing, Cedric
Date: Mon Jun 03 2019 - 02:32:59 EST


> From: Christopherson, Sean J
> Sent: Friday, May 31, 2019 4:32 PM
>
> Do not allow an enclave page to be mapped with PROT_EXEC if the source page is backed by a
> file on a noexec file system.
>
> Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx>
> ---
> arch/x86/kernel/cpu/sgx/driver/ioctl.c | 26 ++++++++++++++++++++++++--
> 1 file changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/sgx/driver/ioctl.c
> b/arch/x86/kernel/cpu/sgx/driver/ioctl.c
> index c30acd3fbbdd..5f71be7cbb01 100644
> --- a/arch/x86/kernel/cpu/sgx/driver/ioctl.c
> +++ b/arch/x86/kernel/cpu/sgx/driver/ioctl.c
> @@ -576,6 +576,27 @@ static int __sgx_encl_add_page(struct sgx_encl *encl, unsigned long
> addr,
> return ret;
> }
>
> +static int sgx_encl_page_protect(unsigned long src, unsigned long prot,
> + unsigned long *allowed_prot)
> +{
> + struct vm_area_struct *vma;
> +
> + if (!(*allowed_prot & VM_EXEC))
> + goto do_check;
> +
> + down_read(&current->mm->mmap_sem);
> + vma = find_vma(current->mm, src);
> + if (!vma || (vma->vm_file && path_noexec(&vma->vm_file->f_path)))
> + *allowed_prot &= ~VM_EXEC;

Testing (vma->vm_flags & VM_MAYEXEC) == 0 should be a better approach.

Moreover, it looks like the check is done per page, so say 100 pages would cause this test to run 100 times even if they are within the same VMA. Wouldn't that be a bit inefficient?

> + up_read(&current->mm->mmap_sem);
> +
> +do_check:
> + if (prot & ~*allowed_prot)
> + return -EACCES;
> +
> + return 0;
> +}