[PATCH wayland 2/2 v2] tests: Fix FAIL in sanity-test (*timeout*) when Yama LSM enabled

Marek Chalupa mchqwerty at gmail.com
Sat Jan 10 01:47:23 PST 2015


Just resending to wayland-devel...

On 9 January 2015 at 11:26, Marek Chalupa <mchqwerty at gmail.com> wrote:

>
>
> On 7 January 2015 at 21:34, Bryce Harrington <bryce at osg.samsung.com>
> wrote:
>
>> This fixes a regression in the testsuite since c3653f7f, where four of
>> the timeout tests fail with "Timeouts suppressed" messages.
>>
>> The timeouts are being suppressed because the testsuite is erroneously
>> detecting that a debugger is attached.  This detection mechanism
>> (adopted from libinput) uses ptrace to test if there is a debugger
>> parent process that can be attached.  Unfortunately, this is an
>> unreliable test: Kernel security policies exist to restrict the scope of
>> ptrace to prevent processes from snooping on one another.[1] This
>> security policy is set as the default on Ubuntu, and potentially other
>> Linux distributions.[2]
>>
>> The Yama documentation suggests, "For software that has defined
>> application-specific relationships between a debugging process and its
>> inferior (crash handlers, etc), prctl(PR_SET_PTRACER, pid, ...) can be
>> used.  An inferior can declare which other process (and its descendents)
>> are allowed to call PTRACE_ATTACH against it."
>>
>> The child needs to be synchronized to the client to prevent a race
>> condition where the child might try to operate before the parent has
>> finished its prctl call.  This synchronization is done via pipes.
>>
>> 1:
>> http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=2d514487faf188938a4ee4fb3464eeecfbdcf8eb
>> 2:
>> https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace_Protection
>>
>> Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
>> ---
>>  tests/test-runner.c | 35 ++++++++++++++++++++++++++++++++---
>>  1 file changed, 32 insertions(+), 3 deletions(-)
>>
>> diff --git a/tests/test-runner.c b/tests/test-runner.c
>> index b813b69..11d064e 100644
>> --- a/tests/test-runner.c
>> +++ b/tests/test-runner.c
>> @@ -34,6 +34,7 @@
>>  #include <errno.h>
>>  #include <limits.h>
>>  #include <sys/ptrace.h>
>> +#include <linux/prctl.h>
>>
>
> Better use <sys/prctl.h>. prctl() is declared in sys/prctl.h.
> linux/prctl.h only defines the values for arguments (and is included by
> sys/prctl.h)
>
>
>>
>>  #include "test-runner.h"
>>
>> @@ -255,13 +256,33 @@ is_debugger_attached(void)
>>  {
>>         int status;
>>         int rc;
>> -       pid_t pid = fork();
>> +       pid_t pid;
>> +       int pipefd[2];
>>
>> -       if (pid == -1)
>> +       if (pipe(pipefd) == -1) {
>> +               perror("pipe");
>>                 return 0;
>> +       }
>> +
>> +       pid = fork();
>> +       if (pid == -1) {
>> +               perror("fork");
>> +               close(pipefd[0]);
>> +               close(pipefd[1]);
>> +               return 0;
>> +       }
>>
>>         if (pid == 0) {
>> -               pid_t ppid = getppid();
>> +               char buf;
>> +               pid_t ppid;
>> +
>> +               /* Wait until parent is ready */
>> +               close(pipefd[1]); /* Close unused write end */
>> +               while (read(pipefd[0], &buf, 1) > 0);
>>
> +               close(pipefd[0]);
>> +
>> +               /* Attempt to ptrace the parent */
>> +               ppid = getppid();
>>                 rc = ptrace(PTRACE_ATTACH, ppid, NULL, NULL);
>>                 if (rc == 0) {
>>                         waitpid(ppid, NULL, 0);
>> @@ -273,6 +294,14 @@ is_debugger_attached(void)
>>                 }
>>                 _exit(rc);
>>         } else {
>> +               close(pipefd[0]);
>> +
>> +               /* Enable child to ptrace the parent process */
>> +               prctl(PR_SET_PTRACER, pid);
>> +
>> +               /* Signal to client that parent is ready */
>> +               close(pipefd[1]);
>>
>
> Maybe this would deserve better description, because signaling something
> by closing the pipe is not clear IMO.
>
>
>
>>                 waitpid(pid, &status, 0);
>>                 rc = WEXITSTATUS(status);
>>         }
>> --
>> 1.9.1
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>>
>
>
> For both patches:
>
> Reviewed-by: Marek Chalupa <mchqwerty at gmail.com>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20150110/a9ebf7ba/attachment.html>


More information about the wayland-devel mailing list