У меня есть файл (s|g)uid, доступный для записи всем:
ls -lh suid_bin.sh
-rwsr-srwx 1 root root 168 mai 23 16:46 suid_bin.sh
вошёл с учётной записью пользователя без прав root. Я использую vi (или другой редактор) для изменения "suid_bin.sh". После сохранения нового содержимого биты (s|g)uid сбрасываются:
ls -lh suid_bin.sh
-rwxr-xrwx 1 root root 168 mai 23 16:46 suid_bin.sh
Почему? Есть ли способ сохранить биты (s|g)uid после модификации?
решение1
Разрешения Unix разрешают запись в файл, если кто-то случайно установит групповой или всеобщий бит записи для файла setuid, но запрещают посторонним лицам изменять идентификаторы владельца и группы для таких файлов.
Поэтому после модификации ядро удаляет биты setuid/setgid из файла, чтобы гарантировать, что в файл не будет записан вредоносный код.
Пользователь root, конечно, может восстановить бит setuid, но обычный пользователь, если он по чьей-то ошибке получил доступ на запись в привилегированный исполняемый файл, не сможет этим воспользоваться.
И, зная части ядра в этой области, я не уверен, что вы сможете отключить это без редактирования исходного кода ядра и перекомпиляции.
Обратите внимание, что скрипты setuid в Linux не получают статус setuid после выполнения, поскольку на самом деле ядро запускает интерпретатор скрипта без статуса setuid с полным путем к скрипту в качестве последнего анализируемого аргумента, а затем интерпретатор читает скрипт как обычный файл. Но это может отличаться в других системах Unix.