setuid - setuid

В Unix флагов прав доступа УИП и setgid (сокращенно «заданный идентификатор пользователя» и «установить идентификатор группы») позволяют пользователям запускать исполняемый файл с файловой системой разрешениями владельца исполняемого или групп соответственно и к поведению изменения в каталогах. Они часто используются, чтобы позволить пользователям компьютерной системы запускать программы с временно повышенными привилегиями для выполнения определенной задачи. Хотя предполагаемый идентификатор пользователя или предоставляемые привилегии идентификатора группы не всегда повышаются, как минимум они являются конкретными.

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

Эффекты

setuidИ setgidфлаги имеют различные эффекты, в зависимости от того , применяются ли они к файлу, к каталогу или двоичной или отсутствия двоичного исполняемого файла. setuidИ setgidфлаги имеют эффект только на бинарных исполняемых файлов , а не на скриптах (например, Bash, Perl, Python).

При установке на исполняемый файл

Когда атрибуты setuidили setgidустановлены для исполняемого файла, то любые пользователи, способные выполнить файл, будут автоматически выполнять файл с привилегиями владельца файла (обычно root ) и / или группы файла, в зависимости от установленных флагов. Это позволяет разработчику системы разрешить запуск доверенных программ, которые в противном случае пользователю не разрешили бы выполнять. Это не всегда может быть очевидным. Например, команде ping может потребоваться доступ к сетевым привилегиям, к которым не может получить доступ обычный пользователь; поэтому ему может быть присвоен флаг setuid, чтобы гарантировать, что пользователь, которому нужно выполнить эхо-запрос для другой системы, может это сделать, даже если его собственная учетная запись не имеет необходимых привилегий для отправки пакетов.

В целях безопасности, вызывающий пользователь, как правило , запрещены системы от изменения нового процесса каким - либо образом, например, с использованием ptrace, LD_LIBRARY_PATHили передачи сигналов к нему, чтобы использовать повышенную привилегию, хотя сигналы от терминала по- прежнему будет принят.

setuidИ setgidбиты обычно устанавливает с помощью команды chmod, установив высокие порядка восьмеричную цифру 4 для setuidили 2 для setgid. « » Будет установить как и биты (4 + 2 = 6), что делает файл чтение / запись / исполняемый для владельца (7) и исполняемый группой (1) первая и вторая другие (1). Когда пользователь, не являющийся владельцем, выполняет файл, процесс запускается с разрешениями пользователя и группы, установленными для него его владельцем. Например, если файл принадлежит пользователю и группе , он будет запускаться независимо от того, кто запускает файл. chmod 6711 filesetuidsetgidrootwheelroot:wheel

Большинство реализаций chmodкоманды также поддерживают более мелкие символьные аргументы для установки этих битов. Предпочтительно более мелкозернистый режим показан на демонстрации ниже как " chmod ug+s"

Влияние на безопасность

Хотя эта setuidфункция очень полезна во многих случаях, ее неправильное использование может представлять угрозу безопасности, если setuidатрибут назначается исполняемым программам, которые не были тщательно спроектированы. Из-за потенциальных проблем безопасности многие операционные системы игнорируют setuidатрибут при применении к исполняемым сценариям оболочки .

Наличие setuidисполняемых файлов объясняет, почему chrootсистемный вызов недоступен для пользователей без полномочий root в Unix. См. Ограниченияchroot для более подробной информации.

При установке в каталоге

Установка setgidразрешения для каталога (" chmod g+s") заставляет новые файлы и подкаталоги, созданные в нем, наследовать его идентификатор группы , а не основной идентификатор группы пользователя, создавшего файл (идентификатор владельца никогда не затрагивается, только идентификатор группы) .

  1. Вновь созданные подкаталоги наследуют setgidбит. Таким образом, это позволяет создать общую рабочую область для группы без неудобств, связанных с необходимостью того, чтобы члены группы явно изменяли свою текущую группу перед созданием новых файлов или каталогов.
  2. влияет только на идентификатор группы новых файлов и подкаталогов, созданных после установки setgidбита, и не применяется к существующим объектам.
  3. не влияет на идентификатор группы файлов, которые созданы в другом месте и перемещены в соответствующий каталог. Файл будет по-прежнему содержать идентификатор группы, который был применен, когда и где он был создан.

Установка setgidбита в существующих подкаталогах должна выполняться вручную с помощью такой команды, какfind /path/to/directory -type d -exec chmod g+s '{}' \;

Набор setuidразрешений для каталога игнорируется в большинстве систем UNIX и Linux . Однако FreeBSD может быть настроен для интерпретации setuidаналогично setgid, и в этом случае он заставляет все файлы и подкаталоги, созданные в каталоге, принадлежать владельцу этого каталога - простая форма наследования. Обычно это не требуется в большинстве систем, основанных на BSD , поскольку по умолчанию каталоги обрабатываются так, как будто их setgidбит всегда установлен, независимо от фактического значения. Как указано в open(2): «Когда создается новый файл, ему дается группа каталога, в котором он находится».

Примеры

Проверка разрешений

Права доступа к файлу можно проверить в восьмеричной и / или буквенной форме с помощью инструмента командной строки. stat

[ torvalds ~ ] $ stat -c "%a %A" ~/test/
1770 drwxrwx--T

SUID

4701 для исполняемого файла, принадлежащего root и группе root

Пользователь с именем thompson пытается запустить файл. Установлено разрешение на выполнение для всех пользователей («1»), поэтому «Томпсон» может выполнить файл. Владелец файла - «root», и установлено разрешение SUID («4»), поэтому файл выполняется как «root».

Причина, по которой исполняемый файл будет запускаться как «root», заключается в том, что он может изменять определенные файлы, которые обычно не разрешены пользователю, без предоставления пользователю полного root-доступа.

Использование этого параметра по умолчанию можно увидеть в /usr/bin/passwdдвоичном файле. /usr/bin/passwdнеобходимо изменить /etc/passwdи /etc/shadowкоторые хранят информацию об учетной записи и хэши паролей для всех пользователей, и они могут быть изменены только пользователем root.

[ thompson ~ ] $ stat -c "%a %U:%G %n" /usr/bin/passwd
4701 root:root /usr/bin/passwd

[ thompson ~ ] $ passwd
passwd: Changing password for thompson

Владелец процесса - это не пользователь, запустивший исполняемый файл, а владелец исполняемого файла.

SGID

2770 в каталоге с именем «музыка», принадлежащем пользователю «root» и группе «инженеры».

Пользователь с именем «torvalds», который принадлежит в первую очередь к группе «torvalds», но во вторую очередь к группе «инженеры», создает каталог с именем «electronic» в каталоге с именем «music». Групповое владение новым каталогом под названием «electronic» наследует «инженеров». То же самое и при создании нового файла с именем «imag.txt».

Без SGID групповое владение новым каталогом / файлом было бы «torvalds», поскольку это основная группа пользователей «torvalds».

[ torvalds ~ ] $ groups torvalds
torvalds : torvalds engineers

[ torvalds ~ ] $ stat -c "%a %U:%G %n" ./music/
2770 root:engineers ./music/

[ torvalds ~ ] $ mkdir ~/music/electronic

[ torvalds ~ ] $ stat -c "%U:%G %n" ./music/electronic/
torvalds:engineers ./music/electronic/

[ torvalds ~ ] $ echo 'NEW FILE' > ./music/imagine.txt

[ torvalds ~ ] $ stat -c "%U:%G %n" ./music/imagine.txt
torvalds:engineers ./music/imagine.txt

[ torvalds ~ ] $ touch ~/test

[ torvalds ~ ] $ stat -c "%U:%G %n" ~/test
torvalds:torvalds ~/test

Липкий кусочек

1770 г. в каталоге «видеоигры», принадлежащем пользователю «torvalds» и группе «инженеры».

Пользователь с именем «torvalds» создает файл с именем «tekken» в каталоге с именем «videogames». Пользователь с именем «возняк», который также входит в группу «инженеры», пытается удалить файл с именем «tekken», но не может, поскольку он не является владельцем.

Без липкого бита «возняк» мог бы удалить файл, потому что каталог с именем «видеоигры» разрешает чтение и запись «инженерам». Его использование по умолчанию можно увидеть в /tmpпапке.

[ torvalds /home/shared/ ] $ groups torvalds
torvalds : torvalds engineers

[ torvalds /home/shared/ ] $ stat -c "%a  %U:%G  %n" ./videogames/
1770  torvalds:engineers  ./videogames/

[ torvalds /home/shared/ ] $ echo 'NEW FILE' > videogames/tekken

[ torvalds /home/shared/ ] $ su - wozniak
Password:

[ wozniak ~/ ] $ groups wozniak
wozniak : wozniak engineers

[ wozniak ~/ ] $ cd /home/shared/videogames

[ wozniak /home/shared/videogames/ ] $ rm tekken
rm: cannot remove ‘tekken’: Operation not permitted

Клейкая насадка с SGID

3171 в каталоге с именем "блог", принадлежащем группе "инженеры" и пользователю "root".

Пользователь с именем «torvalds», который принадлежит в первую очередь к группе «torvalds», но во вторую очередь к группе «инженеры», создает файл или каталог с именем «мысли» внутри каталога «блог». Пользователь с именем «возняк», который также принадлежит к группе «инженеры», не может удалить, переименовать или переместить файл или каталог с именем «мысли», поскольку он не является владельцем и установлен бит закрепления. Однако, если «мысли» - это файл, то «возняк» может его редактировать.

Окончательное решение остается за липкой битой. Если липкий бит и SGID не были установлены, пользователь «возняк» мог переименовать, переместить или удалить файл с именем «мысли», потому что каталог с именем «блог» позволяет читать и писать по группе, а возняк принадлежит к группе, и umask 0002 по умолчанию позволяет редактировать новые файлы по группам. Бит залипания и SGID можно комбинировать с чем-то вроде umask только для чтения или атрибута только для добавления.

[ torvalds /home/shared/ ] $ groups torvalds
torvalds : torvalds engineers

[ torvalds /home/shared/ ] $ stat -c "%a  %U:%G  %n" ./blog/
3171  root:engineers  ./blog/

[ torvalds /home/shared/ ] $ echo 'NEW FILE' > ./blog/thoughts

[ torvalds /home/shared/ ] $ su - wozniak
Password:

[ wozniak ~/ ] $ cd /home/shared/blog

[ wozniak /home/shared/blog/ ] $ groups wozniak
wozniak : wozniak engineers

[ wozniak /home/shared/blog/ ] $ stat -c "%a  %U:%G  %n" ./thoughts
664  torvalds:engineers  ./thoughts

[ wozniak /home/shared/blog/ ] $ rm thoughts
rm: cannot remove ‘thoughts’: Operation not permitted

[ wozniak /home/shared/blog/ ] $ mv thoughts /home/wozniak/
mv: cannot move ‘thoughts’ to ‘/home/wozniak/thoughts’: Operation not permitted

[ wozniak /home/shared/blog/ ] $ mv thoughts pondering
mv: cannot move ‘thoughts’ to ‘pondering’: Operation not permitted

[ wozniak /home/shared/blog/ ] $ echo 'REWRITE!' > thoughts

[ wozniak /home/shared/blog/ ] $ cat thoughts
REWRITE!

Безопасность

Разработчики проектируют и реализуют программы, которые осторожно используют этот бит в исполняемых файлах, чтобы избежать уязвимостей безопасности, включая переполнение буфера и внедрение пути . Успешные атаки с переполнением буфера на уязвимые приложения позволяют злоумышленнику выполнить произвольный код с правами используемого процесса. В случае, если уязвимый процесс использует setuidбит для запуска от rootимени, код будет выполняться с привилегиями root, фактически предоставляя злоумышленнику root-доступ к системе, в которой запущен уязвимый процесс.

Особое значение в случае setuidпроцесса имеет окружение процесса. Если среда не очищена должным образом с помощью привилегированного процесса, его поведение может быть изменено непривилегированным процессом, который его запустил. Например, GNU Libc был в одной точке уязвимы для эксплуатации с использованием setuidи переменной среды , которая позволяла выполнение кода из ненадежных разделяемых библиотек .

История

setuidБит был изобретен Деннис Ритчи и включены в su. Его работодатель, тогдашняя компания Bell Telephone Laboratories , подал заявку на патент в 1972 году; патент был получен в 1979 году под номером US 4135240  «Защита содержимого файлов данных». Позже патент стал общественным достоянием .

Смотрите также

Рекомендации

Внешние ссылки