Scroll to navigation

SETFSUID(2) Руководство программиста Linux SETFSUID(2)

ИМЯ

setfsuid - устанавливает идентификатор пользователя для доступа к файловой системе

СИНТАКСИС

#include <sys/fsuid.h>

int setfsuid(uid_t fsuid);

ОПИСАНИЕ

The system call setfsuid() changes the value of the caller's filesystem user ID—the user ID that the Linux kernel uses to check for all accesses to the filesystem. Normally, the value of the filesystem user ID will shadow the value of the effective user ID. In fact, whenever the effective user ID is changed, the filesystem user ID will also be changed to the new value of the effective user ID.

Explicit calls to setfsuid() and setfsgid(2) are usually used only by programs such as the Linux NFS server that need to change what user and group ID is used for file access without a corresponding change in the real and effective user and group IDs. A change in the normal user IDs for a program such as the NFS server is a security hole that can expose it to unwanted signals. (But see below.)

Вызов setfsuid() выполняется корректно, только если он был вызван суперпользователем или, если fsuid совпадает с действительным, эффективным и сохранённым идентификатором пользователя или равен текущему значению идентификатора пользователя файловой системы вызывающего.

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

При успешном выполнении или при ошибке данный вызов возвращает предыдущий идентификатор пользователя файловой системы вызвавшего.

ВЕРСИИ

Данный системный вызов доступен в Linux начиная с версии 1.2.

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

Вызов setfsuid() есть только в Linux и не должен использоваться в переносимых программах.

ЗАМЕЧАНИЯ

At the time when this system call was introduced, one process could send a signal to another process with the same effective user ID. This meant that if a privileged process changed its effective user ID for the purpose of file permission checking, then it could become vulnerable to receiving signals sent by another (unprivileged) process with the same user ID. The filesystem user ID attribute was thus added to allow a process to change its user ID for the purposes of file permission checking without at the same time becoming vulnerable to receiving unwanted signals. Since Linux 2.0, signal permission handling is different (see kill(2)), with the result that a process change can change its effective user ID without being vulnerable to receiving signals from unwanted processes. Thus, setfsuid() is nowadays unneeded and should be avoided in new applications (likewise for setfsgid(2)).

Первоначальная версия системного вызова setfsuid() в Linux поддерживала только 16-битные идентификаторы пользователя. Позднее в Linux 2.4 был добавлен вызов setfsuid32(), поддерживающий 32-битные идентификаторы. В glibc обёрточная функция setfsuid() работает одинаково вне зависимости от версий ядра.

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

In glibc 2.15 and earlier, when the wrapper for this system call determines that the argument can't be passed to the kernel without integer truncation (because the kernel is old and does not support 32-bit user IDs), they will return -1 and set errno to EINVAL without attempting the system call.

ДЕФЕКТЫ

Вызывающему не возвращается никаких ошибок, и факт того, что успешном или не успешном выполнении возвращается одинаковое значение, делает невозможным напрямую определить как завершился вызов. Вместо этого, вызывающий должен получить значение из ещё одного вызова — setfsuid(-1) (который всегда завершается с ошибкой), чтобы определить, изменил ли предыдущий вызов setfsuid() идентификатор пользователя файловой системы. По крайней мере, должно быть получено значение EPERM, если вызов завершится с ошибкой (так как у вызывающего нет мандата CAP_SETUID).

СМ. ТАКЖЕ

kill(2), setfsgid(2), capabilities(7), credentials(7)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 4.16. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан 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>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

15 сентября 2017 г. Linux