WikiDer > Setuid

Setuid

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

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

Последствия

В Setuid и Setgid флаги имеют разные эффекты, в зависимости от того, применяются ли они к файлу, к каталогу, двоичному исполняемому или небинарному исполняемому файлу. В Setuid и Setgid флаги действуют только на двоичные исполняемые файлы. Установка этих битов в скриптах, таких как bash, perl или python, не имеет никакого эффекта.[3]

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

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

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

В Setuid и Setgid биты обычно устанавливаются с помощью команды chmod установив для восьмеричной цифры старшего разряда значение 4 для Setuid или 2 для Setgid. "chmod 6711 файл"установит как Setuid и Setgid бит (4 + 2 = 6), что делает файл доступным для чтения / записи / выполнения для владельца (7) и исполняемым для группы (первая 1) и других (вторая 1). Когда пользователь, не являющийся владельцем, запускает файл, процесс запускается с разрешениями пользователя и группы, установленными для него его владельцем. Например, если файл принадлежит пользователю корень и группа рулевое колесо, он будет работать как корень: колесо независимо от того, кто запускает файл.

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

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

В то время Setuid функция очень полезна во многих случаях, ее неправильное использование может представлять угрозу безопасности[2] если Setuid атрибут присваивается исполняемый файл программы, которые не были тщательно разработаны. Из-за потенциальных проблем с безопасностью[4] многие операционные системы игнорируют Setuid атрибут при применении к исполняемому файлу сценарии оболочки.

Наличие Setuid исполняемые файлы объясняют, почему chroot системный вызов недоступен для не-корень пользователи Unix. Видеть ограничения chroot Больше подробностей.

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

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

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

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

В Setuid набор разрешений для каталога игнорируется в большинстве UNIX и Linux системы.[нужна цитата] Однако FreeBSD можно настроить для интерпретации Setuid аналогично Setgid, и в этом случае он заставляет все файлы и подкаталоги, созданные в каталоге, принадлежать владельцу этого каталога - простая форма наследования.[5] Обычно это не требуется в большинстве систем, производных от BSD, поскольку по умолчанию каталоги обрабатываются так, как если бы их Setgid бит всегда установлен, независимо от фактического значения. Как сказано в открытый (2), "При создании нового файла ему дается группа каталога, в котором он находится."[6]

Примеры

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

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

[Торвальдс ~] $ stat -c "% a% A" ~ / test /1770 drwxrwx - Т

SUID

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

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

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

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

[Томпсон ~] $ stat -c "% a% U:% G% n" / usr / bin / passwd4701 корень: корень / usr / bin / passwd[Томпсон ~] $ парольpasswd: Смена пароля для Томпсона

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

SGID

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

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

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

[Торвальдс ~] $ группы ТорвальдсТорвальдс: инженеры Торвальдса[Торвальдс ~] $ stat -c "% a% U:% G% n" ./Музыка/2770 root: инженеры ./music/[Торвальдс ~] $ mkdir ~ / музыка / электроника[Торвальдс ~] $ stat -c "% U:% G% n" ./music/electronic/Торвальдс: инженеры ./music/electronic/[Торвальдс ~] $ эхо 'НОВЫЙ ФАЙЛ' > ~ / музыка / think.txt[Торвальдс ~] $ stat -c "% U:% G% n" ./music/imagine.txtТорвальдс: инженеры ./music/imagine.txt[Торвальдс ~] $ коснуться ~ / тест[Торвальдс ~] $ stat -c "% U:% G% n" ~ / testtorvalds: torvalds ~ / test

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

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

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

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

[torvalds / home / shared /] $ группы ТорвальдсТорвальдс: инженеры Торвальдса[torvalds / home / shared /] $ stat -c "% a% U:% G% n" ./видеоигры/1770 торвальдс: инженеры ./videogames/[torvalds / home / shared /] $ эхо 'НОВЫЙ ФАЙЛ' > видеоигры / tekken[torvalds / home / shared /] $ су - вознякПароль:[возняк ~ /] $ группы возняквозняк: возняк инженеры[возняк ~ /] $ CD / главная / общий / видеоигры[возняк / главная / общий / видеоигры /] $ RM Tekkenrm: невозможно удалить «tekken»: операция запрещена

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

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

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

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

[torvalds / home / shared /] $ группы ТорвальдсТорвальдс: инженеры Торвальдса[torvalds / home / shared /] $ stat -c "% a% U:% G% n" ./blog/3171 корень: инженеры ./blog/[torvalds / home / shared /] $ эхо 'НОВЫЙ ФАЙЛ' > ./blog/ Thinks[torvalds / home / shared /] $ су - вознякПароль:[возняк ~ /] $ CD / главная / общий / блог[возняк / дом / общий / блог /] $ группы возняквозняк: возняк инженеры[возняк / дом / общий / блог /] $ stat -c "% a% U:% G% n" ./мысли664 торвальдса: инженеры. / Мысли[возняк / дом / общий / блог /] $ rm мыслиrm: невозможно удалить «мысли»: операция запрещена[возняк / дом / общий / блог /] $ мысли мв / главная / возняк /mv: невозможно переместить "мысли" в "/ home / wozniak / Think": операция не разрешена[возняк / дом / общий / блог /] $ мысли обдумываяmv: нельзя переместить «мысли» в «размышления»: операция запрещена[возняк / дом / общий / блог /] $ эхо "ПЕРЕПИСАТЬ!" > мысли[возняк / дом / общий / блог /] $ кошачьи мыслиПЕРЕПИСАТЬ!

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

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

Особенно важно в случае Setuid процесс Окружающая среда процесса. Если среда не очищена должным образом привилегированным процессом, его поведение может быть изменено непривилегированным процессом, который его запустил.[7] Например, GNU libc в какой-то момент был уязвим для эксплуатировать с помощью Setuid и переменную среды, которая позволяла выполнять код из ненадежных общие библиотеки.[8]

История

В Setuid бит был изобретен Деннис Ричи[9] и включен в вс.[9] Тогда его работодатель Bell Telephone Laboratoriesподал заявку на патент в 1972 г .; патент был выдан в 1979 году под номером патента США 4135240  «Защита содержимого файлов данных». Позже патент был помещен в всеобщее достояние.[10]

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

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

  1. ^ фон Хаген, Уильям (13.05.2010). Библия Ubuntu Linux. С. 3–59. ISBN 9780470881804.
  2. ^ а б c Фриш, Элин (09.02.2009). Основное системное администрирование. О'Рейли. п. 351. ISBN 9780596550493.
  3. ^ Биллимория, Кайвань Н. (2018). Практическое системное программирование с Linux: изучение интерфейсов системного программирования Linux, теории и практики. Packt Publishing Ltd. стр. 250. ISBN 978-1-78899-674-7.
  4. ^ «Unix - часто задаваемые вопросы».
  5. ^ "chmod - изменить режимы файлов". freebsd.org.
  6. ^ "open, openat - открыть или создать файл для чтения, записи или выполнения". freebsd.org.
  7. ^ Нил Браун (23 ноября 2010 г.). «Призраки прошлого Unix, часть 4: Проекты, требующие особого обслуживания». LWN.net. Получено 30 марта 2014.
  8. ^ Джейк Эдж (27 октября 2010 г.). «Две уязвимости в glibc». LWN.net. Получено 30 марта 2014.
  9. ^ а б Макилрой, М. Дуглас (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Bell Labs. 139.
  10. ^ «Краткое изложение основных патентов на программное обеспечение».

внешняя ссылка