web-dev-qa-db-ja.com

「dtraceは、制限された資格で署名された実行可能ファイルを制御できません」の回避策はありますか?

OS X 10.11 El Capitanでは、dtrussdtraceは本来の目的を果たすことができなくなりました。これは、Sudo dtruss curl ...を実行しようとしたときに表示されるエラーです。

dtrace:curlの実行に失敗しました:dtraceは制限された資格で署名された実行可能ファイルを制御できません

私はこの問題に気付いている人々に出くわしましたが、今のところ解決策はありません。

これを修正する方法や回避する方法はありますか?

59
Flimm

csrutil enable --without dtrace、バイナリのコピーに代わる方法があります。あるターミナルウィンドウでバイナリを実行し、別のターミナルウィンドウでターミナルプロセス自体をトレースします。

最初のターミナルウィンドウで、PIDを見つけます。

$ echo $$
1154

2番目のターミナルウィンドウで、トレースを開始します。

$ Sudo dtruss -p 1154 -f

戻って、最初のターミナルウィンドウで、トレースするプロセスを実行します。

$ ls

この時点で、2番目のウィンドウにトレースが表示されます。トレースしている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
27
Raghu Dodda

csrutil disablecopyitの後にシステム出荷バイナリを「制限」されていないディレクトリ、たとえば/tmpにdtraceする場合

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

25
Charles

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*

再起動して、OSをもう一度お楽しみください。

Dtraceは動作を開始しますが、制限されたプロセスにdtraceをアタッチすることはできません

14

これをコメントとして投稿しますが、許可されていません。

SIPの無効化はnotが必要です。バイナリを別の場所にコピーするだけで正常に機能します。

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

コピー後も正常に機能するバイナリの場合、これはプロセスのライフタイム全体をキャプチャし、保護を無効にする必要がないため、最適なオプションです。

6
Jonathan Lynch

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
5
David Mulder

関連する 質問my answer を参照してください。 [原文]。

DTracecanすでに実行中のプロセスをスヌープします。そのため、DTraceが起動するまで1秒待機するバックグラウンドプロセスを開始し(競合状態は申し訳ありません)、そのプロセスのPIDをスヌープします。

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

リンクされた回答の完全な説明。

1
Birchlabs