Re: [PATCH] selinux-testsuite: Add test for execstack on thread stacks.

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

 



On 07/29/2016 09:39 AM, Paul Moore wrote:
> On Thu, Jul 28, 2016 at 10:43 AM, Stephen Smalley <sds@xxxxxxxxxxxxx> wrote:
>> Test execstack permission checking for thread stacks.
>> The test is conditional on Linux >= 4.7.
>>
>> Signed-off-by: Stephen Smalley <sds@xxxxxxxxxxxxx>
>> ---
>> Revised to make it conditional on the kernel version in which
>> the corresponding change was merged, so it passes on old and new kernels.
>>
>>  tests/mmap/Makefile                |  2 ++
>>  tests/mmap/mprotect_stack_thread.c | 58 ++++++++++++++++++++++++++++++++++++++
>>  tests/mmap/test                    |  8 +++++-
>>  3 files changed, 67 insertions(+), 1 deletion(-)
>>  create mode 100644 tests/mmap/mprotect_stack_thread.c
> 
> With v4.7 released, and the newly added conditionals, I see no reason
> not to merge this patch (as well as the userns cap test) into the
> master branch.  Can you think of any reason why not?

No, that's why I re-spun these patches.  Should be good to go.  I
force-pushed the updated patches to the branches, so they should be
available to merge or cherry-pick there.

> 
>> diff --git a/tests/mmap/Makefile b/tests/mmap/Makefile
>> index f2f486c..e330f3e 100644
>> --- a/tests/mmap/Makefile
>> +++ b/tests/mmap/Makefile
>> @@ -1,5 +1,7 @@
>>  TARGETS=$(patsubst %.c,%,$(wildcard *.c))
>>
>> +LDLIBS += -lpthread
>> +
>>  all: $(TARGETS)
>>
>>  clean:
>> diff --git a/tests/mmap/mprotect_stack_thread.c b/tests/mmap/mprotect_stack_thread.c
>> new file mode 100644
>> index 0000000..fed9969
>> --- /dev/null
>> +++ b/tests/mmap/mprotect_stack_thread.c
>> @@ -0,0 +1,58 @@
>> +#include <unistd.h>
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <stdbool.h>
>> +#include <string.h>
>> +#include <errno.h>
>> +#include <sys/mman.h>
>> +#include <sys/utsname.h>
>> +#include <pthread.h>
>> +
>> +static void *test_thread(void *p)
>> +{
>> +       char buf[4096];
>> +       int rc;
>> +       void *ptr;
>> +       long pagesize = sysconf(_SC_PAGESIZE);
>> +
>> +       ptr = (void *) (((unsigned long) buf) & ~(pagesize - 1));
>> +
>> +       rc = mprotect(ptr, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC);
>> +       if (rc < 0) {
>> +               perror("mprotect");
>> +               exit(1);
>> +       }
>> +       return NULL;
>> +}
>> +
>> +int main(int argc, char **argv)
>> +{
>> +       struct utsname uts;
>> +       pthread_t thread;
>> +
>> +       if (argc != 2) {
>> +               fprintf(stderr, "usage: %s [pass|fail]\n", argv[0]);
>> +               exit(1);
>> +       }
>> +
>> +       if (strcmp(argv[1], "pass") && strcmp(argv[1], "fail")) {
>> +               fprintf(stderr, "usage: %s [pass|fail]\n", argv[0]);
>> +               exit(1);
>> +       }
>> +
>> +       if (uname(&uts) < 0) {
>> +               perror("uname");
>> +               exit(1);
>> +       }
>> +
>> +       if (!strcmp(argv[1], "fail") && strverscmp(uts.release, "4.7") < 0) {
>> +               printf("%s: Kernels < 4.7 do not check execstack on thread stacks, skipping.\n", argv[0]);
>> +               /* pass the test by failing as if it was denied */
>> +               exit(1);
>> +       }
>> +
>> +       pthread_create(&thread, NULL, test_thread, NULL);
>> +       pthread_join(thread, NULL);
>> +       exit(0);
>> +}
>> +
>> diff --git a/tests/mmap/test b/tests/mmap/test
>> index 6b1de55..e1c2942 100755
>> --- a/tests/mmap/test
>> +++ b/tests/mmap/test
>> @@ -1,7 +1,7 @@
>>  #!/usr/bin/perl
>>
>>  use Test;
>> -BEGIN { plan tests => 30}
>> +BEGIN { plan tests => 32}
>>
>>  $basedir = $0;  $basedir =~ s|(.*)/[^/]*|$1|;
>>
>> @@ -68,6 +68,12 @@ ok($result, 0);
>>  $result = system "runcon -t test_execmem_t $basedir/mprotect_stack 2>&1";
>>  ok($result);
>>
>> +# Test success and failure for thread execstack, independent of execmem.
>> +$result = system "runcon -t test_execstack_t $basedir/mprotect_stack_thread pass";
>> +ok($result, 0);
>> +$result = system "runcon -t test_execmem_t $basedir/mprotect_stack_thread fail 2>&1";
>> +ok($result);
>> +
>>  # Test success and failure for file execute on mmap w/ file shared mapping.
>>  $result = system "runcon -t test_file_rwx_t $basedir/mmap_file_shared $basedir/temp_file";
>>  ok($result, 0);
>> --
>> 2.5.5
>>
> 
> 
> 

_______________________________________________
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