suid

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

setuid и setgid (сокращения от англ. set user ID upon execution — «установка ID пользователя во время выполнения» и англ. set group ID upon execution — «установка ID группы во время выполнения») являются флагами прав доступа в Unix, которые разрешают пользователям запускать исполняемые файлы с правами владельца или группы исполняемого файла.

Общая информация[править | править вики-текст]

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

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

История[править | править вики-текст]

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

setuid и setgid на файлах[править | править вики-текст]

Когда атрибут setuid установлен файлу, обычный пользователь, запускающий этот файл на исполнение, получает повышение прав до пользователя-владельца файла (обычно root) в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, выполнение которых обычному пользователю недоступно. Пользователю будет запрещено системой изменение нового процесса. Из-за возможности состояния гонки многие операционные системы игнорируют установленный атрибут к shell-скриптам[источник не указан 101 день].

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

Установленный setgid атрибут даёт повышение прав группы.

Атрибуты setuid и setgid обычно устанавливаются командой chmod установкой первой пары битов в 4 (setuid) или 2 (setgid). Команда chmod 6711 соответственно установит обе пары битов сразу (4+2=6). Также можно использовать символьные аргументы для установки этих битов командой chmod ug+s.

setuid на каталогах[править | править вики-текст]

Биты setuid и setgid, установленные для каталогов, имеют совсем другой смысл.

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

Наследование устанавливается только для новых файлов и каталогов. Уже существующим файлам и каталогам этот бит нужно устанавливать вручную, например:

find /path/to/directory -type d -exec chmod g+s {} \;

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

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]$

Безопасность[править | править вики-текст]

Программа с установленным битом suid является «потенциально опасной». В «нормальном» случае она не позволит обычному пользователю сделать то, что выходит за пределы его полномочий (например, программа passwd разрешит пользователю изменить только собственный пароль). Но, даже незначительная ошибка в такой программе может привести к тому, что злоумышленник сможет заставить её выполнить ещё какие-нибудь действия, не предусмотренные автором программы.

См. также[править | править вики-текст]