Введение
Флаг прав доступа Unix
Флаги прав доступа Unix и Linux setuid и setgid (сокращения от set user identity и set group identity) позволяют пользователям запускать исполняемый файл с правами файловой системы владельца или группы этого файла соответственно, а также изменять поведение в каталогах. Они часто используются для предоставления пользователям компьютерной системы возможности запускать программы с временно повышенными привилегиями для выполнения конкретной задачи. Хотя предоставляемые привилегии идентификатора пользователя или группы не всегда являются повышенными, они, по крайней мере, определены. Флаги setuid и setgid необходимы для задач, требующих прав, отличных от обычно предоставляемых пользователю, например, для изменения системных файлов или баз данных с целью смены пароля для входа в систему. Некоторые задачи, требующие дополнительных привилегий, могут быть не сразу очевидны, например, команда ping, которой необходимо отправлять и принимать управляющие пакеты через сетевой интерфейс.
Режимы файлов
Биты setuid и setgid обычно представляются значениями 4 для setuid и 2 для setgid в старшей октальной цифре режима файла. Например, число 6711 устанавливает оба бита setuid и setgid, а также права на чтение, запись и исполнение для владельца (7), исполнение для группы (первая 1) и для остальных пользователей (вторая 1). Большинство реализаций имеют символьное представление этих битов; в предыдущем примере это может быть u=rwx,go=x,ug+s. Обычно у команды chmod нет рекурсивного режима, ограниченного каталогами, поэтому изменение существующего дерева каталогов необходимо выполнять вручную, например, с помощью команды .
Эффекты
Флаги setuid и setgid оказывают различное воздействие в зависимости от того, к чему они применены: к файлу, каталогу или бинарному/небинарному исполняемому файлу. Эффект от флагов setuid и setgid проявляется только для бинарных исполняемых файлов и не распространяется на скрипты (например, Bash, Perl, Python).
Когда настраивается на исполняемый файл
Когда для исполняемого файла установлены атрибуты setuid или setgid, любой пользователь, имеющий право запускать этот файл, автоматически выполнит его с привилегиями владельца файла (обычно root) и/или группы файла, в зависимости от установленных флагов. Многие операционные системы игнорируют атрибут setuid при применении к исполняемым скриптам оболочки. Наличие исполняемых файлов с установленным setuid объясняет, почему системный вызов chroot недоступен пользователям, не имеющим прав root в Unix. Подробности об ограничениях chroot см. в соответствующем разделе.
Когда настраивается в каталоге
Настройка разрешения setgid на каталоге приводит к тому, что файлы и подкаталоги, созданные внутри него, наследуют его групповую принадлежность, а не первичную группу процесса, создающего файл. Созданные подкаталоги также наследуют бит setgid. Эта политика применяется только при создании и, следовательно, действует только в отношении новых файлов. Каталоги и файлы, существовавшие до установки бита setgid, не затрагиваются, равно как и каталоги и файлы, перемещенные в каталог, на котором установлен этот бит. Это предоставляет возможность работать с файлами группе пользователей без явной настройки разрешений, но ограничено принципом безопасности, согласно которому существующие разрешения файлов не должны изменяться неявно. Разрешение setuid, установленное на каталоге, игнорируется в большинстве систем UNIX и Linux. Однако FreeBSD можно настроить для интерпретации setuid аналогично setgid, в этом случае оно заставляет все файлы и подкаталоги, созданные в каталоге, принадлежать владельцу этого каталога – это простая форма наследования. Обычно это не требуется в большинстве систем, основанных на BSD, поскольку по умолчанию каталоги обрабатываются так, как если бы их бит setgid всегда был установлен, независимо от его фактического значения. Как указано в open(2), "При создании нового файла ему назначается группа каталога, в котором он находится".
Безопасность
Разработчики тщательно проектируют и реализуют программы, использующие этот бит в исполняемых файлах, чтобы избежать уязвимостей безопасности, включая переполнение буфера и внедрение пути. Успешные атаки, использующие переполнение буфера в уязвимых приложениях, позволяют злоумышленнику выполнить произвольный код с правами эксплуатируемого процесса. Если уязвимый процесс использует setuid-бит для запуска от имени root, код будет выполняться с правами root, фактически предоставляя злоумышленнику root-доступ к системе, на которой работает уязвимый процесс. Особое значение в случае процесса с установленным setuid-битом имеет его окружение. Если окружение не было должным образом очищено привилегированным процессом, его поведение может быть изменено не привилегированным процессом, который его запустил. Например, GNU libc в определенный момент была уязвима к эксплойту, использующему setuid и переменную окружения, позволявшую выполнять код из ненадежных разделяемых библиотек.
История
Сетуидный бит был изобретен Деннисом Ричи и реализован в утилите su. Его работодатель, Bell Telephone Laboratories, подал заявку на патент в 1972 году; патент был выдан в 1979 году под номером патента. Позднее патент был переведен в общественное достояние.