Suid

setuid, SUID и setgid, SGID (от  — «установка ID пользователя во время выполнения» и  — «установка ID группы во время выполнения») являются флагами прав доступа в файловых системах операционных систем семейства Unix, которые позволяют пользователям запускать исполняемые файлы с правами владельца или группы исполняемого файла, а установленные на каталогах, обеспечивают механизм наследования группы и, иногда, владельца каталогов и файлов.

Общая информация 

В Unix-подобных операционных системах приложение запускается с правами пользователя, вызвавшего указанное приложение. Это обеспечивает дополнительную безопасность, так как процесс с правами пользователя не сможет получить доступ на запись к важным системным файлам, например /etc/passwd, который принадлежит суперпользователю (root).

Если на исполняемый файл установлен бит suid, то при выполнении эта программа автоматически меняет эффективный идентификатор пользователя (EUID) на идентификатор того пользователя, который является владельцем этого файла. То есть, независимо от того, кто запускает эту программу, она при выполнении имеет права хозяина исполняемого файла программы.

История 
Бит suid был изобретен Деннисом Ритчи и запатентован в США компанией AT&T в 1979 году. Позже патент 4135240 «Protection of data file contents» был выложен в свободный доступ.

В SunOS 4.0 разработчики первыми реализовали механизм наследования владельца и группы каталога для создаваемых в нём файлов и каталогов с помощью битов SUID и GUID. В Unix System V эта функция была реализована с версии Release 4.

setuid и setgid на файлах 
setuid и setgid, установленные на файлах, используются для подмены (косвенной установки) эффективных идентификаторов процесса, поскольку прямая замена идентификаторов UID и GID у процесса в ОС семейства UNIX простым пользователям запрещена.

Атрибуты setuid и setgid устанавливаются командой chmod установкой 2 и 3 битов четвёртого знака восьмиричного числа: соответствие маске 04000 означает setuid, 02000 означает setgid. Например, команда chmod 6711 file установит на файле оба бита.

Символьные аргументы chmod для установки и снятия sticky-битов — +s и -s, например, команда chmod u+s file установит SUID, а команда chmod ug-s file снимет с файла оба бита.

Aтрибут setuid установлен для исполняемого файла 

Бит setuid используется для замены эффективного идентификатора пользователя при запуске исполняемого файла.

Типично процесс работает с эффективными идентификаторами, совпадающими с идентификаторами UID и GID запустившего его пользователя. Но при запуске на выполнение файла с атрибутом setuid любым пользователем, запущенный процесс работает от идентификатора пользователя, являющегося владельцем файла — операционная система назначет этому процессу EUID, соответствующий UID владельца файла. В частности, этот механизм используется для повышения привилегий процесса до суперпользователя (root).

Из-за возможности состояния гонки многие операционные системы игнорируют установленный атрибут к shell-скриптам.

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

Aтрибут setgid установлен для исполняемого файла 
Установленный бит setgid заменяет эффективный идентификатор группы процесса на идентификатор группы его исполняемого файла (вместо GID запустившего его пользователя).

setgid на каталогах 

Бит setgid, установленный для каталога, имеет специальное значение.

Установленный для каталога бит setgid (команда установки: chmod g+s) указывает операционной системе создавать в нём новые каталоги и файлы, наследующие ID группы этого каталога вместо ID группы пользователя, создавшего файл, а новые подкаталоги также наследуют бит setgid. Это позволяет создать общее рабочее пространство для группы без неудобств членам группы явно менять их текущую группу для создания новых файлов и каталогов.

setuid на каталогах 
Установленный на каталоге бит setuid используется во FreeBSD в случае компиляции ядра с поддержкой suiddir — всем созданным в каталоге файлам и подкаталогам назначается владельцем владелец родительского каталога. Эта функция является уязвимостью и по умолчанию отключена.

Бит setuid, установленный для каталогов, игнорируется в большинстве версий Unix.

Наследование устанавливается только для новых файлов и каталогов. Уже существующим файлам и каталогам этот бит нужно устанавливать вручную, например:find /path/to/directory -type d -exec chmod g+s {} \;
Также следует учесть, что для всех пользователей такой группы umask должна быть изменена со значения по умолчанию 0022 на 0012, иначе новые файлы/папки не будут иметь право записи (w) для группы.

setuid и setgid на неисполняемых файлах 
Установка битов 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, он получит права суперпользвоателя даже залогинившись гостевой учётной записью.

См. также 
 sticky bit
 chmod

Примечания

Ссылки 
 

Unix
Статьи с примерами кода Си