Поскольку бит suid
в исполняемых файлах только изменяет эффективный UID (EUID), исполняемый файл будет работать как, а не реальный UID (RUID), который возвращает getuid()
, и в дополнение к ограничению на suid
скрипты (любой исполняемый файл, начинающийся с «#!
»), некоторые оболочки, такие как bash
в качестве дополнительной меры безопасности, в этом случае вернут EUID в RUID, вам нужно будет использовать вызов setuid(0)
в коде C перед выполнением скрипта.
См. страницы man
в setuid
, seteuid
, getuid
и geteuid
, чтобы узнать точную семантику реальных и эффективных UID.
( ПРЕДУПРЕЖДЕНИЕ ) Конечно, это подходящий момент, чтобы упомянуть, что ограничение на скрипты suid
во многих системах Unix, оболочках и интерпретаторах существует по какой-либо причине, что что, если сценарий не очень осторожен в том, чтобы дезинфицировать его вход и состояние окружающей среды, когда он выполняется, они опасны и могут быть использованы для повышения безопасности. Поэтому будьте очень осторожны при этом. Установите доступ к своему сценарию и обертке как можно строже, разрешите этот конкретный сценарий, который вы намереваетесь выполнить, и очистите среду внутри вашей программы C перед запуском скрипта, установив переменные среды, такие как PATH
, чтобы содержать именно то, что необходимо в правильном порядке, и нет каталогов, которые можно записать другим.