OS X 10.11 El Capitanでは、dtruss
とdtrace
は本来の目的を果たすことができなくなりました。これは、Sudo dtruss curl ...
を実行しようとしたときに表示されるエラーです。
dtrace:curlの実行に失敗しました:dtraceは制限された資格で署名された実行可能ファイルを制御できません
私はこの問題に気付いている人々に出くわしましたが、今のところ解決策はありません。
これを修正する方法や回避する方法はありますか?
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
csrutil disable
、copy
itの後にシステム出荷バイナリを「制限」されていないディレクトリ、たとえば/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
Andrewが気付いたように、これは System Integrity Protection であり、「ルートレス」とも呼ばれます。
完全にまたは部分的に無効にすることができます(いくつかの制限付きでdtraceのみを有効にします)。
SIPを完全に無効にします
Appleからは推奨されていませんが、Macのシステム整合性保護を完全に無効にすることができます。方法は次のとおりです。
- Macをリカバリモードで起動します。再起動して、進行状況バーが表示されるまでcmd + Rを押し続けます。
- [ユーティリティ]メニューに移動します。ターミナルを選択します。
- 次のコマンドを入力して、システム整合性保護を無効にします。
$ 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をアタッチすることはできません
これをコメントとして投稿しますが、許可されていません。
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.
コピー後も正常に機能するバイナリの場合、これはプロセスのライフタイム全体をキャプチャし、保護を無効にする必要がないため、最適なオプションです。
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