Thread (67 messages) 67 messages, 7 authors, 2019-06-18

RE: [RFC PATCH v2 1/5] mm: Introduce vm_ops->may_mprotect()

From: Xing, Cedric <hidden>
Date: 2019-06-10 22:06:56
Also in: lkml, selinux

From: Christopherson, Sean J
Sent: Monday, June 10, 2019 12:50 PM

On Mon, Jun 10, 2019 at 10:47:52AM -0700, Xing, Cedric wrote:
quoted
quoted
From: Christopherson, Sean J
Sent: Monday, June 10, 2019 8:56 AM
quoted
quoted
As a result, LSM policies cannot be meaningfully applied, e.g.
an LSM can deny access to the EPC as a whole, but can't deny
PROT_EXEC on page that originated in a non-EXECUTE file (which
is long gone by the time
mprotect() is called).
I have hard time following what is paragraph is trying to say.
quoted
By hooking mprotect(), SGX can make explicit LSM upcalls while
an enclave is being built, i.e. when the kernel has a handle to
origin of each enclave page, and enforce the result of the LSM
policy whenever userspace maps the enclave page in the future.
"LSM policy whenever calls mprotect()"? I'm no sure why you mean
by mapping here and if there is any need to talk about future.
Isn't this needed now?
Future is referring to the timeline of a running kernel, not the
future of the kernel code.

Rather than trying to explain all of the above with words, I'll
provide code examples to show how ->may_protect() will be used by
SGX and why it is the preferred solution.
The LSM concept is to separate security policy enforcement from the
rest of the kernel. For modules, the "official" way is to use VM_MAY*
flags to limit allowable permissions, while LSM uses
security_file_mprotect().
quoted
I guess that's why we didn't have .may_mprotect() in the first place.
Heh, so I've typed up about five different responses to this comment.
In doing so, I think I've convinced myself that ->may_mprotect() is
unnecessary.  Rther than hook mprotect(), simply update the VM_MAY*
flags during mmap(), with all bits cleared if there isn't an associated
enclave page.  IIRC, the need to add ->may_protect() came about when we
were exploring more dynamic interplay between SGX and LSMs.
quoted
What you are doing is enforcing some security policy outside of LSM,
which is dirty from architecture perspective.
No, the enclave page protections are enforced regardless of LSM policy,
and in v2 those protections are immutable.  Yes, the explicit enclave
page protection bits are being added primarily for LSMs, but they don't
impact functionality other than at the security_enclave_load()
touchpoint.
Disagreed.

You can say you want to enforce "something" without LSM. But what's the purpose of that "something" without LSM? Why doesn't the original mprotect() enforce that "something"?

It *does* affect functionality because user mode code has to figure out an "explicit protection" to make sure the enclave would work with *and also* without LSM. That said, the "explicit protection" can neither be too restrictive (or enclave wouldn't work) nor be too permissive (or LSM policies are violated). But what if the user mode code doesn't have appropriate "explicit protection" ahead of time as it is just going to mprotect() as the enclave requests at runtime?

And your restrictions on mmap()'ing non-existing pages also have great impacts to SGX2 support.

I think some reasonable answers are needed to the above questions before we can call this proposal viable. 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help