149 votes

Comment résoudre l'erreur "opération ptrace non autorisée" lors de la tentative de connexion de GDB à un processus ?

Je tente de me connecter à un programme avec GDB mais cela renvoie :

Connexion au processus 29139
Impossible de se connecter au processus. Si votre uid correspond à celui du processus cible, vérifiez les paramètres de /proc/sys/kernel/yama/ptrace_scope, ou essayez à nouveau en tant qu'utilisateur root. Pour plus de détails, consultez /etc/sysctl.d/10-ptrace.conf
ptrace : Opération non permise.

Le debugger gdb retourne :

Échec de la connexion au processus, veuillez vérifier les privilèges et réessayer.

strace retourne :

attach : ptrace(PTRACE_ATTACH, ...) : Opération non permise

J'ai changé "kernel.yama.ptrace_scope" de 1 à 0 et /proc/sys/kernel/yama/ptrace_scope de 1 à 0 et j'ai essayé set environment LD_PRELOAD=./ptrace.so avec ceci :

#include 
int ptrace(int i, int j, int k, int l) {
    printf(" ptrace(%i, %i, %i, %i), renvoie -1\n", i, j, k, l);
    return 0;
}

Mais cela renvoie toujours la même erreur. Comment puis-je le connecter aux debuggers ?

265voto

wisbucky Points 829

Si vous utilisez Docker, vous aurez probablement besoin de ces options:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined

Si vous utilisez Podman, vous aurez probablement besoin de son option --cap-add aussi:

podman run --cap-add=SYS_PTRACE

111voto

jesup Points 3050

Ceci est dû à un durcissement du noyau dans Linux; vous pouvez désactiver ce comportement en tapant echo 0 > /proc/sys/kernel/yama/ptrace_scope ou en le modifiant dans /etc/sysctl.d/10-ptrace.conf

Voir aussi cet article à ce sujet dans Fedora 22 (avec des liens vers la documentation) et ce fil de commentaires à propos d'Ubuntu.

22voto

Nagev Points 658

Juste envie de souligner une réponse connexe. Disons que vous êtes root et que vous avez effectué :

strace -p 700

et obtenez :

strace: attach: ptrace(PTRACE_SEIZE, 700): Opération non autorisée

Vérifiez :

grep TracerPid /proc/700/status

Si vous voyez quelque chose comme TracerPid: 12, c'est-à-dire pas 0, c'est le PID du programme qui utilise déjà l'appel système ptrace. À la fois gdb et strace l'utilisent, et il ne peut y en avoir qu'un actif à la fois.

18voto

Juraj Oršulić Points 163

Je voudrais ajouter que j'avais besoin de --security-opt apparmor=unconfined en plus des options mentionnées par @wisbucky. C'était sur Ubuntu 18.04 (à la fois client et hôte Docker). Par conséquent, l'invocation complète pour activer le débogage gdb dans un conteneur est la suivante :

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined

16voto

Doctor Points 831

Comme la plupart d'entre nous atterrissent ici pour des problèmes Docker, je vais ajouter la réponse sur Kubernetes car cela pourrait être utile pour quelqu'un...


Vous devez ajouter la capacité SYS_PTRACE dans le contexte de sécurité de votre pod à spec.containers.securityContext:

       securityContext:
          capabilities:
            add: [ "SYS_PTRACE" ]

Il y a 2 clés securityContext à 2 endroits différents. Si on vous dit que la clé n'est pas reconnue, alors vous l'avez mal placée. Essayez l'autre.

Vous aurez probablement aussi besoin d'un utilisateur root par défaut. Alors dans l'autre contexte de sécurité (spec.securityContext) ajoutez :

      securityContext:
        runAsUser: 0
        runAsGroup: 0
        fsGroup: 101

PS : 0 est root. Mais la valeur fsGroup m'est inconnue. Pour ce que je fais, cela m'importe peu mais vous pourriez en avoir besoin.

Maintenant vous pouvez faire :

strace -s 100000 -e write=1  -e trace=write -p 16

Vous n'aurez plus de permission refusée !

ATTENTION : C'est une boîte de Pandore. Avoir cela en production N'EST PAS recommandé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X