Gdb peut-il déboguer des programmes root suid?

16

J'ai écrit un programme qui appelle setuid(0)et execve("/bin/bash",NULL,NULL).

Alors j'ai fait chown root:root a.out && chmod +s a.out

Lorsque j'exécute, ./a.outj'obtiens un shell racine. Cependant, lorsque je le fais, gdb a.outil démarre le processus en tant qu'utilisateur normal et lance un shell utilisateur.

Alors ... puis-je déboguer un programme racine setuid?

jyz
la source

Réponses:

22

Vous ne pouvez déboguer un programme setuid ou setgid que si le débogueur s'exécute en tant que root. Le noyau ne vous permettra pas d'appeler ptraceun programme fonctionnant avec des privilèges supplémentaires. Si c'était le cas, vous seriez en mesure de faire exécuter n'importe quoi au programme, ce qui signifierait en fait que vous pourriez par exemple exécuter un shell root en appelant un débogueur /bin/su.

Si vous exécutez Gdb en tant que root, vous pourrez exécuter votre programme, mais vous observerez uniquement son comportement lorsqu'il est exécuté par root.

Si vous devez déboguer le programme lorsqu'il n'est pas démarré par root, démarrez le programme en dehors de Gdb, faites-le faire une pause d'une certaine manière avant de passer à la partie gênante et attachau processus à l'intérieur de Gdb ( at 1234où 1234 est l'ID de processus).

Gilles 'SO- arrête d'être méchant'
la source
Oui, j'ai essayé, mais le processus est démarré en tant que root, et gdb doit également être démarré en tant que root pour pouvoir attacher le processus de root.
jyz
@jyzuz Oui, au moment où j'écris, vous devez démarrer gdb en tant que root. Ou si vous le souhaitez, vous pouvez utiliser le débogage à distance et l'exécuter en gdbservertant que root et vous y connecter en tant qu'utilisateur normal. D'après votre commentaire, il semble que vous n'ayez pas réussi à le faire de la manière la plus simple (en exécutant gdb en tant que root) mais je ne comprends pas ce qui s'est mal passé, donc je ne peux pas m'empêcher.
Gilles 'SO- arrête d'être méchant'
7

Voici un moyen de démarrer le processus dans un état arrêté si vous le souhaitez. Utilisez un script bash en faisant:

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

Faites cela en arrière-plan.

Commencez ensuite gdbet attachez-le au pid qui a été imprimé.

Vous devrez parcourir la execcommande avec gdb, mais vous pourrez déboguer dès le début.

Lionel
la source