Perché strace / gdb non si attaccherà a un processo anche se sono root?


26
  • Ho effettuato l'accesso come root ma stracemi dà questo:

    root @ kyznecov-System: / home / kyznecov # ps -e | grep 111
     3807 punti / 2 00:00:00 111
     3810 punti / 2 00:00:00 111
    root @ kyznecov-System: / home / kyznecov # strace -p 3810
    
    attach: ptrace (PTRACE_ATTACH, ...): operazione non consentita
    Impossibile collegarsi al processo. Se il tuo uid corrisponde a quello del target
    processo, controlla l'impostazione di / proc / sys / kernel / yama / ptrace_scope o prova
    di nuovo come utente root. Per maggiori dettagli, consultare /etc/sysctl.d/10-ptrace.conf
    root @ kyznecov-System: / home / kyznecov
    
    root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope
    0
  • Ho quindi provato a utilizzare gdbper eseguire il debug di un programma multiprocesso in Eclipse CDT con il fork e mi ha dato lo stesso risultato / errore:

    inserisci qui la descrizione dell'immagine

Qualche idea?


Poiché ptrace_scope è zero, non dovrebbe importare, ma proprio come un esperimento puoi provare un uso più semplice di strace, in cui il processo di tracciamento è il genitore del processo da tracciare. Ad esempio strace /bin/echo test? Questo dà lo stesso messaggio di errore?
— Jordan Uggla,

@EliahKagan, in teoria ciò che OP ha descritto non può avvenire in assenza di un bug del kernel. Se hai un po 'di tempo nelle prossime 24 ore e puoi trasformare il tuo commento in una risposta, sarebbe fantastico - i miei test su Precise non hanno rivelato alcun problema, e in questo modo sarebbe una risposta definitiva che c'era qualche stranezza nella configurazione del PO ... non è tornato dalla sua domanda iniziale il 29 maggio.
— Ish,

@EliahKagan, Una cosa mi ha colpito nel rileggere il bit "operazione non consentita" - perché l'ho visto molte volte quando sono apparentemente root su VPS / VM OpenVZ (condividono il kernel della macchina host, quindi no , sei solo il re della tua piccola isola) ... forse è stato così? Guarda questa pasta
— ish,

