Re: selinux-testsuite: mmap execmod test failure on RHEL6.7 s390x

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 






----- Original Message -----
> From: "Stephen Smalley" <sds@xxxxxxxxxxxxx>
> To: "Jan Stancek" <jstancek@xxxxxxxxxx>, "Paul Moore" <paul@xxxxxxxxxxxxxx>
> Cc: selinux@xxxxxxxxxxxxx
> Sent: Thursday, 5 November, 2015 3:37:33 PM
> Subject: Re: selinux-testsuite: mmap execmod test failure on RHEL6.7 s390x
> 
> On 11/05/2015 08:27 AM, Jan Stancek wrote:
> >
> >
> >
> >
> > ----- Original Message -----
> >> From: "Paul Moore" <paul@xxxxxxxxxxxxxx>
> >> To: "Stephen Smalley" <sds@xxxxxxxxxxxxx>
> >> Cc: "Jan Stancek" <jstancek@xxxxxxxxxx>, selinux@xxxxxxxxxxxxx
> >> Sent: Wednesday, 4 November, 2015 10:51:15 PM
> >> Subject: Re: selinux-testsuite: mmap execmod test failure on RHEL6.7 s390x
> >>
> >> On Wed, Nov 4, 2015 at 3:49 PM, Stephen Smalley <sds@xxxxxxxxxxxxx> wrote:
> >>> On 11/04/2015 03:32 PM, Paul Moore wrote:
> >>>>
> >>>> On Wed, Nov 4, 2015 at 2:21 PM, Stephen Smalley <sds@xxxxxxxxxxxxx>
> >>>> wrote:
> >>>>>
> >>>>> selinux-testsuite exercises the individual kernel permission checks
> >>>>> using
> >>>>> its own privately defined test domains and types, so a failure
> >>>>> indicates
> >>>>> a
> >>>>> kernel bug or a bug in the test policy or test code, not a bug in the
> >>>>> distribution policy package.  It could be that a change in the
> >>>>> distribution
> >>>>> policy has a side effect (e.g. allowing some permission to all domains
> >>>>> that
> >>>>> we are trying to test such that we cannot trigger a failure, as in this
> >>>>> case), but the testsuite tries to work around such cases by setting any
> >>>>> necessary global booleans for the test duration and/or custom defining
> >>>>> the
> >>>>> test domain in such a way that it does not inherit anything from the
> >>>>> distribution policy.
> >>>>>
> >>>>> The exec* checks can be disabled on certain architectures if they
> >>>>> default
> >>>>> to
> >>>>> executable data but that would affect more than just execmod (and s390
> >>>>> does
> >>>>> not default to executable data).
> >>>>>
> >>>>> Can you check that execmod permission is NOT granted to
> >>>>> test_no_execmod_t:
> >>>>> $ sesearch -AC -s test_no_execmod_t -p execmod
> >>>>>
> >>>>> Can you confirm that the test program is not marked with executable
> >>>>> stack
> >>>>> flag:
> >>>>> $ execstack -q tests/mmap/mprotect_file_private_execmod
> >>>>>
> >>>>> Otherwise, I think you need some kernel instrumentation / tracing to
> >>>>> see
> >>>>> what is happening, particularly the selinux_file_mprotect() function.
> >>>>
> >>>>
> >>>> I have been working with Jan on this and it appears that the issue is
> >>>> due to the READ_IMPLIES_EXEC personality being set on the affected
> >>>> s390x kernels.
> >>>
> >>>
> >>> Hmmm...doesn't explain why only execmod failed - that should create
> >>> failures
> >>> for multiple tests.
> >>
> >> Yes, it turns out I spoke too soon.
> >
> > If I add a call to personality(0), the testcase can pass
> > (mprotect fails with EACCES):
> >
> > diff --git a/tests/mmap/mprotect_file_private_execmod.c
> > b/tests/mmap/mprotect_file_private_execmod.c
> > index ade1981..b2efa05 100644
> > --- a/tests/mmap/mprotect_file_private_execmod.c
> > +++ b/tests/mmap/mprotect_file_private_execmod.c
> > @@ -4,6 +4,7 @@
> >   #include <errno.h>
> >   #include <fcntl.h>
> >   #include <sys/mman.h>
> > +#include <sys/personality.h>
> >
> >   int main(int argc, char **argv)
> >   {
> > @@ -11,6 +12,9 @@ int main(int argc, char **argv)
> >          int rc;
> >          int fd;
> >
> > +
> > +       personality(0);
> > +
> >          if (argc != 2) {
> >                  fprintf(stderr, "usage: %s file\n", argv[0]);
> >                  exit(1);
> >
> > (strace log)
> > ...
> > [pid  2976] 08:21:53.928872 personality(PER_LINUX) = 4194304
> > [pid  2976] 08:21:53.936870 open("./temp_file", O_RDONLY) = 3
> > [pid  2976] 08:21:53.936898 mmap(NULL, 4096, PROT_READ|PROT_WRITE,
> > MAP_PRIVATE, 3, 0) = 0x3fffd4fa000
> > [pid  2976] 08:21:53.936925 mprotect(0x3fffd4fa000, 4096,
> > PROT_READ|PROT_EXEC) = -1 EACCES (Permission denied)
> >
> > (strace log from original)
> > ...
> > [pid  3165] 08:24:31.480187 open("./temp_file", O_RDONLY) = 3
> > [pid  3165] 08:24:31.480294 mmap(NULL, 4096, PROT_READ|PROT_WRITE,
> > MAP_PRIVATE, 3, 0) = 0x3fffd196000
> > [pid  3165] 08:24:31.480318 mprotect(0x3fffd196000, 4096,
> > PROT_READ|PROT_EXEC) = 0
> >
> > # uname -r
> > 2.6.32-584.el6.s390x
> >
> > # cat /etc/redhat-release
> > Red Hat Enterprise Linux Server release 6.7 (Santiago)
> 
> Hmm...you have no similar issue with mprotect_stack or mprotect_heap?  I

No, these work as expected. systemtap trace shows that
vma->vm_flags doesn't contain VM_EXEC:

mprotect_heap selinux_file_mprotect vma=0x789e7680 reqprot=0x5 prot=0x5, flags: 100073
mprotect_heap selinux_file_mprotect return=0xfffffffffffffff3

Here is a strace log of "runcon -t test_execmem_t $basedir/mprotect_heap":

[pid  4775] 10:31:59.987008 brk(0)      = 0xb824a000
[pid  4775] 10:31:59.987021 brk(0xb826d000) = 0xb826d000
[pid  4775] 10:31:59.987042 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid  4775] 10:31:59.987060 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
[pid  4775] 10:31:59.987080 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid  4775] 10:31:59.987094 nanosleep({30, 0}, 0x3ffffaafed0) = 0 
  ^^ I added this sleep so I can capture /proc/pid/maps
