почему бит suid сбрасывается после модификации файла

почему бит suid сбрасывается после модификации файла

У меня есть файл (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.

Связанный контент