Я предполагаю, что исполняемый файл с установленным битом SetUID должен быть запущен как его владелец, но я не могу воспроизвести его. Я попробовал следующее.
$ cat prepare.sh cp / bin / bash. chown root.root bash chmod 4770 bash # Проверено $ sudo sh prepare.sh $ ./bash $ id -u 1000 $ выход $
$ cat test.c #include <stdio.h> #include <unistd.h> int main () { printf ("% d,% d \ n", getuid (), geteuid ()); вернуть 0; } $ gcc -o test test.c $ chmod 4770 test # Проверено $ sudo chown root.root test $ ./test 1000,1000 $ # Почему ???
Однако
$ su # ./bash # id -u 0 # ./тестовое задание 0,0 # Выход # Выход $
Примечание. Точка монтирования не имеет и nosuid
не noexec
установлена.
Кто-нибудь может объяснить, почему он не работает на Ubuntu 16.04 LTS?
sudo
? В нем есть ошибка или опечатка, однакоchmod
отсутствует имя файла.Ответы:
Для скомпилированного исполняемого файла
man 2 chown
:Обратный порядок
chown
иchmod
порядок работает для меня:источник
В вашем первом случае, это Bash, который не любит работать как setuid.
См. Руководство Bash по файлам запуска , также бит Setuid, похоже, не влияет на bash .
Во втором случае, это порядок
chmod
иchown
имеет значение, как Муру уже ответил . Смена владельца сбрасывает бит setuid.источник
Возможно также, что файловая система, содержащая исполняемый файл теста, была смонтирована с
nosuid
опцией ; Я слышал, что новые дистрибутивы будут делать это по умолчанию для/tmp
, и есть хорошие аргументы для его применения/home
.nosuid
заставляет ядро игнорировать биты setuid и setgid для всех исполняемых файлов в файловой системе. (Несвязанная вещь, которая происходит, когда вы делаете setgid каталога, не затрагивается.)источник