@izx La tua pasta è scaduta. E ho questo problema (all'interno di un container), qualsiasi intuizione sarebbe buona
— Kunal Tyagi

Risposte:


25

Un motivo per ottenere l'errore:

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

è perché il processo è già stato attaccato con gdb, straceo simili. Per verificare se questo è il caso, eseguire:

grep TracerPid /proc/$THE_PID/status

Se è diverso da zero, questo è il pid di un programma esistente che sta già eseguendo una traccia su quel processo.


Non lo notiamo se stiamo eseguendo il debug in Eclipse ... che già utilizza GDB
— Ernesto

Grazie per averlo segnalato. Stavo eseguendo un programma attraverso un wrapper di strace. Il programma esegue il fork e quindi si esegue automaticamente. Il bambino distrutto muore rapidamente mentre esegue il wrapper di strace, che non riesce ad attaccarsi perché il processo genitore è già sotto il controllo di strace.
— Rob Kennedy,

18

Come ha commentato izx , questo dovrebbe essere possibile solo a causa di un bug del kernel. Pertanto, chiunque sia attualmente in grado di produrre questo problema, incluso e in particolare il poster originale di questa domanda, sarebbe ben consigliato di segnalarlo come un bug leggendo quella pagina in modo accurato e accurato e quindi eseguendolo ubuntu-bug linuxsul computer interessato . Questo dovrebbe essere segnalato contro linuxUbuntu, e non contro un kernel mainline (upstream), a meno che tu non possa produrlo su un kernel mainline (dovresti averlo yamacaricato).

Il comportamento previsto in ogni versione di Ubuntu che inizia con Ubuntu 10.10 è che il processo A non può tracciare un processo in esecuzione B a meno che B non sia un figlio diretto di A (o A gira come root). Questo è un miglioramento della sicurezza, che rende tale che un processo che è stato compromesso da un utente malintenzionato non può utilizzare le funzionalità di debug fornite dal kernel per scoprire informazioni da altri processi. Questo è spiegato nella sezione dell'ambito ptrace della pagina wiki della comunità Funzionalità di sicurezza .

Questo comportamento restrittivo è l'impostazione predefinita, ma può essere modificato per consentire a un processo A di tracciare qualsiasi processo in esecuzione B eseguito con lo stesso ID utente del processo A. Cioè, è possibile configurare il sistema in modo da consentire il debug reciproco di tutti i processi. Ciò semplifica il collegamento dei debugger ai processi già in esecuzione.

L'impostazione per questo è esposta da /proc/sys/kernel/yama/ptrace_scope sysctl . 1indica il comportamento più restrittivo e 0il comportamento meno restrittivo. L'impostazione può essere letta con:

cat /proc/sys/kernel/yama/ptrace_scope

Il comportamento meno restrittivo (non predefinito) può essere impostato con:

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

E il comportamento più restrittivo (predefinito) può essere impostato (o ripristinato) con:

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

Non solo il poster originale di questa domanda non è stato in grado di allegare straceun'istanza a un processo attualmente in esecuzione con ptrace-scopeset su 0, ma il poster originale non è stato ancora in grado di farlo durante l'esecuzione stracecome root. È difficile capire come questo possa essere tutt'altro che un bug - consiglio vivamente di segnalarlo come tale.

All'inizio, avevo pensato di essere in grado di riprodurre il problema in cui ptrace_scopeun'impostazione di 0viene ignorata e trattata come se fosse 1. Ma non credo più che sia così, poiché ho ripetuto tutte le stesse cose e non riesco a riprodurre il problema. Ho provato questo su:

  • La macchina fisica Lubuntu Precise amd64 che uso quotidianamente come scatola principale.
  • Una macchina virtuale VirtualBox che esegue un CD live Lubuntu Precise i386 (12.04).
  • Una macchina virtuale VirtualBox identica che esegue un Quantal i386 (Ubuntu + 1) daily-live (20120608).

Su tutte e tre le macchine, si verifica il comportamento previsto e non riesco a riprodurre la condizione richiesta dal poster originale di questa domanda. Ecco un po 'di testo dal Terminale (dal sistema live Precise):

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 ha continuato a produrre messaggi fino a quando non l'ho sospeso, come previsto.

Concludo raccomandando di nuovo di segnalarlo come un bug. Una ricerca al massimo inclusiva su https://bugs.launchpad.net (che include tutti i bug di Ubuntu segnalati) per il testo ptrace_scopeproduce solo una manciata di risultati, in cui chiaramente non ci sono segnalazioni per questo errore . Segnalare il bug aiuterebbe gli altri, potrebbe portare a soluzioni alternative o una correzione ed è probabilmente l'unico modo significativo per procedere in avanti su questo problema (supponendo che il problema si stia ancora verificando).


Grazie per il suggerimento, lo leggerò in dettaglio domani e forse aggiungerò alcuni sottotitoli, ma penso che questo sia estremamente accurato :)
— ish,

nel mio post puoi vedere: root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 L'ho fatto: echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
— andreykyz

In concole tutto funziona facilmente. Ma se avessi eseguito il programma in eclipse e provassi la sequenza dalla console, avrei ricevuto questo problema.
— andreykyz,

2
potrebbe essere un effetto collaterale del processo già rintracciato? Ho avuto lo stesso problema quando ho usato gdb sul processo genitore con child in modalità allow-fork
— Jamie Pate,

2
Ricevo anche questo bug il 14.04. Qualcuno sa se è mai stato segnalato un bug per questo?
— detly
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.