¿Por qué no se adjunta strace / gdb a un proceso aunque soy root?

26
  • Me conecté como root pero straceme da esto:

    root @ kyznecov-System: / home / kyznecov # ps -e | grep 111
     3807 pts / 2 00:00:00 111
     3810 pts / 2 00:00:00 111
    root @ kyznecov-System: / home / kyznecov # strace -p 3810
    
    adjuntar: ptrace (PTRACE_ATTACH, ...): Operación no permitida
    No se pudo adjuntar al proceso. Si su uid coincide con el uid del objetivo
    proceso, verifique la configuración de / proc / sys / kernel / yama / ptrace_scope, o intente
    de nuevo como usuario root. Para más detalles, vea /etc/sysctl.d/10-ptrace.conf
    root @ kyznecov-System: / inicio / kyznecov
    
    root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope
    0 0
  • Luego intenté usar gdbpara depurar un programa multiproceso en Eclipse CDT con bifurcación, y me dio el mismo resultado / error:

    ingrese la descripción de la imagen aquí

¿Algunas ideas?

andreykyz
fuente
Como ptrace_scope es cero, no debería importar, pero solo como experimento puede intentar un uso más simple de strace, donde el proceso de rastreo es el padre del proceso que se está rastreando. Por ejemplo strace /bin/echo test? ¿Eso da el mismo mensaje de error?
Jordan Uggla
@EliahKagan, en teoría, lo que OP describió no puede ocurrir en ausencia de un error del kernel. Si tiene algo de tiempo en las próximas 24 horas más o menos y puede convertir su comentario en una respuesta, eso sería genial: mis pruebas en Precise no han revelado problemas, y de esta manera sería una respuesta definitiva que hubo alguna peculiaridad. en la configuración del OP ... no ha vuelto desde su pregunta inicial el 29 de mayo.
ish
@EliahKagan, Una cosa me golpeó al releer el bit de "operación no permitida", porque lo he visto antes muchas veces cuando supuestamente estoy rooteando VPS / VM OpenVZ (comparten el núcleo de la máquina host, así que no , solo eres el rey de tu pequeña isla) ... tal vez este fue el caso? Ver esta pasta
ish
@izx Su pasta expiró. Y tengo este problema (dentro de un contenedor), cualquier idea sería buena
Kunal Tyagi

Respuestas:

25

Una razón para obtener el error:

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

es porque el proceso ya se ha unido a con gdb, straceo similar. Para verificar si este es el caso, ejecute:

grep TracerPid /proc/$THE_PID/status

Si no es cero, ese es el pid de un programa existente que ya está ejecutando un seguimiento en ese proceso.

Nathan Kidd
fuente
No nos damos cuenta de esto si estamos depurando en Eclipse ... que ya está usando GDB
ernesto
Gracias por señalar esto. Estaba ejecutando un programa a través de un contenedor de strace. El programa se bifurca y luego se ejecuta. El niño ejecutado muere rápidamente mientras ejecuta el contenedor de strace, que no se puede conectar porque el proceso padre ya está bajo el control de strace.
Rob Kennedy el
18

Como izx ha comentado, esto solo debería poder suceder debido a un error del kernel. Por lo tanto, cualquier persona que pueda producir este problema, incluido, y especialmente el póster original de esta pregunta, sería aconsejable informarlo como un error al leer esa página minuciosa y cuidadosamente, y luego ejecutarla ubuntu-bug linuxen la máquina afectada . Esto debería informarse linuxen Ubuntu, y no en un núcleo de línea principal (ascendente), a menos que pueda producirlo en un núcleo de línea principal (debería haber yamacargado).

El comportamiento esperado en cada versión de Ubuntu que comienza con Ubuntu 10.10 es que el proceso A no puede rastrear un proceso en ejecución B a menos que B sea un hijo directo de A (o A se ejecuta como root). Esta es una mejora de seguridad, lo que hace que un proceso que ha sido comprometido por un atacante no pueda usar las funciones de depuración proporcionadas por el núcleo para descubrir información de otros procesos. Esto se explica en la sección de alcance de ptrace de la página wiki de la comunidad de Características de seguridad .

Este comportamiento restrictivo es el predeterminado, pero se puede cambiar para permitir que un proceso A rastree cualquier proceso B en ejecución que se ejecute con el mismo ID de usuario que el propio proceso A. Es decir, puede configurar su sistema para permitir que cualquiera de sus procesos se depure entre sí. Esto simplifica la conexión de depuradores a procesos que ya se están ejecutando.

La configuración para esto está expuesta por el /proc/sys/kernel/yama/ptrace_scope sysctl . 1denota el comportamiento más restrictivo y 0el comportamiento menos restrictivo. La configuración se puede leer con:

cat /proc/sys/kernel/yama/ptrace_scope

El comportamiento menos restrictivo (no predeterminado) se puede establecer con:

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

Y el comportamiento más restrictivo (predeterminado) se puede establecer (o retrasar) con:

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

No solo el póster original de esta pregunta no pudo adjuntar una straceinstancia a un proceso actualmente en ejecución con ptrace-scopeset to 0, sino que el póster original aún no pudo hacerlo cuando se ejecutó stracecomo root. Es difícil ver cómo esto podría ser algo más que un error: recomiendo informarlo como tal.

Al principio, pensé que podía reproducir el problema donde una ptrace_scopeconfiguración de 0se ignora y se trata como si lo fuera 1. Pero ya no creo que este sea el caso, ya que he vuelto a hacer lo mismo y no puedo reproducir el problema. He probado esto en:

  • La máquina física Lubuntu Precise amd64 que uso a diario como mi caja principal.
  • Una máquina virtual VirtualBox que ejecuta un CD en vivo Lubuntu Precise i386 (12.04).
  • Una máquina virtual VirtualBox idéntica que ejecuta un Quantal i386 (Ubuntu + 1) diariamente en vivo (20120608).

En las tres máquinas, se produce el comportamiento esperado y no puedo reproducir la condición sobre la que pregunta el póster original de esta pregunta. Aquí hay un texto de la Terminal (del sistema en vivo 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 Seguí produciendo mensajes hasta que lo suspendí, como era de esperar.

Concluyo recomendando nuevamente informar esto como un error. Una búsqueda máximamente inclusiva en https://bugs.launchpad.net (que incluye cualquier error de Ubuntu reportado) para el texto ptrace_scopeproduce solo un puñado de resultados, en los que claramente ninguno es un informe de este error . Informar el error ayudaría a otros, puede dar lugar a soluciones o una solución, y es probablemente la única forma significativa de avanzar en el trabajo de este problema (suponiendo que el problema aún esté ocurriendo).

Eliah Kagan
fuente
Gracias por la sugerencia, lo voy a leer en detalle mañana y tal vez añadir algunos subtítulos, pero creo que esto es extremadamente cuidadosa :)
ish
en mi publicación puedes ver: root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 Lo hice: echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz
En concole todo funciona fácilmente. Pero si ejecuté el programa en eclipse y probé strace desde la consola, recibí dicho problema.
andreykyz
2
puede ser un efecto secundario del proceso que ya se está rastreando? Tuve el mismo problema cuando utilicé gdb en el proceso padre con el modo hijo de fork permitido
Jamie Pate
2
También tengo este error el 14.04. ¿Alguien sabe si alguna vez se notificó un error?
detly