Wie löst man „Ptrace-Operation nicht erlaubt“ beim Versuch, GDB an einen Prozess anzuhängen?
Lesezeit: 5 Minuten
bbaytemir
Ich versuche, ein Programm mit gdb anzuhängen, aber es gibt Folgendes zurück:
Wird an Prozess 29139 angehängt
Konnte nicht an Prozess angehängt werden. Wenn Ihre UID mit der UID des Zielprozesses übereinstimmt, überprüfen Sie die Einstellung von /proc/sys/kernel/yama/ptrace_scope oder versuchen Sie es erneut als Root-Benutzer. Weitere Einzelheiten finden Sie unter /etc/sysctl.d/10-ptrace.conf
ptrace: Operation nicht erlaubt.
gdb-debugger gibt zurück „Fehler beim Anhängen an den Prozess, bitte überprüfen Sie die Berechtigungen und versuchen Sie es erneut.“
strace gibt “attach: ptrace(PTRACE_ATTACH, …): Vorgang nicht erlaubt” zurück
Ich habe “kernel.yama.ptrace_scope” von 1 auf 0 geändert und /proc/sys/kernel/yama/ptrace_scope 1 zu 0 und probiert set environment LD_PRELOAD=./ptrace.so mit diesem:
#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;
}
Aber es gibt immer noch den gleichen Fehler zurück. Wie kann ich es an Debugger anhängen?
wisbucky
Wenn Sie Docker verwenden, benötigen Sie wahrscheinlich diese Optionen:
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
Wenn Sie Podman verwenden, werden Sie es wahrscheinlich brauchen --cap-add Möglichkeit auch:
podman run --cap-add=SYS_PTRACE
Auch wenn in der Frage Docker nicht erwähnt wurde, bin ich deswegen hierher gekommen. Dies hat sich für mich gelöst und ich danke Ihnen, dass Sie über die Frage hinausgegangen sind.
– Dauerläufer
13. März 2018 um 17:31 Uhr
Dies funktionierte bei mir mit GCC 8.2 und GDB 8.1 in Docker
– ThetaSinner
29. Juli 2018 um 18:27 Uhr
Wie kann ich dies tun, wenn ich Docker Build anstelle von Run mache? es scheint diese Argumente nicht zu nehmen? (Ich habe einen seltsamen Fehler, der nur bei Verwendung des Dockerfiles auftritt)
– fersarr
4. Oktober 2018 um 10:31 Uhr
In docker-compose.yml musste ich nur hinzufügen cap_add: - SYS_PTRACE (mit neuer Zeile nach dem Doppelpunkt) in meiner Containerspezifikation.
– Rafal G.
4. Februar 2020 um 9:16 Uhr
In neueren Docker-Versionen 18+, --security-opt seccomp=unconfined wird nicht mehr benötigt.
– B.Z
24. September 2020 um 15:58 Uhr
Jesus
Dies liegt an der Kernelhärtung in Linux; Sie können dieses Verhalten deaktivieren, indem Sie echo 0 > /proc/sys/kernel/yama/ptrace_scope oder indem Sie es ändern /etc/sysctl.d/10-ptrace.conf
das echo ... hat in meinem Fall nur funktioniert, wenn ich zuerst mit eine Root-Konsole geöffnet habe sudo -i (sudo echo ... funktionierte aufgrund des Umleitungssymbols nicht)
– R Yoda
24. Juni 2018 um 12:54 Uhr
Einige Shell-Konstrukte sind schwierig in Argumenten für Befehle wie sudo zu verwenden.
– Jesus
13. Juli 2018 um 11:01 Uhr
Bei Verwendung von sudo und Umleitung können Sie verwenden echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
– Daniel Serodio
19. September 2018 um 19:28 Uhr
Die Kommentare auf dieser Seite sind besser als die meisten Antworten.
– doug65536
17. Juli 2021 um 23:17 Uhr
Oder mit sudo bash -c "echo 0 > /proc/sys/kernel/yama/ptrace_scope"
– Navarrothiago
30. August 2021 um 23:41 Uhr
Juraj Oršulić
Ich möchte hinzufügen, dass ich brauchte --security-opt apparmor=unconfined zusammen mit den Optionen, die @wisbucky erwähnt hat. Dies war auf Ubuntu 18.04 (sowohl Docker-Client als auch Host). Daher lautet der vollständige Aufruf zum Aktivieren des gdb-Debuggings in einem Container:
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined
@Rafael die Antwort wurde mit der vollständigen Befehlszeile aktualisiert. Es liefert jetzt eine völlig in sich geschlossene Antwort auf die Frage.
– Juraj Oršulić
17. Oktober 2018 um 10:26 Uhr
Ich habe den obigen Anwendungsfall nicht wirklich angesprochen, aber ich hatte dieses Problem:
Problem: Es ist passiert, dass ich mein Programm mit gestartet habe sudoalso gab es mir beim Starten von gdb ptrace: Operation not permitted.
Lösung: sudo gdb ...
Nagev
Ich möchte nur einen Zusammenhang betonen Antworten. Nehmen wir an, Sie sind root und Sie haben Folgendes getan:
strace -p 700
und bekomme:
strace: attach: ptrace(PTRACE_SEIZE, 700): Operation not permitted
Prüfen:
grep TracerPid /proc/700/status
Wenn Sie so etwas sehen TracerPid: 12dh nicht 0das ist die PID des Programms, das bereits die verwendet ptrace Systemaufruf. Beide gdb und strace verwenden, und es kann immer nur einer aktiv sein.
Da die meisten von uns wegen Docker-Problemen hier landen, füge ich die hinzu Kubernetes antworten, da es für jemanden nützlich sein könnte …
Sie müssen die hinzufügen SYS_PTRACE -Fähigkeit im Sicherheitskontext Ihres Pods unter spec.containers.securityContext:
Da sind 2 securityContext Schlüssel an 2 verschiedenen Stellen. Wenn es Ihnen sagt, dass der Schlüssel nicht erkannt wird, dann haben Sie ihn verlegt. Probieren Sie das andere aus.
Sie müssen wahrscheinlich auch einen Root-Benutzer als Standard haben. Also im anderen Sicherheitskontext (spec.securityContext) hinzufügen :
FYI: 0 ist Wurzel. Aber der fsGroup-Wert ist mir unbekannt. Was ich tue, ist mir egal, aber dir vielleicht.
Jetzt können Sie tun:
strace -s 100000 -e write=1 -e trace=write -p 16
Ihnen wird die Erlaubnis nicht mehr verweigert!
ACHTUNG: Dies ist die Büchse der Pandora. Dies in der Produktion zu haben, wird NICHT empfohlen.
SufAB
Ich habe meinen Code mit höheren Privilegien ausgeführt, um mit Ethernet Raw Sockets umzugehen, indem ich den Befehl set Capability in der Debian-Distribution festgelegt habe. Ich habe die obige Lösung versucht: echo 0 > /proc/sys/kernel/yama/ptrace_scope
oder indem Sie es ändern /etc/sysctl.d/10-ptrace.conf aber das hat bei mir nicht funktioniert.
Zusätzlich habe ich es auch mit dem Befehl set Capabilities für gdb im installierten Verzeichnis (usr/bin/gdb) versucht und es funktioniert: /sbin/setcap CAP_SYS_PTRACE=+eip /usr/bin/gdb. Stellen Sie sicher, dass Sie diesen Befehl mit Root-Rechten ausführen.
14227100cookie-checkWie löst man „Ptrace-Operation nicht erlaubt“ beim Versuch, GDB an einen Prozess anzuhängen?yes