O gdb pode depurar programas root suid?

16

Eu escrevi um programa que chama setuid(0)e execve("/bin/bash",NULL,NULL).

Então eu fiz chown root:root a.out && chmod +s a.out

Quando executo ./a.out, recebo um shell raiz. No entanto, quando faço gdb a.outisso, inicia o processo como usuário normal e inicia um shell de usuário.

Então ... posso depurar um programa raiz setuid?

jyz
fonte

Respostas:

22

Você pode depurar apenas um programa setuid ou setgid se o depurador estiver sendo executado como root. O kernel não permite que você acesse ptraceum programa em execução com privilégios extras. Se isso acontecesse, você seria capaz de fazer o programa executar qualquer coisa, o que efetivamente significaria que você poderia, por exemplo, executar um shell raiz chamando um depurador /bin/su.

Se você executar o Gdb como root, poderá executar o seu programa, mas só estará observando o comportamento dele quando executado pelo root.

Se você precisar depurar o programa quando ele não for iniciado pela raiz, inicie o programa fora do Gdb, faça uma pausa de alguma maneira antes de chegar à parte problemática e attachao processo dentro do Gdb ( at 1234onde 1234 é o ID do processo).

Gilles 'SO- parar de ser mau'
fonte
Sim, eu tentei isso, mas o processo é iniciado como raiz, e o gdb deve ser iniciado como raiz também para poder anexar o processo da raiz.
JYZ
@ jyzuz Sim, enquanto escrevo, você deve iniciar o gdb como root. Ou, se desejar, você pode usar a depuração remota e executar gdbservercomo root e conectar-se a ele como um usuário normal. Pelo seu comentário, parece que você não conseguiu fazê-lo da maneira mais simples (executando o gdb como root), mas eu não entendo o que deu errado, por isso não posso ajudar.
Gilles 'SO- stop be evil'
7

Aqui está uma maneira de iniciar o processo em um estado parado, se você desejar. Use um script bash fazendo:

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

Faça essa execução em segundo plano.

Em seguida, começar gdb, e anexar ao pid que foi impresso.

Você precisará percorrer o execcomando com gdb, mas poderá depurar desde o início.

Lionel
fonte