Warum hängt strace / gdb nicht an einem Prozess, obwohl ich root bin?

26
  • Ich habe stracemich als root angemeldet, aber dies gibt mir:

    root @ kyznecov-System: / home / kyznecov # ps -e | grep 111
     3807 Punkte / 2 00:00:00 111
     3810 Punkte / 2 00:00:00 111
    root @ kyznecov-System: / home / kyznecov # strace -p 3810
    
    attach: ptrace (PTRACE_ATTACH, ...): Operation nicht erlaubt
    Konnte nicht an den Prozess anhängen. Wenn Ihre UID mit der UID des Ziels übereinstimmt
    Überprüfen Sie die Einstellung von / proc / sys / kernel / yama / ptrace_scope oder versuchen Sie es
    wieder als root-benutzer. Weitere Informationen finden Sie unter /etc/sysctl.d/10-ptrace.conf
    root @ kyznecov-System: / home / kyznecov
    
    root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope
    0
  • Ich habe dann versucht, gdbein Mehrprozessprogramm in Eclipse CDT mit Forking zu debuggen, und es gab mir das gleiche Ergebnis / den gleichen Fehler:

    Bildbeschreibung hier eingeben

Irgendwelche Ideen?

andreykyz
quelle
Da ptrace_scope Null ist, sollte es keine Rolle spielen, aber genau wie bei einem Experiment können Sie eine einfachere Verwendung von strace versuchen, bei der der Ablaufverfolgungsprozess der übergeordnete Prozess des zu verfolgenden Prozesses ist. ZB strace /bin/echo test? Gibt das die gleiche Fehlermeldung aus?
Jordan Uggla
@EliahKagan, in der Theorie kann das, was OP beschrieben hat, ohne einen Kernel-Fehler nicht auftreten. Wenn Sie in den nächsten 24 Stunden etwas Zeit haben und Ihren Kommentar in eine Antwort umwandeln können, wäre das großartig - meine Prüfung auf Precise hat keine Probleme ergeben, und auf diese Weise wäre es eine endgültige Antwort, dass es eine Eigenart gab in der OP-Konfiguration ... er war seit seiner ersten Frage am 29. Mai
ish
@EliahKagan, Eines ist mir beim erneuten Lesen des "Vorgang nicht zulässig" -Bits aufgefallen - weil ich es schon unzählige Male gesehen habe, als ich angeblich auf OpenVZ VPS / VMs root war (sie nutzen den Kernel des Hostcomputers gemeinsam, also nein , du bist nur der König deiner eigenen kleinen Insel) ... vielleicht war das der Fall? Sehen Sie diese Paste
ish
@izx Deine Paste ist abgelaufen. Und ich habe dieses Problem (in einem Container), jeder Einblick wäre nett
Kunal Tyagi

Antworten:

25

Ein Grund für den Fehler:

attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

Denn hat der Prozess bereits mit angebracht wurde gdb, straceoder ähnliches. Um zu überprüfen, ob dies der Fall ist, führen Sie Folgendes aus:

grep TracerPid /proc/$THE_PID/status

Wenn es nicht Null ist, ist dies die PID eines vorhandenen Programms, in dem bereits eine Ablaufverfolgung für diesen Prozess ausgeführt wird.

Nathan Kidd
quelle
Wir bemerken dies nicht, wenn wir in Eclipse debuggen ... das bereits GDB verwendet
ernesto
Vielen Dank für den Hinweis. Ich habe ein Programm über einen Strace Wrapper ausgeführt. Das Programm gabelt sich und führt sich dann selbst aus. Das execkte Kind stirbt schnell, wenn es den Strace-Wrapper ausführt, der nicht angehängt werden kann, da der übergeordnete Prozess bereits von Strace gesteuert wird.
Rob Kennedy
18

Wie izx kommentiert hat, sollte dies nur aufgrund eines Kernel-Fehlers möglich sein. Also jeder, der dieses Problem zur Zeit produzieren kann - auch und vor allem das ursprüngliche Plakat dieser Frage - wäre gut beraten, es als Fehler zu melden , indem die Seite gründlich und sorgfältig, Lesen und dann läuft ubuntu-bug linuxauf der betroffenen Maschine . Dies sollte linuxin Ubuntu und nicht in einem Haupt- (Upstream-) Kernel gemeldet werden , es sei denn, Sie können es auf einem Haupt-Kernel erstellen (Sie müssten ihn yamageladen haben).

Das erwartete Verhalten in jeder Ubuntu-Version ab Ubuntu 10.10 ist, dass Prozess A einen laufenden Prozess B nicht verfolgen kann, es sei denn, B ist ein direktes Kind von A (oder A wird ausgeführt als root). Dies ist eine Sicherheitsverbesserung, die dazu führt, dass ein Prozess, der von einem Angreifer kompromittiert wurde, die vom Kernel bereitgestellten Debug-Funktionen nicht zum Ermitteln von Informationen aus anderen Prozessen verwenden kann. Dies wird im Abschnitt ptrace scope auf der Wiki-Seite der Community für Sicherheitsfunktionen erläutert .

Dieses restriktive Verhalten ist die Standardeinstellung, kann jedoch geändert werden, damit ein Prozess A jeden laufenden Prozess B verfolgen kann, der mit derselben Benutzer-ID wie der Prozess A ausgeführt wird. Das heißt, Sie können Ihr System so konfigurieren, dass sich alle Prozesse gegenseitig debuggen können. Dies vereinfacht das Anhängen von Debuggern an bereits laufende Prozesse.

Die Einstellung hierfür wird vom /proc/sys/kernel/yama/ptrace_scope sysctl eingeblendet . 1bezeichnet das restriktivere und 0das weniger restriktive Verhalten. Die Einstellung kann gelesen werden mit:

cat /proc/sys/kernel/yama/ptrace_scope

Das weniger restriktive (nicht standardmäßige) Verhalten kann eingestellt werden mit:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Und das restriktivere (Standard-) Verhalten kann eingestellt (oder zurückgesetzt) ​​werden mit:

echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Das Original-Poster dieser Frage war nicht nur nicht in der Lage, eine straceInstanz an einen derzeit ausgeführten Prozess anzuhängen, der auf ptrace-scopegesetzt war 0, sondern das Original-Poster war auch dann nicht in der Lage, dies zu tun, wenn es straceals ausgeführt wurde root. Es ist schwer zu erkennen, dass dies alles andere als ein Fehler sein kann. Ich empfehle dringend, ihn als einen Fehler zu melden.

Zuerst hatte ich gedacht, dass ich das Problem reproduzieren kann, bei dem eine ptrace_scopeEinstellung von 0ignoriert und so behandelt wird, als wäre es 1. Aber ich glaube nicht mehr, dass dies der Fall ist, da ich wieder die gleichen Dinge getan habe und das Problem nicht reproduzieren kann. Ich habe das getestet auf:

  • Die physische Maschine Lubuntu Precise amd64 verwende ich täglich als meine Hauptbox.
  • Eine virtuelle VirtualBox-Maschine, auf der eine Live-CD mit Lubuntu Precise i386 (12.04) ausgeführt wird.
  • Eine identische virtuelle VirtualBox-Maschine, auf der Quantal i386 (Ubuntu + 1) täglich live (20120608) ausgeführt wird.

Auf allen drei Computern tritt das erwartete Verhalten auf, und ich kann den Zustand nicht reproduzieren, zu dem das ursprüngliche Poster dieser Frage auffordert. Hier ist ein Text aus dem Terminal (aus dem Precise Live-System):

lubuntu@lubuntu:~$ nano&
[1] 3492
lubuntu@lubuntu:~$ strace -p 3492
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
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

[1]+  Stopped                 nano
lubuntu@lubuntu:~$ cat /proc/sys/kernel/yama/ptrace_scope
1
lubuntu@lubuntu:~$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
0
lubuntu@lubuntu:~$ strace -p 3492
Process 3492 attached - interrupt to quit
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---

strace produzierte weiterhin Nachrichten, bis ich sie erwartungsgemäß suspendierte.

Abschließend empfehle ich noch einmal, dies als Fehler zu melden. Eine maximal inklusive Suche auf https://bugs.launchpad.net (die alle gemeldeten Ubuntu-Fehler enthält) nach dem Text ptrace_scopeergibt nur eine Handvoll Ergebnisse, in denen eindeutig keine Berichte für diesen Fehler vorliegen . Das Melden des Fehlers würde anderen helfen, kann zu Problemumgehungen oder einer Fehlerbehebung führen und ist wahrscheinlich die einzige sinnvolle Möglichkeit, dieses Problem zu beheben (vorausgesetzt, das Problem tritt weiterhin auf).

Eliah Kagan
quelle
Vielen Dank für den Vorschlag, ich werde ihn morgen ausführlich lesen und vielleicht einige Unterüberschriften hinzufügen, aber ich denke, das ist extrem gründlich :)
ish
In meinem Beitrag sehen Sie: root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 Ich habe es geschafft: echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz
In concole arbeiten alle leicht. Aber wenn ich ein Programm in Eclipse laufen lasse und es von der Konsole aus versuche, bekomme ich das besagte Problem.
Andreykyz
2
kann eine Nebenwirkung des Prozesses sein, der bereits verfolgt wird? Ich hatte das gleiche Problem, als ich gdb für den übergeordneten Prozess mit dem Kind im Erlaubnis-Gabel-Modus verwendete
Jamie Pate,
2
Ich bekomme diesen Bug auch am 14.04. Weiß jemand, ob jemals ein Fehler gemeldet wurde?
Detly