seteuid(2) устанавливает эффективный идентификатор пользователя или

Other Alias

setegid

ОБЗОР

#include <sys/types.h>
#include <unistd.h>

int seteuid(uid_t euid);
int setegid(gid_t egid);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

seteuid(), setegid():

_BSD_SOURCE || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600

ОПИСАНИЕ

seteuid() устанавливает эффективный идентификатор пользователя вызывающего процесса. Непривилегированные пользовательские процессы могут менять эффективный идентификатор пользователя только на действительный, эффективный или сохранённый идентификатор пользователя.

Тоже самое справедливо при работе setegid() с «групповым» идентификатором, а не «пользовательским».

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

Замечание: есть случаи, когда seteuid() может завершиться с ошибкой даже когда UID вызывающего равен 0; это серьёзная ошибка безопасности — не проверять возвращаемое значение seteuid().

ОШИБКИ

EINVAL
Целевой идентификатор пользователя или группы некорректен в этом пользовательском пространстве имён.
EPERM
Вызывающий процесс не имеет прав (Linux: не имеет мандата CAP_SETUID, если вызывает seteuid(), или CAP_SETGID, если вызывает setegid()) и euid (и, соответственно, egid) не является действительным, эффективным или сохранённым идентификатором пользователя (группы).

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008, 4.3BSD.

ЗАМЕЧАНИЯ

Установка эффективного идентификатора пользователя (группы) в сохранённый идентификатор пользователя (группы) возможна с версии Linux 1.1.37 (1.1.38). В других системах надо проверять _POSIX_SAVED_IDS.

В glibc 2.0 вызов seteuid(euid)эквивалентен setreuid(-1, euid), и поэтому может изменить сохранённый идентификатор пользователя. В glibc 2.1 и новее он эквивалентен setresuid(-1, euid, -1) и поэтому не изменяет сохранённый идентификатор пользователя. Аналогичные замечания относятся и к setegid(), с той разницей, что изменение в реализации из setregid(-1, egid) в setresgid(-1, egid, -1) произошло в glibc 2.2 или 2.3 (зависит от аппаратной архитектуры).

Согласно POSIX.1, seteuid() (setegid()) необходимо запрещать euid (egid) равный текущему эффективному идентификатору пользователя (группе), и некоторые реализации не позволяют этого.

Отличия между библиотекой C и ядром

В Linux, seteuid() и setegid() реализованы в виде библиотечных функций, которые вызывают setreuid(2) и setregid(2), соответственно.