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