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

Fli*_*imm 63 dtrace osx-elcapitan

它看起来像在OS X 10.11 El Capitan中,dtruss并且dtrace不能再做他们想要做的事了.这是我尝试运行时遇到的错误sudo dtruss curl ...:

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

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

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

Rag*_*dda 27

一旦你csrutil enable --without dtrace,可以选择复制二进制文件:在一个终端窗口中运行二进制文件,并在另一个终端窗口中跟踪终端进程本身.

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

$ echo $$
1154
Run Code Online (Sandbox Code Playgroud)

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

$ sudo dtruss -p 1154 -f
Run Code Online (Sandbox Code Playgroud)

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

$ ls
Run Code Online (Sandbox Code Playgroud)

此时,您应该在第二个窗口中看到跟踪.忽略您正在跟踪的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
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,您可以附加到正在运行的进程,但 dtruss 不会启动它。这很奇怪。有点像一个错误。`dtruss -n` 也有效。这是比复制更好的解决方法。 (2认同)

Cha*_*les 26

对于那些想要在系统之后运行二进制文件的人来说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
Run Code Online (Sandbox Code Playgroud)

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

  • 这将导致dturss试图追踪sudo可执行文件.第二个sudo没有必要. (2认同)

Ale*_*kov 17

安德鲁注意到它是因为系统完整性保护,也称为"无根".

您可以完全或部分禁用它(仅启用具有某些限制的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*
Run Code Online (Sandbox Code Playgroud)

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

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

说明来源:http://internals.exposed/blog/dtrace-vs-sip.html

  • 请注意,在这些说明的最后,它提到执行此*不起作用*.我不完全确定,但鉴于错误是关于"使用受限制的权利签署"的事情,我认为它实际上可能与SIP无关. (5认同)
  • @glyph 我试过这个指令,它对我有用。注意最后是关于“部分禁用 SIP” - 在这种情况下,如果您只启用 dtrace,您仍然无法跟踪 **受限制** 的 **系统** 进程。但是您将能够跟踪其他进程。 (2认同)
  • @Schneems 答案中引用了指令全文 (2认同)

Jon*_*nch 6

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

禁用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.
Run Code Online (Sandbox Code Playgroud)

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

  • @WernerHenze 明白了!由于 Apple 使用的协同签名流程,“dtrace”无法附加到“ifconfig”。简化“codesign --remove-signature ./ifconfig”,它应该可以工作! (8认同)
  • 在带有可执行文件`/ sbin/ifconfig`的Mojave上对我不起作用.输出是`dtrace:无法执行./ifconfig :( os/kern)失败. (7认同)
  • 这对我不起作用。我正在尝试跟踪我自己的不受限制的二进制文件,但我仍然从 dtruss 收到错误。 (3认同)
  • @MaxCoplan 不幸的是,这也不再起作用了(至少在 ARM 芯片上不起作用,这可能很重要)。 (2认同)

Dav*_*der 5

似乎完全禁用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
Run Code Online (Sandbox Code Playgroud)