Предположим, мы смотрим на следующий сценарий:
Файл saymyname.c (включая пропущенные)
int main(int argc, char** argv){
system("whoami");
}
Сборка и установка битов прав доступа:
cake@lie> gcc saymyname.c -o saymyname
cake@lie> sudo chown root:root saymyname
cake@lie> sudo chmod u+s saymyname
cake@lie> ./saymyname
cake
Каждый ресурс под солнцем говорит мне, что установка разрешения s
для столбца пользователя должна запускать программу с привилегиями владельца, а не вызывающего пользователя.Почему system("whoami");
возвращает cake
?
Изменение программы для установки UID вручную следующим образом:
int main(int argc, char** argv){
setuid(geteuid());
system("whoami");
}
Дает ожидаемый результат
cake@lie> ./saymyname
root
Некоторыересурсы утверждают, что биты SUID и GUID часто игнорируются.Поэтому происходит наблюдаемое поведение?Если так, есть ли способ заставить его вести себя так, как будто он был выполнен пользователем root без setuid(.)
?