Wie löst man „Ptrace-Operation nicht erlaubt“ beim Versuch, GDB an einen Prozess anzuhängen?

Lesezeit: 5 Minuten

Benutzeravatar von bbaytemir
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?

Benutzeravatar von wisbucky
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

Benutzeravatar von jesup
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

Siehe auch diesen Artikel darüber in Fedora 22 (mit Links zur Dokumentation) und diesen Kommentarthread über Ubuntu und .

  • 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

Benutzeravatar von Juraj Oršulić
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

  • Damit ist die Frage nicht beantwortet. Sobald Sie über einen ausreichenden Ruf verfügen, können Sie jeden Beitrag kommentieren. stattdessen, Geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern. – Aus Bewertung

    – Raffael

    7. Oktober 2018 um 5:34 Uhr

  • @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 ...

Benutzeravatar von Nagev
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:

       securityContext:
          capabilities:
            add: [ "SYS_PTRACE" ]

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 :

      securityContext:
        runAsUser: 0
        runAsGroup: 0
        fsGroup: 101

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.

Benutzeravatar von SufAB
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.

1422710cookie-checkWie löst man „Ptrace-Operation nicht erlaubt“ beim Versuch, GDB an einen Prozess anzuhängen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy