是否有解决方法:“ dtrace无法控制使用受限权利签名的可执行文件”?


71

在OS X 10.11 El Capitan中看起来像,dtruss并且dtrace无法再执行其应做的工作。这是我尝试运行时遇到的错误sudo dtruss curl ...

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

我遇到了注意到此问题的人,但到目前为止还没有解决方案。

有没有办法解决此问题或解决此问题?


2
这看起来很合适
安德鲁·亨利

Answers:


29

跟进亚历山大·乌沙科夫和查尔斯的答案:

一旦你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

1
换句话说,您可以附加到正在运行的进程,但dtruss不会启动它。那真是怪了。Sorta似乎是个错误。dtruss -n也可以。这是比复制更好的解决方法。
杰森·哈斯兰

26

对于那些想要dtrace之后的系统附带二进制文件的人,例如csrutil disable,将copy其存储到非“受限”目录中,/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

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


1
请注意,在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
命名

2
这可能是因为dturss试图跟踪sudo可执行文件。不需要第二个sudo。
Grisha Levit

21

正如Andrew所注意到的,这是因为系统完整性保护(也称为“无根”)。

您可以完全或部分禁用它(仅在有某些限制的情况下启用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附加到受限制的进程


5
请注意,在这些说明的末尾,它提到这样做是行不通的。我并不完全确定,但是鉴于该错误是与“用有限的权利签名”有关的,我认为它实际上可能与SIP无关。
字形

2
@glyph我已经尝试过此指令,并且对我有用。最后请注意有关“部分禁用SIP”的信息-在这种情况下,如果仅启用dtrace,仍然无法跟踪受限制的系统进程。但是您将能够跟踪其他进程。
Alexander Ushakov 2015年

确保确保以实际的可执行文件为目标。如果存在最终调用可执行文件的中间脚本,则dtrace将尝试附加到解释器,即使禁用了SIP,它也可能无法工作。
Mark Reed

1
是否有任何变通办法允许dtrace附加到受限制的进程?
Heath Borders

1
@Schneems答案中引用了说明的全文
Alexander Ushakov

9

我会将其发布为评论,但我不允许。

禁用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.

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


1
这对我不起作用。我试图跟踪自己的不受限制的二进制文件,但仍然从dtruss中得到错误。
horseyguy

9
在具有可执行文件的Mojave上对我不起作用/sbin/ifconfig。输出为dtrace: failed to execute ./ifconfig: (os/kern) failure
Werner Henze '18

8
@WernerHenze想通了! 由于Apple使用了代码签名过程dtraceifconfig因此无法附加。简单codesign --remove-signature ./ifconfig,它应该可以工作!
Max Coplan

6

似乎完全禁用SIP仍然会阻塞受限制进程的truss:

$ /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

2

请参阅对相关问题“如何使dtrace能够以非root用户特权运行traced命令”的回答。[原文如此]。

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

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

链接答案中的完整说明。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.