web-dev-qa-db-fra.com

Comment résoudre le problème "opération non autorisée de ptrace" lors de la tentative d'association de GDB à un processus

j'essaie de joindre un programme avec gdb mais il me renvoie:

Joindre au processus 29139 Impossible de joindre au processus. Si votre uid correspond à celui de la cible processus, vérifiez la configuration de/proc/sys/kernel/yama/ptrace_scope ou essayez à nouveau en tant qu'utilisateur root. Pour plus de détails, voir /etc/sysctl.d/10-ptrace.conf ptrace: opération non autorisée.

edb-debugger renvoie "Échec de l'attachement au processus, vérifiez les privilèges et réessayez."

strace retourne "attach: ptrace (PTRACE_ATTACH, ...): opération non autorisée"

j'ai changé "kernel.yama.ptrace_scope" 1 en 0 et "/ proc/sys/kernel/yama/ptrace_scope" 1 en 0 et essayé "définir l'environnement LD_PRELOAD =./ptrace.so" avec ceci:

#include <stdio.h>
int ptrace(int i, int j, int k, int l)
{
    printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l);
    return 0;
}

mais il retourne toujours la même erreur. Comment puis-je l'attacher à des débogueurs?

35
user2850750

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

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

Cela est dû au durcissement du noyau sous Linux; vous pouvez désactiver ce comportement en 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 commentaire sur Ubuntu et.

29
jesup

Ne répond pas vraiment au cas d'utilisation ci-dessus, mais j'ai eu ce problème:

Problème : Il est arrivé que j'ai démarré mon programme avec Sudo. Ainsi, lors du lancement de gdb, il me donnait ptrace: Operation not permitted

Solution : Sudo gdb ...

7
Maxim Chetrusca

Je voudrais ajouter que j'avais besoin de --security-opt apparmor=unconfined avec les options mentionnées par @wisbucky. C'était sur Ubuntu 18.04 (client Docker et hôte). Par conséquent, l'appel complet pour activer le débogage gdb dans un conteneur est le suivant:

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

4
Juraj Oršulić

Peut-être que quelqu'un a associé ce processus à gdb.

  • ps -ef | grep gdb

gdb ne peut pas joindre le même processus deux fois.

2
Raymond

Je ne sais pas ce que vous faites avec LD_PRELOAD ou votre fonction ptrace.

Pourquoi n'essayez-vous pas de joindre gdb à un programme très simple? Créez un programme qui affiche simplement de manière répétée Bonjour ou quelque chose de ce type et utilisez gdb --pid [bonjour programme PID] pour le joindre.

Si cela ne fonctionne pas, alors vous avez vraiment un problème.

Un autre problème est l'ID utilisateur. Le programme que vous suivez est-il défini sur un autre UID? Si c'est le cas, vous ne pouvez pas le ptracer sauf si vous utilisez le même ID utilisateur ou si vous êtes root.

0
Zan Lynx

J'ai fait face au même problème et j'ai essayé beaucoup de solutions, mais finalement, j'ai trouvé la solution, mais je ne sais vraiment pas quel était le problème. D'abord, j'ai modifié la valeur de ptrace_conf et je me suis connecté à Ubuntu en tant que root, mais le problème persiste. Mais la chose la plus étrange qui se soit produite est que la gdb m’a montré un message disant: 

Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user.
For more details, see /etc/sysctl.d/10-ptrace.conf warning: process 3767 is already traced by process 3755 ptrace: Operation not permitted.

Avec le terminal de commande ps, le processus 3755 n’était pas répertorié. 

J'ai trouvé le processus 3755 dans/proc/$ pid mais je ne comprends pas ce que c'était !!

Enfin, j'ai supprimé le fichier cible (foo.c) auquel je tente de joindre le programme vid gdb and tracer c à l'aide de PTRACE_ATTACH syscall et, dans l'autre dossier, j'ai créé un autre programme c et l'a compilé. 

le problème est résolu et j'ai été autorisé à me connecter à un autre processus, soit par gdb, soit par ptrace_attach syscall. 

(gdb) attach 4416

Attaching to process 4416

et j'envoie beaucoup de signaux pour traiter 4416. Je l'ai testé avec gdb et ptrace, les deux fonctionnent correctement. 

vraiment, je ne connais pas le problème, mais je pense que ce n'est pas un bogue dans Ubuntu, car beaucoup de sites l'ont mentionné, comme https://askubuntu.com/questions/143561/why-wont- strace-gdb-attach-to-a-process-meme-si-im-root

0
husin alhaj ahmade