<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 9 January 2015 at 22:24, Bryce Harrington <span dir="ltr"><<a href="mailto:bryce@osg.samsung.com" target="_blank">bryce@osg.samsung.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Fri, Jan 09, 2015 at 11:33:57AM +0100, Marek Chalupa wrote:<br>
> Yeah and one more thing:<br>
<br>
</span>Btw, any reason this is offlist?<br>
<span class=""><br>
> PR_SET_PTRACER is since Linux 3.4. What happens with older kernels or with<br>
> Yama disabled?<br>
<br>
</span>If I understand how the prctl handlers work, if Yama is not loaded then<br>
PR_SET_PTRACER will just be ignored if it is set.  I'll cc author to be<br>
sure.<br>
<br>
Good point on pre-3.4 kernels.  I'll #ifdef around it.<br>
<span class=""><br>
> I suppose that prctl call fails but since the return code is not used, it<br>
> is ignored and everything continues like before without prctl, right?<br>
<br>
</span>From my understanding of yama_lsm.c, there wouldn't be an error code in<br>
the case that Yama was not enabled (i.e. rc = 0).  With Yama enabled, it<br>
looks like prctl will error if it can't get the tracer task, or in out<br>
of memory conditions.<br>
<br>
I suppose if the prctl call fails, we could bail out at that point.  We<br>
wouldn't know whether a debugger is attached or not though, so perhaps<br>
in that case is_debugger_attached() should return 0?  Looks like we<br>
return 0 in other error cases.<br></blockquote><div><br></div>If prctl call fails, we still could get the information. It will fail on older kernels or when Yama is disabled, right?<br></div><div class="gmail_quote">So when either of this case is true, there are two things that could happen:<br></div><div class="gmail_quote">   * ptrace to parent is possible -- then everything is alright<br></div><div class="gmail_quote">   * permission to attach to parent is denied -- then if user will run the test in debugger, he must run it as a root, because debugger use ptrace too. But when it is running under root, than is_debugger_attached() can procceed normally, because ptrace has the permission to attach. If it is not running under root, we get this bug you found.<br><br></div><div class="gmail_quote">So the best solution IMO would be to check if ptrace in fork failed because another process is tracing the parent or because it does not have permissions. But looking to manpages of ptrace: both cases are indicated by EPERM, so this could be rather hard to do it.<br><br></div><div class="gmail_quote">So yes, probably returning 0 when prctl fails is ok.<br></div><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Thanks for the review; will re-roll the patchset.<br>
<span class="HOEnZb"><font color="#888888"><br>
Bryce<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> Cheers,<br>
> Marek<br>
><br>
> On 9 January 2015 at 11:26, Marek Chalupa <<a href="mailto:mchqwerty@gmail.com">mchqwerty@gmail.com</a>> wrote:<br>
><br>
> ><br>
> ><br>
> > On 7 January 2015 at 21:34, Bryce Harrington <<a href="mailto:bryce@osg.samsung.com">bryce@osg.samsung.com</a>><br>
> > wrote:<br>
> ><br>
> >> This fixes a regression in the testsuite since c3653f7f, where four of<br>
> >> the timeout tests fail with "Timeouts suppressed" messages.<br>
> >><br>
> >> The timeouts are being suppressed because the testsuite is erroneously<br>
> >> detecting that a debugger is attached.  This detection mechanism<br>
> >> (adopted from libinput) uses ptrace to test if there is a debugger<br>
> >> parent process that can be attached.  Unfortunately, this is an<br>
> >> unreliable test: Kernel security policies exist to restrict the scope of<br>
> >> ptrace to prevent processes from snooping on one another.[1] This<br>
> >> security policy is set as the default on Ubuntu, and potentially other<br>
> >> Linux distributions.[2]<br>
> >><br>
> >> The Yama documentation suggests, "For software that has defined<br>
> >> application-specific relationships between a debugging process and its<br>
> >> inferior (crash handlers, etc), prctl(PR_SET_PTRACER, pid, ...) can be<br>
> >> used.  An inferior can declare which other process (and its descendents)<br>
> >> are allowed to call PTRACE_ATTACH against it."<br>
> >><br>
> >> The child needs to be synchronized to the client to prevent a race<br>
> >> condition where the child might try to operate before the parent has<br>
> >> finished its prctl call.  This synchronization is done via pipes.<br>
> >><br>
> >> 1:<br>
> >> <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=2d514487faf188938a4ee4fb3464eeecfbdcf8eb" target="_blank">http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=2d514487faf188938a4ee4fb3464eeecfbdcf8eb</a><br>
> >> 2:<br>
> >> <a href="https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace_Protection" target="_blank">https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace_Protection</a><br>
> >><br>
> >> Signed-off-by: Bryce Harrington <<a href="mailto:bryce@osg.samsung.com">bryce@osg.samsung.com</a>><br>
> >> ---<br>
> >>  tests/test-runner.c | 35 ++++++++++++++++++++++++++++++++---<br>
> >>  1 file changed, 32 insertions(+), 3 deletions(-)<br>
> >><br>
> >> diff --git a/tests/test-runner.c b/tests/test-runner.c<br>
> >> index b813b69..11d064e 100644<br>
> >> --- a/tests/test-runner.c<br>
> >> +++ b/tests/test-runner.c<br>
> >> @@ -34,6 +34,7 @@<br>
> >>  #include <errno.h><br>
> >>  #include <limits.h><br>
> >>  #include <sys/ptrace.h><br>
> >> +#include <linux/prctl.h><br>
> >><br>
> ><br>
> > Better use <sys/prctl.h>. prctl() is declared in sys/prctl.h.<br>
> > linux/prctl.h only defines the values for arguments (and is included by<br>
> > sys/prctl.h)<br>
> ><br>
> ><br>
> >><br>
> >>  #include "test-runner.h"<br>
> >><br>
> >> @@ -255,13 +256,33 @@ is_debugger_attached(void)<br>
> >>  {<br>
> >>         int status;<br>
> >>         int rc;<br>
> >> -       pid_t pid = fork();<br>
> >> +       pid_t pid;<br>
> >> +       int pipefd[2];<br>
> >><br>
> >> -       if (pid == -1)<br>
> >> +       if (pipe(pipefd) == -1) {<br>
> >> +               perror("pipe");<br>
> >>                 return 0;<br>
> >> +       }<br>
> >> +<br>
> >> +       pid = fork();<br>
> >> +       if (pid == -1) {<br>
> >> +               perror("fork");<br>
> >> +               close(pipefd[0]);<br>
> >> +               close(pipefd[1]);<br>
> >> +               return 0;<br>
> >> +       }<br>
> >><br>
> >>         if (pid == 0) {<br>
> >> -               pid_t ppid = getppid();<br>
> >> +               char buf;<br>
> >> +               pid_t ppid;<br>
> >> +<br>
> >> +               /* Wait until parent is ready */<br>
> >> +               close(pipefd[1]); /* Close unused write end */<br>
> >> +               while (read(pipefd[0], &buf, 1) > 0);<br>
> >><br>
> > +               close(pipefd[0]);<br>
> >> +<br>
> >> +               /* Attempt to ptrace the parent */<br>
> >> +               ppid = getppid();<br>
> >>                 rc = ptrace(PTRACE_ATTACH, ppid, NULL, NULL);<br>
> >>                 if (rc == 0) {<br>
> >>                         waitpid(ppid, NULL, 0);<br>
> >> @@ -273,6 +294,14 @@ is_debugger_attached(void)<br>
> >>                 }<br>
> >>                 _exit(rc);<br>
> >>         } else {<br>
> >> +               close(pipefd[0]);<br>
> >> +<br>
> >> +               /* Enable child to ptrace the parent process */<br>
> >> +               prctl(PR_SET_PTRACER, pid);<br>
> >> +<br>
> >> +               /* Signal to client that parent is ready */<br>
> >> +               close(pipefd[1]);<br>
> >><br>
> ><br>
> > Maybe this would deserve better description, because signaling something<br>
> > by closing the pipe is not clear IMO.<br>
> ><br>
> ><br>
> ><br>
> >>                 waitpid(pid, &status, 0);<br>
> >>                 rc = WEXITSTATUS(status);<br>
> >>         }<br>
> >> --<br>
> >> 1.9.1<br>
> >><br>
> >> _______________________________________________<br>
> >> wayland-devel mailing list<br>
> >> <a href="mailto:wayland-devel@lists.freedesktop.org">wayland-devel@lists.freedesktop.org</a><br>
> >> <a href="http://lists.freedesktop.org/mailman/listinfo/wayland-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/wayland-devel</a><br>
> >><br>
> ><br>
> ><br>
> > For both patches:<br>
> ><br>
> > Reviewed-by: Marek Chalupa <<a href="mailto:mchqwerty@gmail.com">mchqwerty@gmail.com</a>><br>
> ><br>
> ><br>
</div></div></blockquote></div><br></div></div>