Y a-t-il une solution de rechange pour: "dtrace ne peut pas contrôler les exécutables signés avec des droits restreints"?
il semble que dans OS X 10.11 El Capitan, dtruss
et dtrace
ne peuvent plus faire ce qu'ils sont censés faire. C'est l'erreur que j'obtiens quand j'essaie d'exécuter sudo dtruss curl ...
:
dtrace: n'a pas exécuté curl: dtrace ne peut pas contrôler les exécutables signés avec des droits restreints
j'ai rencontré des gens remarquant ce problème, mais jusqu'à présent aucune solution.
y a-t-il un moyen de corriger cette ou de contourner cela?
6 réponses
pour ceux qui veulent DTrace système expédié binaire après csrutil disable
, copy
il à un répertoire qui n'est pas "restreint", par exemple, /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"151900920"", 0x7FFF51B6BEA8, 0x7FFF51B6CA20 = 0 0
voir le commentaire de @J. J: https://apple.stackexchange.com/questions/208762/now-that-el-capitan-is-rootless-is-there-any-way-to-get-dtrace-working/224731#224731
une fois que vous csrutil enable --without dtrace
, il y a une alternative à la copie du binaire: exécuter le binaire dans une fenêtre de Terminal et tracer le processus de Terminal lui-même dans une autre fenêtre de Terminal.
dans la première fenêtre de terminal, trouver son PID:
$ echo $$
1154
dans la deuxième fenêtre du terminal, commencez la trace:
$ sudo dtruss -p 1154 -f
retour, dans la première fenêtre de terminal, lancer le processus que vous voulez tracer:
$ ls
À ce stade, vous devriez voir la trace dans la deuxième fenêtre. Ignorez les entrées pour le PID que vous tracez (e.g., 1154), et le reste est pour le processus (et ses descendants) qui vous intéresse.
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
comme le remarque Andrew , c'est à cause de Protection De L'intégrité du système , aussi connu comme "sans racine".
vous pouvez le désactiver complètement ou partiellement (activez juste dtrace avec quelques limitations).
désactiver Complètement SIP
bien que non recommandé par Apple, vous pouvez désactiver entièrement le système Protection de l'intégrité sur Vous Mac. Voici comment:
- démarrez votre Mac en mode Récupération: redémarrez-le et maintenez cmd+R jusqu'à ce qu'une barre de progression apparaisse.
- aller au menu Utilitaires. Choisissez Terminal là.
- entrer cette commande pour désactiver la protection de L'intégrité du système:
$ csrutil disable
il vous demandera de redémarrer - le faire et vous êtes libre de SIP!
partiellement désactivable SIP
heureusement, SIP n'est pas monolithique: il est construit à partir de nombreux différents modules, nous pouvons désactiver/activer séparément.
répétez les étapes 1 et 2 de la section "désactiver complètement SIP" ci-dessus. Maintenant dans le Terminal entrer ces commandes:
$ csrutil clear # restore the default configuration first $ csrutil enable --without dtrace # disable dtrace restrictions *only*
redémarrez et profitez de votre OS à nouveau.
DTrace commence à fonctionner mais vous êtes toujours incapable de fixer dtrace à processus restreints
Instructions source: http://internals.exposés/blog/dtrace-vs-sip.html
ressemble à SIP complètement désactivant bloque encore dtruss pour les processus restreints:
$ /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
je voudrais poster ceci comme un commentaire mais je ne suis pas autorisé.
Désactivation de la SIP est pas nécessaire. Il suffit de copier le binaire à un autre endroit et il fonctionne très bien:
$ 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.
pour les binaires qui peuvent encore fonctionner normalement après avoir été copiés, c'est la meilleure option car elle capture toute la durée de vie du processus et ne nécessite aucune protection désactivante.
Voir ma réponse sur les question "Comment pouvez obtenir dtrace pour exécuter le tracé de commande avec les privilèges root?" [SIC.]
DTrace can processus snoop qui sont déjà en cours. Ainsi, lancer un processus de fond qui attend 1sec pour que DTrace démarre (désolé pour l'état de la course), et snoop le PID de ce processus.
sudo true && \
(sleep 1; ps) & \
sudo dtrace -n 'syscall:::entry /pid == / {@[probefunc] = count();}' $! \
&& kill $!
explication complète dans la réponse liée.