setfsgid(2) устанавливает идентификатор группы для доступа к файловой системе

ОБЗОР

#include <sys/fsuid.h>

int setfsgid(uid_t fsgid);

ОПИСАНИЕ

Системный вызов setfsgid() изменяет значение идентификатора группы файловой системы вызывающего — идентификатор группы, который ядро Linux использует для проверки при любом доступе к файловой системе. Обычно, значение идентификатора группы файловой системы равно теневому значению идентификатора эффективной группы. Более того, при изменении идентификатора эффективной группы также изменяется и идентификатор группы файловой системы на новое значение идентификатора эффективной группы.

Вызовы setfsuid(2) и setfsgid() обычно используются только в программах Linux типа NFS-сервера, которым требуется изменить идентификатор пользователя и группы для доступа к файлам без изменения действительного и эффективного идентификаторов пользователя и группы. Изменение обычного идентификатора пользователя для программы типа NFS-сервера --- это нарушение безопасности, приводящее к возможному получению нежелательных сигналов от других групп (но читайте далее).

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

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

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

ВЕРСИИ

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

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

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

ЗАМЕЧАНИЯ

Если в glibc определяется, что в аргументе указан неправильный идентификатор группы, то возвращается -1, errno присваивается значение EINVAL, а системный вызов не выполняется.

Заметим, что до появления данного системного вызова, процесс мог отправить сигнал процессу с таким же действующим идентификатором пользователя. Сейчас обработка прав отправки сигнала происходит немного иначе. Смотрите в setfsuid(2) описание почему использование setfsuid(2) и setfsgid() в настоящее время больше не требуется.

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

ДЕФЕКТЫ

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