Skip to contentSkip to conversation

mmap(), #PF handler and EADD interaction

DISCUSSION Jarkko Sakkinen 2 participants 3 messages Aug 19, 2019 – Aug 21, 2019 Intel SGX

lore
Share & tools
lore
#0 lore raw

I did some backtracking today how the permission flow worked.

With the maximum VM flags defined for a page, what if EADD is done after mmap()? E.g. we first do mmap() with RWX and later EADD with lets say RW.

The first thing that comes to mind is that the #PF handler should caught this corner case.

Now the code correctly validates when you do either mmap() and mprotect() after EADD(s) but I think "other way around" is missing.

/Jarkko

#1 lore raw
Quoted 5 lines · Jarkko Sakkinen

I did some backtracking today how the permission flow worked.

With the maximum VM flags defined for a page, what if EADD is done after mmap()? E.g. we first do mmap() with RWX and later EADD with lets say RW.

sgx_encl_may_map() returns -EACCESS on any attempt to mmap()/mprotect() a range that is not fully covered by EADD'd pages with any of PROT_READ, PROT_WRITE or PROT_EXEC. This is handled in the !page check below.

	if (!page || (~page->vm_prot_bits & vm_prot_bits))
		return -EACCES;

A waiver is given for PROT_NONE, primarily so that mmap() can be used prior to ECREATE to find an available ELRANGE, but any attempt to access a PROT_NONE VMA will result in a SIGSEGV, e.g. access_error() explicitly checks the RWX prot bits.

	/* PROT_NONE always succeeds. */
	if (!vm_prot_bits)
		return 0;
Quoted 8 lines

The first thing that comes to mind is that the #PF handler should caught this corner case.

Now the code correctly validates when you do either mmap() and mprotect() after EADD(s) but I think "other way around" is missing.

/Jarkko

#2 lore raw
Quoted 10 lines · Sean Christopherson
Quoted 5 lines · Jarkko Sakkinen

I did some backtracking today how the permission flow worked.

With the maximum VM flags defined for a page, what if EADD is done after mmap()? E.g. we first do mmap() with RWX and later EADD with lets say RW.

sgx_encl_may_map() returns -EACCESS on any attempt to mmap()/mprotect() a range that is not fully covered by EADD'd pages with any of PROT_READ, PROT_WRITE or PROT_EXEC. This is handled in the !page check below.

Aah so it was. Can you send me a patch to extend the kdoc with additional paragraph to remark this?

/Jarkko