setuid
устанавливает фактический идентификатор владельца текущего процесса.
Если фактический пользователь, вызвавший эту функцию является суперпользователем,
то также устанавливаются действительный и сохраненный идентификаторы.
В Linux
setuid
реализован, как и в стандарте POSIX с возможностью _POSIX_SAVED_IDS.
Это позволяет setuid-программам (не setuid-root) сбрасывать все
привилегии, делать непривилегированную работу, а затем безопасным путем
возвращать себе исходный идентификатор эффективного пользователя.
Если пользователь root или программа установлена как setuid root,
при работе требуется особая осторожность. Функция
setuid
проверяет идентификатор вызвавшего эффективного пользователя и, если
это суперпользователь, то все устанавливаемые значения идентификаторов равны
uid.
После этого программа уже никаким образом не сможет вернуть права
пользователя root.
Таким образом, программа setuid-root, собирающаяся временно сбросить права
root, на время сделаться другим пользователем, а затем восстановить
права root, не сможет вернуть
setuid.
Требуемого результата можно достичь с помощью вызова
seteuid,;
этот вызов не описан в POSIX, но описан в BSD.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При успешном завершении возвращается нулевое значение.
В случае ошибки возвращается -1, а переменной
errno
присваивается номер ошибки.
НАЙДЕННЫЕ ОШИБКИ
EPERM
Пользователь не является суперпользователем, а
uid
не совпадает с действительным или сохраненным идентификатором пользователя
текущего процесса.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID, POSIX.1. Этот системный вызов не полностью совместим с
4.4BSD, который устанавливает идентификаторы действительного, эффективного
и сохраненного пользователя. SVr4 документирует
дополнительный код ошибки EINVAL.
ЗАМЕЧАНИЯ ПО LINUX
Linux поддерживает идентификатор пользователя файловой
системы, обычно совпадающий с фактическим идентификатором. Системный
вызов
setuid
также устанавливает идентификатор пользователя файловой системы.
См.
setfsuid(2).
Если
uid
отличается от старого фактического идентификатора, то процессу нельзя
будет создавать core-файлы.