On Tue, Apr 18, 2023 at 09:16:37PM -0400, Waiman Long wrote:
1) App runs creating lots of threads.By the way, this is a daft policy. The policy you really want is
2) It mmap's 256K pages of anonymous memory.
3) It writes executable code to that memory.
4) It calls mprotect() with PROT_EXEC on that memory so
it can subsequently execute the code.
The above mprotect() will fail if the mmap'd region's VMA gets merged with
the VMA for one of the thread stacks. That's because the default RHEL
SELinux policy is to not allow executable stacks.
EXEC|WRITE is not allowed. A non-writable stack is useless, so it's
actually a superset of your current policy. Forbidding _simultaneous_
write and executable is just good programming. This way, you don't need
to care about the underlying VMA's current permissions, you just need
to do:
if ((prot & (PROT_EXEC|PROT_WRITE)) == (PROT_EXEC|PROT_WRITE))
return -EACCESS;