setgid
устанавливает идентификатор эффективной группы текущего процесса.
Если функция вызвана суперпользователем, то устанавливаются
идентификаторы действительной и сохраненной группы.
В Linux
setgid
реализован так же, как в стандарте POSIX, где есть возможность
_POSIX_SAVED_IDS. Это позволяет setgid-программам (не являющимся
программами суперпользователя) сбросить привилегии группы,
проделать непривилегированную работу и вернуть исходный
идентификатор эффективной группы в полной сохранности.
Если пользователь является суперпользователем или установленная
программа является setgid root, то необходимо быть особенно
осмотрительным. Функция
setgid
проверяет идентификатор эффективной группы вызвавшего процесса, и если
это суперпользовательский процесс, то устанавливаемое значение всех идентификаторов
его группы
становится равным
gid.
После этого программе невозможно вернуть привилегии суперпользователя.
Таким образом, программа setgid-root, собирающаяся временно сбросить
привилегии суперпользователя, попасть в не-root группу, а потом
восстановить привилегии суперпользователя, не может использовать
setgid.
Желаемого результата можно добиться с помощью системного вызова
setegid,
которого нет в стандарте POSIX, но он есть в BSD.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При успешном завершении вызова возвращается нулевое значение.
При ошибке возвращается -1, а переменной
errno
присваивается номер ошибки.
НАЙДЕННЫЕ ОШИБКИ
EPERM
Пользователь не является суперпользователем, а
gid
на совпадает с идентификатором эффективной группы
или идентификатором сохраненной группы текущего процесса.