使用PTRACE_TRACEME EPERM失败-f strace / bin / ls(不允许操作)

时间:2015-12-22 09:54:12

标签: permissions strace

当我跑步时

strace -f strace /bin/ls 

通过

知道失败是如何失败的
ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not permitted) 

即使使用root帐户。

这有什么解决方案吗?

3 个答案:

答案 0 :(得分:9)

泊坞

在Docker容器中运行strace时,要启用ptrace,请使用SYS_PTRACE param运行:

docker run -it --cap-add SYS_PTRACE ubuntu

请参阅:Running Strace in Docker

答案 1 :(得分:2)

我在最近的blog post about strace中提到了这个以及更多有用的提示。

您需要启用对gdb,strace和类似工具的支持,以附加到系统上的进程。

您可以通过运行命令来设置设置proc:

来暂时执行此操作

sudo bash -c 'echo 0 > /proc/sys/kernel/yama/ptrace_scope'

您可以修改/etc/sysctl.d/10-ptrace.conf并设置kernel.yama.ptrace_scope = 0,在系统重新启动之间保留该设置。

如果您的系统没有/etc/sysctl.d/10-ptrace.conf,则可以修改/etc/sysctl.conf并设置kernel.yama.ptrace_scope = 0

答案 2 :(得分:0)

ptrace系统调用仅限于每个进程一个跟踪应用程序。

man ptrace:

  EPERM  The  specified  process cannot be traced.  This could be because the tracer has insuffi‐
         cient privileges (the required capability  is  CAP_SYS_PTRACE);  unprivileged  processes
         cannot  trace  processes  that  they  cannot  send signals to or those running set-user-
         ID/set-group-ID programs, for obvious reasons.  Alternatively, the process  may  already
         be being traced, or (on kernels before 2.6.26) be init(1) (PID 1).

这意味着只有调试应用程序可以附加到同一进程。完成strace -f后,您告诉它附加由程序调试启动的所有进程。在您的情况下,strace调用fork创建一个新进程并使用ptrace系统调用设置新进程进行调试。然后,它将使用您提供给调用的参数调用exec。然后再次启动strace,尝试再次执行fork和ptrace。但是第二个ptrace对EPERM失败,因为第一个strace已经连接到该进程。

在不使用-f参数的情况下运行第一个strace,可以在第二个strace跟踪ls时从第二个strace跟踪第一个线程。

strace strace -f ls

进行特定的系统调用时,有-b可以与lwp分离,但是仅支持execve。如果有ptrace呼叫支持,那将是完美的。这意味着strace要么需要一个小补丁来支持ptrace调用。

潜在的黑客手段包括预加载的库,该库实现了一些技巧性的分离。

更好的选择是使用跟踪工具systemtap或trace-cmd,它们可以使用内核提供的跟踪基础结构代替ptrace。