web-dev-qa-db-fra.com

Existe-t-il une solution de contournement pour: "dtrace ne peut pas contrôler les exécutables signés avec des droits restreints"?

On dirait que sous 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 lorsque j'essaie de lancer Sudo dtruss curl ...:

dtrace: échec de l'exécution de 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 at-il un moyen de résoudre ce problème ou de contourner ce problème?

59
Flimm

Une fois que vous csrutil enable --without dtrace, il existe une alternative à la copie du binaire: exécutez le binaire dans une fenêtre de terminal et suivez le processus du terminal lui-même dans une autre fenêtre de terminal.

Dans la première fenêtre du terminal, trouvez 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 du terminal, exécutez le processus que vous souhaitez suivre:

$ ls

À ce stade, vous devriez voir la trace dans la deuxième fenêtre. Ignorez les entrées du PID que vous tracez (par exemple, 1154) et le reste concerne 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
27
Raghu Dodda

Pour ceux qui veulent dtrace le système binaire livré après csrutil disable, copyit dans un répertoire non "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\0", 0x7FFF51B6BEA8, 0x7FFF51B6CA20      = 0 0

Voir le commentaire de @ JJ: https://Apple.stackexchange.com/questions/208762/now-that-el-capitan-is-rootless-is-there-any-way-to-get-dtrace -travail/224731 # 224731

25
Charles

Comme Andrew le remarque, c'est à cause de System Integrity Protection , également appelé "sans racine".

Vous pouvez le désactiver complètement ou partiellement (activez simplement dtrace avec certaines limitations).

Désactiver complètement SIP

Bien que cela ne soit pas recommandé par Apple, vous pouvez entièrement désactiver la protection de l’intégrité du système sur votre Mac. Voici comment:

  1. Démarrez votre Mac en mode de récupération: redémarrez-le et maintenez la touche cmd + R enfoncée jusqu'à ce qu'une barre de progression apparaisse.
  2. Aller au menu Utilitaires. Choisissez Terminal ici.
  3. Entrez cette commande pour désactiver la protection de l'intégrité du système:

$ csrutil disable

Il vous demandera de redémarrer - faites-le et vous êtes libre de SIP!

Désactiver partiellement SIP

Heureusement, SIP n'est pas monolithique: il est construit à partir de nombreux modules différents que 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 Terminal, entrez ces commandes:

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

Redémarrez et profitez de votre système d'exploitation à nouveau.

Dtrace commence à fonctionner mais vous êtes toujours incapable pour lier dtrace à des processus restreints

14

Je posterais ceci comme un commentaire mais je ne suis pas autorisé.

Désactiver SIP est pas nécessaire. Copiez simplement le fichier binaire vers un autre emplacement et cela fonctionnera parfaitement:

$ 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 fichiers binaires qui peuvent toujours fonctionner normalement après avoir été copiés, il s'agit de la meilleure solution, car elle capture toute la durée de vie du processus et ne nécessite aucune désactivation de la protection.

6
Jonathan Lynch

On dirait que la désactivation complète SIP bloque toujours 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
5
David Mulder

Voir ma réponse sur connexe question "Comment peut-on obtenir que dtrace exécute la commande suivie avec des privilèges non root?" [sic].

DTrace peut surveiller les processus en cours d'exécution. Démarrez donc un processus en arrière-plan qui attend 1 seconde pour le démarrage de DTrace (désolé pour la situation de concurrence) et surveillez le PID de ce processus.

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

Explication complète en réponse liée.

1
Birchlabs