¿Puede gdb depurar programas raíz suidos?

16

Escribí un programa que llama setuid(0)y execve("/bin/bash",NULL,NULL).

Entonces lo hice chown root:root a.out && chmod +s a.out

Cuando ejecuto ./a.outme sale un shell de root. Sin embargo, cuando lo hago gdb a.out, comienza el proceso como usuario normal y lanza un shell de usuario.

Entonces ... ¿puedo depurar un programa raíz setuid?

jyz
fuente

Respuestas:

22

Solo puede depurar un programa setuid o setgid si el depurador se ejecuta como root. El kernel no le permitirá llamar ptracea un programa que se ejecute con privilegios adicionales. Si lo hiciera, sería capaz de hacer que el programa ejecutara cualquier cosa, lo que significaría que podría, por ejemplo, ejecutar un shell de raíz llamando a un depurador /bin/su.

Si ejecuta Gdb como root, podrá ejecutar su programa, pero solo observará su comportamiento cuando lo ejecute root.

Si necesita depurar el programa cuando no está iniciado por root, inicie el programa fuera de Gdb, haga una pausa de alguna manera antes de llegar a la parte problemática y attachel proceso dentro de Gdb ( at 1234donde 1234 es la ID del proceso).

Gilles 'SO- deja de ser malvado'
fuente
Sí, lo intenté, pero el proceso se inicia como root, y gdb también debe iniciarse como root para poder adjuntar el proceso de root.
jyz 01 de
@jyzuz Sí, mientras escribo tienes que iniciar gdb como root. O, si lo desea, puede usar la depuración remota y ejecutarla gdbservercomo root y conectarse a ella como un usuario normal. Según su comentario, parece que no logró hacerlo de la manera simple (ejecutando gdb como root) pero no entiendo qué salió mal, por lo que no puedo evitarlo.
Gilles 'SO- deja de ser malvado'
7

Aquí hay una manera de iniciar el proceso en un estado detenido si lo desea. Use un script bash haciendo:

echo $BASHPID; kill -STOP $BASHPID; exec sudo -u unpriviledged_user -g the_group_if_not_primary command

Haz que se ejecute en segundo plano.

Entonces empezar gdb y adjunte al pid que se imprimió.

Tendrá que pasar por el execcomando con gdb, pero podrá depurar desde el principio.

Lionel
fuente