Может ли gdb отлаживать программы suid root?

16

Я написал программу, которая вызывает setuid(0)и execve("/bin/bash",NULL,NULL).

Тогда я сделал chown root:root a.out && chmod +s a.out

Когда я выполняю, ./a.outя получаю корневую оболочку. Однако, когда я это делаю, gdb a.outон запускает процесс как обычный пользователь и запускает пользовательскую оболочку.

Итак ... могу ли я отладить программу root для setuid?

jyz
источник

Ответы:

22

Отладку программы setuid или setgid можно выполнять только в том случае, если отладчик работает от имени пользователя root. Ядро не позволит вам вызвать ptraceпрограмму с дополнительными привилегиями. Если это произойдет, вы сможете заставить программу выполнять что угодно, что фактически означает, что вы можете, например, запустить корневую оболочку, вызвав отладчик на/bin/su .

Если вы запустите Gdb от имени пользователя root, вы сможете запустить свою программу, но вы будете наблюдать ее поведение только при запуске от имени пользователя root.

Если вам нужно отладить программу, когда она не запущена пользователем root, запустите программу за пределами Gdb, сделайте некоторую паузу перед тем, как перейти к проблемной части, и attachпроцессу внутри Gdb ( at 1234где 1234 - идентификатор процесса).

Жиль "ТАК - перестань быть злым"
источник
Да, я пытался это сделать, но процесс запускается с правами root, и GDB должен быть запущен с правами root, чтобы иметь возможность присоединить процесс root.
Jyz
@jyzuz Да, когда я пишу, вы должны запустить GDB от имени пользователя root. Или, если хотите, вы можете использовать удаленную отладку, запускать gdbserverот имени пользователя root и подключаться к нему как обычный пользователь. Из вашего комментария кажется, что вам не удалось сделать это простым способом (запустить gdb от имени root), но я не понимаю, что пошло не так, поэтому я не могу помочь.
Жиль "ТАК - перестань быть злым"
7

Вот способ запустить процесс в остановленном состоянии, если хотите. Используйте скрипт bash, выполнив:

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

Заставьте это бежать в фоновом режиме.

Тогда начни gdb и прикрепите к пиду, который был напечатан.

Вам нужно будет выполнить execкоманду с помощью gdb, но вы сможете отлаживать с самого начала.

Лионель
источник