[pid  4775] 10:32:29.987868 mprotect(0xb824b000, 4096, PROT_READ|PROT_EXEC) = -1 EACCES (Permission denied)

# cat /proc/4775/maps 
80000000-80001000 r-xp 00000000 fd:00 787427                             /root/selinux-testsuite-my/tests/mmap/mprotect_heap
80001000-80002000 rwxp 00000000 fd:00 787427                             /root/selinux-testsuite-my/tests/mmap/mprotect_heap
b824a000-b826d000 rw-p 00000000 00:00 0                                  [heap]
4a9261f000-4a92640000 r-xp 00000000 fd:00 268803                         /lib64/ld-2.12.so
4a92640000-4a92641000 r-xp 00020000 fd:00 268803                         /lib64/ld-2.12.so
4a92641000-4a92642000 rwxp 00021000 fd:00 268803                         /lib64/ld-2.12.so
4a92642000-4a92643000 rw-p 00000000 00:00 0 
4a92649000-4a927f9000 r-xp 00000000 fd:00 268804                         /lib64/libc-2.12.so
4a927f9000-4a927fd000 r-xp 001af000 fd:00 268804                         /lib64/libc-2.12.so
4a927fd000-4a927fe000 rwxp 001b3000 fd:00 268804                         /lib64/libc-2.12.so
4a927fe000-4a92803000 rwxp 00000000 00:00 0 
3fffd6b4000-3fffd6b6000 rwxp 00000000 00:00 0 
3fffd6c3000-3fffd6c6000 rwxp 00000000 00:00 0 
3fffd6c6000-3fffd6c8000 r-xp 00000000 00:00 0                            [vdso]
3ffffa9c000-3ffffab1000 rw-p 00000000 00:00 0                            [stack]

# cat /proc/4775/personality 
00400000

Regards,
Jan

> guess mprotect_file_private_rx and mprotect_file_private_rwx aren't
> affected because we always apply the file execute check even if the
> mapping is already executable, and likewise for mprotect_anon_* and
> execmem.  Only the checks directly in selinux_file_mprotect() are gated
> by a !(vma->vm_flags & VM_EXEC) test; the ones in file_map_prot_check()
> that are shared with the mmap hook are unconditional.
> 
> What does /proc/self/maps look like?
> 
> 
_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.



[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux