Gibt es eine Problemumgehung für: "dtrace kann keine ausführbaren Dateien steuern, die mit eingeschränkten Berechtigungen signiert sind"?

71

Es sieht aus wie in OS X 10.11 El Capitan dtrussund dtracekann nicht mehr das tun, was sie tun sollen. Dies ist der Fehler, den ich bekomme, wenn ich versuche auszuführen sudo dtruss curl ...:

dtrace: Curl konnte nicht ausgeführt werden: dtrace kann keine ausführbaren Dateien steuern, die mit eingeschränkten Berechtigungen signiert sind

Ich bin auf Leute gestoßen, die dieses Problem bemerkt haben, aber bisher keine Lösungen.

Gibt es eine Möglichkeit, dies zu beheben oder zu umgehen?

Flimm
quelle
2
Dies sieht apropos aus: apple.stackexchange.com/questions/208478/…
Andrew Henle
Mögliches Duplikat von dtruss schlägt unter ps unter OS X 10.11
fehl

Antworten:

29

Nach den Antworten von Alexander Ushakov und Charles:

Sobald Sie dies getan haben csrutil enable --without dtrace, gibt es eine Alternative zum Kopieren der Binärdatei: Führen Sie die Binärdatei in einem Terminalfenster aus und verfolgen Sie den Terminalprozess selbst in einem anderen Terminalfenster.

Suchen Sie im ersten Terminalfenster die PID:

$ echo $$
1154

Beginnen Sie im zweiten Terminalfenster mit der Ablaufverfolgung:

$ sudo dtruss -p 1154 -f

Führen Sie im ersten Terminalfenster den Prozess aus, den Sie verfolgen möchten:

$ ls

Zu diesem Zeitpunkt sollte die Ablaufverfolgung im zweiten Fenster angezeigt werden. Ignorieren Sie die Einträge für die PID, die Sie verfolgen (z. B. 1154), und der Rest bezieht sich auf den Prozess (und seine Nachkommen), an dem Sie interessiert sind.

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
Raghu Dodda
quelle
1
Mit anderen Worten, Sie können einen laufenden Prozess anhängen, aber dtruss startet ihn nicht. Das ist komisch. Sorta scheint ein Fehler zu sein. dtruss -nfunktioniert auch. Dies ist eine viel schönere Problemumgehung als das Kopieren.
Jason Haslam
26

Für diejenigen, die das System nachverfolgen möchten csrutil disable, wird copyes in ein Verzeichnis verschoben , das nicht "eingeschränkt" ist, z./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

Siehe @ JJs Kommentar: /apple/208762/now-that-el-capitan-is-rootless-is-there-any-way-to-get-dtrace-working/224731#224731

CW
quelle
1
Nur ein Heads-up, dass dies bei El Capitan 10.11.4 bei mir nicht funktioniert. Ich versuche herauszufinden, warum Picasa nicht startet und kopiere es so nach / tmp, aber siehe:~$ sudo dtruss -f -t open sudo -u $USER /tmp/Picasa dtrace: failed to execute sudo: dtrace cannot control executables signed with restricted entitlements
sming
2
Dies liegt daran, dass dturss versucht, die ausführbare sudo-Datei zu verfolgen. Das zweite Sudo wird dort nicht benötigt.
Grisha Levit
21

Wie Andrew bemerkt, liegt dies am Systemintegritätsschutz , der auch als "rootless" bezeichnet wird.

Sie können es ganz oder teilweise deaktivieren (aktivieren Sie nur dtrace mit einigen Einschränkungen).

Deaktivieren Sie SIP vollständig

Obwohl von Apple nicht empfohlen, können Sie den Systemintegritätsschutz auf Ihrem Mac vollständig deaktivieren. Hier ist wie:

  1. Starten Sie Ihren Mac im Wiederherstellungsmodus: Starten Sie ihn neu und halten Sie cmd + R gedrückt, bis ein Fortschrittsbalken angezeigt wird.
  2. Gehen Sie zum Menü Dienstprogramme. Wählen Sie dort Terminal.
  3. Geben Sie diesen Befehl ein, um den Systemintegritätsschutz zu deaktivieren:

$ csrutil disable

Sie werden aufgefordert, einen Neustart durchzuführen - tun Sie dies und Sie sind frei von SIP!

SIP teilweise deaktivieren

Glücklicherweise ist SIP nicht monolithisch: Es besteht aus vielen verschiedenen Modulen, die wir separat deaktivieren / aktivieren können.

Wiederholen Sie die Schritte 1 und 2 im obigen Abschnitt «SIP vollständig deaktivieren». Geben Sie nun im Terminal die folgenden Befehle ein:

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

Starten Sie neu und genießen Sie Ihr Betriebssystem erneut.

Dtrace beginnt zu funktionieren, aber Sie können dtrace immer noch nicht an eingeschränkte Prozesse anhängen

Alexander Ushakov
quelle
5
Beachten Sie, dass am Ende dieser Anleitung erwähnt wird, dass dies nicht funktioniert . Ich bin mir nicht ganz sicher, aber da es sich bei dem Fehler um Dinge handelt, die "mit eingeschränkten Berechtigungen signiert" sind, denke ich, dass dies möglicherweise nicht mit SIP zusammenhängt.
Glyphe
2
@glyph Ich habe diese Anweisung ausprobiert und sie funktioniert bei mir. Der Hinweis am Ende bezieht sich auf "SIP teilweise deaktivieren". In diesem Fall können Sie Systemprozesse , die eingeschränkt sind, immer noch nicht verfolgen , wenn Sie nur dtrace aktivieren . Sie können jedoch auch andere Prozesse verfolgen.
Alexander Ushakov
Stellen Sie sicher, dass Sie auf die tatsächlich ausführbare Datei abzielen. Wenn es ein Zwischenskript gibt, das letztendlich die ausführbare Datei aufruft, versucht dtrace, eine Verbindung zum Interpreter herzustellen, was wahrscheinlich auch bei deaktiviertem SIP nicht funktioniert.
Mark Reed
1
Gibt es eine Problemumgehung, mit der dtrace an eingeschränkte Prozesse angehängt werden kann?
Heath Borders
1
@Schneems Vollständiger Text der Anweisung wird in der Antwort zitiert
Alexander Ushakov
9

Ich würde dies als Kommentar posten, aber ich bin nicht erlaubt.

Das Deaktivieren von SIP ist nicht erforderlich. Kopieren Sie einfach die Binärdatei an einen anderen Speicherort und es funktioniert einwandfrei:

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

Für Binärdateien, die nach dem Kopieren noch normal funktionieren können, ist dies die beste Option, da sie die gesamte Lebensdauer des Prozesses erfassen und keinen Schutz deaktivieren müssen.

Jonathan Lynch
quelle
1
Das funktioniert bei mir nicht. Ich versuche, meine eigenen Binärdateien zu verfolgen, die nicht eingeschränkt sind, und ich erhalte immer noch Fehler von dtruss.
Horseyguy
9
Funktioniert bei Mojave mit ausführbarer Datei nicht /sbin/ifconfig. Ausgabe ist dtrace: failed to execute ./ifconfig: (os/kern) failure.
Werner Henze
8
@WernerHenze hat es herausgefunden! dtracekann ifconfigaufgrund des von Apple verwendeten Codesignierungsprozesses nicht angehängt werden. Einfach codesign --remove-signature ./ifconfigund es sollte funktionieren!
Max Coplan
6

Es sieht so aus, als würde das vollständige Deaktivieren von SIP immer noch dtruss für eingeschränkte Prozesse blockieren:

$ /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
David Mulder
quelle
2

Siehe meine Antwort auf die verwandte Frage "Wie kann dtrace den Befehl traced mit Nicht-Root-Berechtigungen ausführen?" [sic].

DTrace kann Prozesse ausführen, die bereits ausgeführt werden. Starten Sie also einen Hintergrundprozess, der 1 Sekunde auf den Start von DTrace wartet (Entschuldigung für die Rennbedingung), und überprüfen Sie die PID dieses Prozesses.

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

Vollständige Erklärung in der verknüpften Antwort.

Birchlabs
quelle