Я понимаю, что мы, вероятно, не можем сделать ptrace для suid-бинарных файлов. Однако мне интересно, почему мы не можем сделать ptrace после того, как двоичный файл теряет свой приоритет до uid вместо euid.
Например, в двоичном файле suid двоичный файл теряет привилегии после некоторых шагов.
seteuid (euid);
ret_chdir = chdir (path);
seteuid (ruid);
system("whoami");
printf("Enter any char");
scanf("%c", &junk);
В моем случае, когда выводится "whoami", это имя пользователя процесса, но не его владелец. Когда программа ожидает ввода ненужных данных, я пытался подключиться к запущенному процессу с uid в качестве имени пользователя, но это не удалось, хотя двоичный файл отменил привилегию. Возможно ли, что ptrace attach использует состояние сохраненного uid, чтобы решить, что я не владелец?
решение1
Ваш пример кода не снижает привилегии! Он может свободно повышать привилегии снова, вызывая seteuid(euid)
. Если вы можете ptrace, то вы можете заставить его вызвать seteuid(euid)
и таким образом выполнить привилегированный код.
Вы спрашиваете это, потому что думали, ptrace
что это только для чтения? Нет, это не так: strace
это всего лишь одна вещь, которую вы можете с ним сделать; ptrace
позволяет трассировщику выполнять произвольный код в трассируемом, а не просто наблюдать. Нет никакого детального контроля доступа, который предоставляет доступ ptrace «только для чтения».
Но даже ptrace только для чтения опасен. Приложение с повышенными привилегиями может манипулировать конфиденциальными данными. Поэтому вы не можете ptrace для процесса, который был привилегированным, даже если он был удален из привилегий. Процесс должен вызвать, чтобы execve
удалить все следы того, что он был привилегированным.
решение2
Это кажется хорошей догадкой, учитывая возможность переключенияназад, что является известной областью, где могут возникнуть проблемы с безопасностью.
Дальнейшее чтение: