【问题标题】:strace -f strace /bin/ls failed with PTRACE_TRACEME EPERM (Operation not permitted)strace -f strace /bin/ls 因 PTRACE_TRACEME EPERM 失败(不允许操作)
【发布时间】:2016-03-28 13:07:18
【问题描述】:

当我跑步时

strace -f strace /bin/ls 

要知道 strace 是如何工作失败的

ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not permitted) 

即使是 root 帐户。

有什么解决办法吗?

【问题讨论】:

    标签: permissions strace


    【解决方案1】:

    码头工人

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

    docker run -it --cap-add SYS_PTRACE ubuntu
    

    请参阅:Running Strace in Docker

    【讨论】:

      【解决方案2】:

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

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

      您可以通过运行命令来设置设置过程来临时执行此操作:

      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

      【讨论】:

      • cat /proc/sys/kernel/yama/ptrace_scope 0. pid 13953] ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not allowed) 之后出现同样的错误
      • 虽然我使用的是 root 并且cat /proc/sys/kernel/yama/ptrace_scope 产生 0,但我得到了错误。问题可能是由于进程在 docker 容器内运行的事实。有这方面的经验吗?
      【解决方案3】:

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

      人 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 跟踪第一个线程,而第二个 strace 正在跟踪 ls。

      strace strace -f ls
      

      当进行特定的系统调用时,有 -b 可以从 lwp 分离,但它只支持 execve。如果有 ptrace 调用支持,那就完美了。这意味着 strace 要么需要一个小补丁来支持 ptrace 调用。

      替代的潜在黑客包括预加载库,该库通过一些技巧实现分离。

      更好的选择是使用跟踪工具 systemtap 或 trace-cmd,它们可以使用内核提供的跟踪基础设施而不是 ptrace。

      【讨论】:

        猜你喜欢
        • 2019-10-09
        • 2014-09-09
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        相关资源
        最近更新 更多