| setreuid(2) | System Calls Manual | setreuid(2) |
setreuid, setregid - устанавливает действительный и/или эффективный идентификатор пользователя или группы
Стандартная библиотека языка C (libc, -lc)
#include <unistd.h>
int setreuid(uid_t ruid, uid_t euid); int setregid(gid_t rgid, gid_t egid);
setreuid(), setregid():
_XOPEN_SOURCE >= 500
|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _BSD_SOURCE
Вызов setreuid() устанавливает действительный и эффективный идентификатор пользователя вызывающего процесса.
Если указываемое значение действительного или эффективного идентификатора пользователя равно -1, то система не изменяет его.
Непривилегированные процессы могут изменять эффективный идентификатор пользователя на действующий, эффективный или сохранённый идентификатор пользователя.
Непривилегированные пользователи могут изменять действительный идентификатор пользователя на эффективный или действительный идентификатор пользователя.
Если установлен действительный идентификатор пользователя (т. е., значение ruid не равно -1) или установлено значение эффективного идентификатора пользователя в отличное от предыдущего значения действительного идентификатора пользователя, то значение сохранённого идентификатора пользователя будет установлено в новое значение эффективного идентификатора пользователя.
Аналогично setregid() меняет действующий и эффективный идентификаторы группы вызывающего процесса, и всё описанное выше для пользователя справедливо и для группы.
При успешном выполнении возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.
Замечание: есть случаи, когда setreuid() может завершиться с ошибкой даже когда UID вызывающего равен 0; это серьёзная ошибка безопасности — не проверять возвращаемое значение setreuid().
В POSIX.1 не определены все варианты изменения идентификаторов, разрешённые в Linux непривилегированным процессам. Вызов setreuid() может изменить значение эффективного пользовательского идентификатора на действительный или сохранённый пользовательский идентификатор и не определено, может ли непривилегированный процесс установить действительный пользовательский идентификатор равным действительному, эффективному или сохранённому пользовательскому идентификатору. Вызов setregid() может изменить действительный идентификатор группы на значение сохранённого идентификатора группы, а эффективный идентификатор группы — на значение действительного или сохранённого идентификатора группы. Действующие правила о разрешённых изменениях идентификаторов отличаются в разных реализациях.
В POSIX.1 ничего не сказано о работе этих вызовов над сохранённым идентификатором пользователя и группы.
POSIX.1-2008.
POSIX.1-2001, 4.3BSD (впервые появился в 4.2BSD).
Установка эффективного идентификатора пользователя (группы) в значение сохранённого идентификатора возможна с версии Linux 1.1.37 (1.1.38).
Первоначальные версии системных вызовов setreuid() и setregid() в Linux поддерживали только 16-битные идентификаторы пользователей и групп. Позднее в Linux 2.4 были добавлены вызовы setreuid32() и setregid32(), поддерживающие 32-битные идентификаторы. В glibc обёрточные функции setreuid() и setregid() работают одинаково вне зависимости от версий ядра.
На уровне ядра ID пользователя и группы являются атрибутами нити. Однако в POSIX требуется, чтобы все нити в процессе имели одинаковые права. В реализации нитей NPTL требования POSIX реализованы через обёрточные функции для различных системных вызовов, которые изменяют UID и GID процесса. В этих функциях (включая setreuid() и setregid()) используется алгоритмы на основе сигналов, которые следят за тем, что когда у одной нити изменяются права, эти изменения выполняются и для остальных нитей процесса. Подробное описание смотрите в nptl(7).
getgid(2), getuid(2), seteuid(2), setgid(2), setresuid(2), setuid(2), capabilities(7), credentials(7), user_namespaces(7)
Русский перевод этой страницы руководства разработал(и) Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.
| 2 мая 2024 г. | Справочные страницы Linux 6.9.1 |