setuid, SUID и setgid, SGID (от англ. set user ID upon execution — «установка ID пользователя во время выполнения» и set group ID upon execution — «установка ID группы во время выполнения») являются флагами прав доступа в файловых системах операционных систем семейства Unix, которые позволяют пользователям запускать исполняемые файлы с правами владельца или группы исполняемого файла, а установленные на каталогах, обеспечивают механизм наследования группы и, иногда, владельца каталогов и файлов.
В Unix-подобных операционных системах приложение запускается с правами пользователя, вызвавшего указанное приложение. Это обеспечивает дополнительную безопасность, так как процесс с правами пользователя не сможет получить доступ на запись к важным системным файлам, например /etc/passwd, который принадлежит суперпользователю (root).
Если на исполняемый файл установлен бит suid, то при выполнении эта программа автоматически меняет эффективный идентификатор пользователя (EUID) на идентификатор того пользователя, который является владельцем этого файла. То есть, независимо от того, кто запускает эту программу, она при выполнении имеет права хозяина исполняемого файла программы.
Бит suid был изобретен Деннисом Ритчи и запатентован в США компанией AT&T в 1979 году. Позже патент 4135240 «Protection of data file contents» был выложен в свободный доступ.[источник не указан 494 дня]
В SunOS 4.0 разработчики первыми реализовали механизм наследования владельца и группы каталога для создаваемых в нём файлов и каталогов с помощью битов SUID и GUID. В Unix System V эта функция была реализована с версии Release 4[1].
setuid и setgid, установленные на файлах, используются для подмены (косвенной установки) эффективных идентификаторов процесса, поскольку прямая замена идентификаторов UID и GID у процесса в ОС семейства UNIX простым пользователям запрещена[2].
Атрибуты setuid и setgid устанавливаются командой chmod установкой 2 и 3 битов четвёртого знака восьмиричного числа: соответствие маске 04000 означает setuid, 02000 означает setgid. Например, команда chmod 6711 file
установит на файле оба бита[2].
Символьные аргументы chmod для установки и снятия sticky-битов — +s
и -s
, например, команда chmod u+s file
установит SUID, а команда chmod ug-s file
снимет с файла оба бита[2][3].
Бит setuid используется для замены эффективного идентификатора пользователя при запуске исполняемого файла[2][3].
Типично процесс работает с эффективными идентификаторами, совпадающими с идентификаторами UID и GID запустившего его пользователя. Но при запуске на выполнение файла с атрибутом setuid любым пользователем, запущенный процесс работает от идентификатора пользователя, являющегося владельцем файла — операционная система назначет этому процессу EUID, соответствующий UID владельца файла. В частности, этот механизм используется для повышения привилегий процесса до суперпользователя (root)[2][3].
Из-за возможности состояния гонки многие операционные системы игнорируют установленный атрибут к shell-скриптам[источник не указан 3369 дней].
Хотя атрибут setuid очень удобен во многих случаях, его неправильное использование может представлять угрозу безопасности, когда атрибут присваивается исполняемому файлу, который не тщательно спроектирован. Пользователи могут использовать уязвимости в недоработанных программах, чтобы получить повышенные привилегии или непреднамеренно запустить программу троянского коня.[источник не указан 494 дня]
Установленный бит setgid заменяет эффективный идентификатор группы процесса на идентификатор группы его исполняемого файла (вместо GID запустившего его пользователя)[2].
Бит setgid, установленный для каталога, имеет специальное значение[2][4].
Установленный для каталога бит setgid (команда установки: chmod g+s
) указывает операционной системе создавать в нём новые каталоги и файлы, наследующие ID группы этого каталога вместо ID группы пользователя, создавшего файл, а новые подкаталоги также наследуют бит setgid[2][1]. Это позволяет создать общее рабочее пространство для группы без неудобств членам группы явно менять их текущую группу для создания новых файлов и каталогов[1].
Установленный на каталоге бит setuid используется во FreeBSD в случае компиляции ядра с поддержкой suiddir — всем созданным в каталоге файлам и подкаталогам назначается владельцем владелец родительского каталога. Эта функция является уязвимостью и по умолчанию отключена[2].
Бит setuid, установленный для каталогов, игнорируется в большинстве версий Unix[источник не указан 3710 дней].
Наследование устанавливается только для новых файлов и каталогов. Уже существующим файлам и каталогам этот бит нужно устанавливать вручную, например:
find /path/to/directory -type d -exec chmod g+s {} \;
Также следует учесть, что для всех пользователей такой группы umask должна быть изменена со значения по умолчанию 0022 на 0012, иначе новые файлы/папки не будут иметь право записи (w) для группы.
Установка битов suid/sgid на неисполняемых файлах, как правило, бессмысленна.
[bob@foo]$ cat /etc/passwd
alice:x:1007:1007::/home/alice:/bin/bash
bob:x:1008:1008::/home/bob:/bin/bash
[bob@foo]$ cat printid.c
# include <stdlib.h>
# include <stdio.h>
# include <unistd.h>
# include <sys/types.h>
int main(void)
{
printf("Real UID\t= %d\n", getuid());
printf("Effective UID\t= %d\n", geteuid());
printf("Real GID\t= %d\n", getgid());
printf("Effective GID\t= %d\n", getegid());
return EXIT_SUCCESS;
}
[bob@foo]$ gcc -Wall printid.c -o printid
[bob@foo]$ chmod ug+s printid
[bob@foo]$ su alice
Password:
[alice@foo]$ ls -l
-rwsr-sr-x 1 bob bob 6944 2007-11-06 10:22 printid
[alice@foo]$ ./printid
Real UID = 1007
Effective UID = 1008
Real GID = 1007
Effective GID = 1008
[alice@foo]$
Программа с установленным битом setuid является потенциально опасной, и неиспользуемые программы с установленным битом SUID лучше убрать из установленной операционной системы. Злоумышленник, проникнув в систему, старается получить максимально возможные права доступа, и, например, сумев из-за ошибки владельца системы установить бит SUID на интерпретатор команд bash, он получит права суперпользвоателя даже залогинившись гостевой учётной записью[5].