【问题标题】:Is there a workaround for: "dtrace cannot control executables signed with restricted entitlements"?是否有解决方法:“dtrace 无法控制使用受限权利签名的可执行文件”?
【发布时间】:2016-02-02 06:23:31
【问题描述】:

看起来在 OS X 10.11 El Capitan 中,dtrussdtrace 不能再做他们应该做的事情。这是我尝试运行sudo dtruss curl ...时遇到的错误:

dtrace:执行 curl 失败:dtrace 无法控制使用受限权利签名的可执行文件

我遇到过有人注意到这个问题,但到目前为止还没有解决方案。

有没有办法解决这个问题或解决这个问题?

【问题讨论】:

标签: osx-elcapitan dtrace


【解决方案1】:

跟进 Alexander Ushakov 和 Charles 的回答:

一旦您csrutil enable --without dtrace,除了复制二进制文件之外,还有另一种方法:在一个终端窗口中运行二进制文件,并在另一个终端窗口中跟踪终端进程本身。

在第一个终端窗口中,找到它的 PID:

$ echo $$
1154

在第二个终端窗口中,开始跟踪:

$ sudo dtruss -p 1154 -f

返回,在第一个终端窗口中,运行你要跟踪的进程:

$ ls

此时,您应该在第二个窗口中看到跟踪。忽略您正在跟踪的 PID 的条目(例如 1154),其余的是您感兴趣的进程(及其后代)。

1154/0x1499:  sigprocmask(0x3, 0x7FFF53E5C608, 0x0)      = 0x0 0
1154/0x1499:  sigprocmask(0x1, 0x7FFF53E5C614, 0x7FFF53E5C610)       = 0x0 0
3100/0xa9f3:  getpid(0x7FFF82A35344, 0x7FFF82A35334, 0x2000)         = 3100 0
3100/0xa9f3:  sigprocmask(0x3, 0x10BE32EF8, 0x0)         = 0x0 0

【讨论】:

  • 换句话说,您可以附加到正在运行的进程,但 dtruss 不会启动它。这很奇怪。 Sorta 似乎是一个错误。 dtruss -n 也可以。这是比复制更好的解决方法。
【解决方案2】:

对于那些想要 dtrace 系统在csrutil disablecopyit 之后发送的二进制文件到一个不受“限制”的目录,例如,/tmp

CC@~ $ csrutil status
System Integrity Protection status: disabled.
CC@~ $ cp /bin/echo /tmp
CC@~ $ sudo dtruss /tmp/echo

