setfsuid -
устанавливает
идентификатор
пользователя
для
доступа к
файловой
системе
Standard C library (
libc,
-lc)
#include <sys/fsuid.h>
int setfsuid(uid_t fsuid);
В Linux у
процесса
есть
идентификатор
пользователя
файловой
системы и
эффективный
(effective)
идентификатор
пользователя.
Идентификатор
пользователя
файловой
системы
(есть
только в Linux)
используется
при
проверки
прав
доступа к
объектам
файловой
системы, а
эффективный
идентификатор
пользователя
используется
для
проверки
прав
доступа к
другим
различным
объектам
(смотрите
credentials(7)).
Обычно,
значение
идентификатора
пользователя
файловой
системы
процесса
совпадает
со
значением
эффективного
идентификатора
пользователя.
Более того,
при
изменении
идентификатора
эффективного
идентификатора
пользователя
ядро также
изменяет и
идентификатор
пользователя
файловой
системы на
новое
значение
идентификатора
эффективного
идентификатора
пользователя.Процесс
может
изменить
значение
своего
идентификатора
пользователя
файловой
системы на
отличное
от
эффективного
идентификатора
пользователя
с помощью
setfsuid() указав
его в
параметре
fsuid.
Вызовы
setfsuid() и
setfsgid(2) в явном
виде,
обычно
(теперь),
используются
только в
программах
Linux типа
NFS-сервера,
которым
требуется
изменить
идентификатор
пользователя
и группы
для
доступа к
файлам без
изменения
действительного
и
эффективного
идентификаторов
пользователя
и группы.
Изменение
обычного
идентификатора
пользователя
для
программы
типа
NFS-сервера —
это
нарушение
безопасности
(раньше),
приводящее
к
возможному
получению
нежелательных
сигналов
от других
групп
(однако это
было в
прошлом,
читайте
далее).
Вызов
setfsuid()
выполняется
корректно,
только
если он был
вызван
суперпользователем
или, если
fsuid
совпадает
с
действительным,
эффективным
и
сохранённым
идентификатором
пользователя
или равен
текущему
значению
идентификатора
пользователя
файловой
системы
вызывающего.
При
успешном
выполнении
или при
ошибке
данный
вызов
возвращает
предыдущий
идентификатор
пользователя
файловой
системы
вызвавшего.
This system call is present since Linux 1.2.
Вызов
setfsuid()
есть
только в Linux и
не должен
использоваться
в
переносимых
программах.
На момент
появления
данного
системного
вызова
один
процесс
мог
послать
сигнал
другому
процессу с
тем же
эффективным
идентификатором
пользователя.
Это
означает,
что если
привилегированный
процесс
изменит
свой
эффективный
идентификатор
пользователя
с целью
проверки
доступа к
файлу, то он
сможет
стать
уязвимым к
приёму
сигналов,
посланных
(непривилегированным)
процессом
с тем же
идентификатором
пользователя.
Атрибут
идентификатора
пользователя
файловой
системы
был
добавлен
как раз для
того, чтобы
позволить
процессу
изменить
свой
идентификатор
пользователя
для
проверки
доступа к
файлу не
боясь
стать
уязвимым к
приёму
нежелаемых
сигналов.
Начиная с Linux 2.0,
обработка
прав на
сигналы
была
изменена
(смотрите
kill(2)), что
позволило
процессу
изменять
свой
эффективный
идентификатор
пользователя
без боязни
стать
уязвимым к
приёму
нежелаемых
сигналов
от других
процессов.Таким
образом,
сейчас
системный
вызов
setfsuid()
уже не
нужен и не
должен
использоваться
в новых
приложениях
(как и
setfsgid(2)).
Первоначальная
версия
системного
вызова
setfsuid() в
Linux
поддерживала
только
16-битные
идентификаторы
пользователя.
Позднее в Linux 2.4
был
добавлен
вызов
setfsuid32(),
поддерживающий
32-битные
идентификаторы.
В glibc
обёрточная
функция
setfsuid()
работает
одинаково
вне
зависимости
от версий
ядра.
В glibc 2.15 и старее,
если
обёрточная
функция
этого
системного
вызова
определяет,
что
аргумент
невозможно
передать
ядру без
обрезания
целого (так
как ядро
старое и не
поддерживает
32-битные ID
пользователя),
то она
возвращает
-1 и
присваивает
errno значение
EINVAL не
пытаясь
выполнить
системный
вызов.
Вызывающему
не
возвращается
никаких
ошибок, и
факт того,
что
успешном
или не
успешном
выполнении
возвращается
одинаковое
значение,
делает
невозможным
напрямую
определить
как
завершился
вызов.
Вместо
этого,
вызывающий
должен
получить
значение
из ещё
одного
вызова —
setfsuid(-1)
(который
всегда
завершается
с ошибкой),
чтобы
определить,
изменил ли
предыдущий
вызов
setfsuid()
идентификатор
пользователя
файловой
системы. По
крайней
мере,
должно
быть
получено
значение
EPERM,
если вызов
завершится
с ошибкой
(так как у
вызывающего
нет
мандата
CAP_SETUID).
kill(2),
setfsgid(2),
capabilities(7),
credentials(7)
Русский
перевод
этой
страницы
руководства
был сделан
Alexander Golubev <
[email protected]>, Azamat Hackimov
<
[email protected]>, Hotellook, Nikita
<
[email protected]>, Spiros Georgaras <
[email protected]>, Vladislav
<
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]