SYSCALL(args)        = return
thread_selfid(0x0, 0x0, 0x0)         = 46811 0
csops(0x0, 0x0, 0x7FFF51B6CA20)      = 0 0
issetugid(0x0, 0x0, 0x7FFF51B6CA20)      = 0 0
shared_region_check_np(0x7FFF51B6A918, 0x0, 0x7FFF51B6CA20)      = 0 0
stat64("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x7FFF51B6BEA8, 0x7FFF51B6CA20      = 0 0

查看@J.J 的评论:https://apple.stackexchange.com/questions/208762/now-that-el-capitan-is-rootless-is-there-any-way-to-get-dtrace-working/224731#224731

【讨论】:

  • 只是提醒一下,这对我在 El Capitan 10.11.4 上不起作用。我试图找出为什么 Picasa 没有启动,因此将其复制到 /tmp 但请参阅:~$ sudo dtruss -f -t open sudo -u $USER /tmp/Picasa dtrace: failed to execute sudo: dtrace cannot control executables signed with restricted entitlements
  • 这将导致 dturss 试图跟踪 sudo 可执行文件。不需要第二个 sudo。
【解决方案3】:

正如 Andrew 所注意到的,这是因为 System Integrity Protection,也称为“无根”。

您可以完全或部分禁用它(仅启用 dtrace,但有一些限制)。

完全禁用 SIP

虽然 Apple 不推荐,但您可以完全禁用系统 Mac 上的完整性保护。方法如下:

  1. 将您的 Mac 启动到恢复模式:重新启动并按住 cmd+R 直到出现进度条。
  2. 转到实用程序菜单。在那里选择终端。
  3. 输入此命令以禁用系统完整性保护:

$ csrutil disable

它会要求您重新启动 - 这样做您就可以从 SIP 中解放出来!

部分禁用 SIP

幸运的是,SIP 不是单一的:它是由许多不同的 我们可以单独禁用/启用的模块。

重复上述“完全禁用 SIP”部分的第 1 步和第 2 步。现在 在终端中输入以下命令:

$ csrutil clear # restore the default configuration first
$ csrutil enable --without dtrace # disable dtrace restrictions *only*

重新启动并再次享受您的操作系统。

Dtrace 开始工作,但您仍然无法将 dtrace 附加到受限进程

【讨论】:

  • 请注意,在这些说明的末尾会提到这样做不起作用。我不完全确定,但鉴于错误是关于“以受限权利签名”的事情,我认为它实际上可能与 SIP 无关。
  • @glyph 我试过这个指令,它对我有用。最后的通知是关于“部分禁用 SIP” - 在这种情况下,如果您只启用 dtrace,您仍然无法跟踪 受限制system 进程。但是您将能够跟踪其他进程。
  • 确保你的目标是实际的可执行文件;如果有最终调用可执行文件的中间脚本,dtrace 将尝试附加到解释器,即使禁用 SIP,这也可能无法正常工作。
  • 是否有任何解决方法可以让 dtrace 附加到受限进程?
  • @Schneems 答案中引用了指令全文
【解决方案4】:

我会将此作为评论发布,但我不被允许。

禁用 SIP不是必要的。只需将二进制文件复制到备用位置,它就可以正常工作:

$ sudo dtruss ping google.com
dtrace: system integrity protection is on, some features will not be available

dtrace: failed to execute ping: dtrace cannot control executables signed with restricted entitlements
$ sudo cp $(which ping) .
$ sudo dtruss ./ping google.com
dtrace: system integrity protection is on, some features will not be available

SYSCALL(args)        = return
PING google.com (172.217.10.78): 56 data bytes
^C
$ csrutil status
System Integrity Protection status: enabled.

对于在复制后仍可正常运行的二进制文件,这是最佳选择,因为它可以捕获整个进程的生命周期,并且不需要禁用任何保护。

【讨论】:

  • 这对我不起作用。我正在尝试跟踪我自己的不受限制的二进制文件,但我仍然从 dtruss 收到错误。
  • 不适用于我在 Mojave 上的可执行文件 /sbin/ifconfig。输出为dtrace: failed to execute ./ifconfig: (os/kern) failure
  • @WernerHenze 想通了! dtrace 无法附加到 ifconfig,因为 Apple 使用了协同设计过程。简化codesign --remove-signature ./ifconfig,它应该可以工作!
【解决方案5】:

看起来完全禁用 SIP 仍然会阻止受限制进程的 dtruss:

$ /usr/bin/csrutil status
System Integrity Protection status: disabled.
$ sudo dtruss /bin/echo "blah"
dtrace: failed to execute /bin/echo: dtrace cannot control executables signed with restricted entitlements
$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.11.2
BuildVersion:   15C50

【讨论】:

    【解决方案6】:

    请参阅相关question 上的my answer“如何让 dtrace 以非 root 权限运行跟踪的命令?” [原文如此]。

    DTrace 可以监听已经在运行的进程。因此,启动一个后台进程,该进程等待 1 秒以等待 DTrace 启动(抱歉出现竞争情况),并监听该进程的 PID。

    sudo true && \
    (sleep 1; ps) & \
    sudo dtrace -n 'syscall:::entry /pid == $1/ {@[probefunc] = count();}' $! \
    && kill $!
    

    链接答案中的完整解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2012-09-28
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多