успокоился
Unix . и Linux Флаги прав доступа setuid и setgid (сокращение от set user и set groupident ) [1] разрешить пользователям запускать исполняемый файл с разрешениями файловой системы владельца или группы исполняемого файла соответственно и изменять поведение в каталогах. Они часто используются, чтобы позволить пользователям компьютерной системы запускать программы с временно повышенными привилегиями для выполнения определенной задачи. Хотя предоставляемые привилегии предполагаемого идентификатора пользователя или идентификатора группы не всегда повышены, они, как минимум, специфичны.
Флаги setuid
и setgid
необходимы для задач, которые требуют иных привилегий, чем те, которые обычно предоставляются пользователю, например, возможность изменять системные файлы или базы данных для изменения своего пароля для входа. [2] Однако некоторые задачи, требующие дополнительных привилегий, могут быть не сразу очевидны, например ping
команда, которая должна отправлять и прослушивать пакеты управления на сетевом интерфейсе.
Режимы файлов
[ редактировать ]The setuid
и setgid
биты обычно представляются как значения 4 для setuid
и 2 для setgid
в старшей восьмеричной цифре файлового режима. Например, 6711
имеет оба setuid
и setgid
набор битов ( 4 + 2 = 6 ), а также файл, доступный для чтения/записи/исполняемый для владельца (7), и исполняемый для группы (первый 1) и остальных (второй 1). Большинство реализаций имеют символическое представление этих битов; в предыдущем примере это могло быть u=rwx,go=x,ug+s
.
Обычно chmod
не имеет рекурсивного режима, ограниченного каталогами, поэтому изменение существующего дерева каталогов необходимо выполнять вручную с помощью такой команды, как find /path/to/directory -type d -exec chmod g+s '{}' '\'
.
Эффекты
[ редактировать ]The setuid
и setgid
флаги имеют разные эффекты в зависимости от того, применяются ли они к файлу, каталогу, двоичному или недвоичному исполняемому файлу. setuid
и setgid
флаги действуют только на двоичные исполняемые файлы, а не на сценарии (например, Bash, Perl, Python). [3]
При установке в исполняемом файле
[ редактировать ]Когда setuid
или setgid
атрибуты установлены для исполняемого файла, тогда любые пользователи, способные выполнить файл, автоматически запустят его с привилегиями владельца файла (обычно root ) и/или группы файла, в зависимости от установленных флагов. [2] Это позволяет разработчику системы разрешить запуск доверенных программ, которые в противном случае пользователь не смог бы выполнить. Это не всегда может быть очевидно. Например, команде ping может потребоваться доступ к сетевым привилегиям, к которым обычный пользователь не имеет доступа; поэтому ему может быть присвоен флаг setuid, чтобы гарантировать, что пользователь, которому необходимо проверить связь с другой системой, сможет это сделать, даже если его учетная запись не имеет необходимых привилегий для отправки пакетов.
Влияние на безопасность
[ редактировать ]В целях безопасности вызывающему пользователю система обычно запрещает каким-либо образом изменять новый процесс, например, используя ptrace
, LD_LIBRARY_PATH
или отправлять на него сигналы, чтобы воспользоваться повышенными привилегиями, хотя сигналы от терминала по-прежнему будут приниматься.
В то время как setuid
функция очень полезна во многих случаях, ее неправильное использование может представлять угрозу безопасности [2] если setuid
Атрибут присваивается исполняемым программам, которые не разработаны тщательно. Из-за потенциальных проблем с безопасностью, [4] многие операционные системы игнорируют setuid
атрибут при применении к исполняемым сценариям оболочки . [ нужна ссылка ]
Наличие setuid
исполняемые файлы объясняет, почему chroot
системный вызов недоступен пользователям, не являющимся пользователем root, в Unix. См. ограничения chroot
для более подробной информации.
При установке в каталоге
[ редактировать ]Установка setgid
разрешение на доступ к каталогу приводит к тому, что файлы и подкаталоги, созданные в нем, наследуют владение группой, а не основной группой процесса создания файла. Созданные подкаталоги также наследуют setgid
кусочек. Политика применяется только во время создания и, следовательно, только в перспективе. Каталоги и файлы, существующие, когда setgid
бит не затрагивается, как и каталоги и файлы, перемещаемые в каталог, в котором установлен бит.
Таким образом, предоставляется возможность работать с файлами среди группы пользователей без явной установки разрешений, но она ограничена ожиданием модели безопасности, что существующие разрешения для файлов не изменяются неявно.
The setuid
разрешения, установленные для каталога, игнорируются в большинстве систем UNIX и Linux . [5] [ нужна ссылка ] Однако FreeBSD можно настроить для интерпретации setuid
способом, похожим на setgid
, и в этом случае он заставляет все файлы и подкаталоги, созданные в каталоге, принадлежать владельцу этого каталога - простая форма наследования. [6] Обычно это не требуется в большинстве систем, основанных на BSD , поскольку по умолчанию каталоги обрабатываются так, как будто они setgid
бит всегда установлен, независимо от фактического значения. Как сказано в open(2)
, «При создании нового файла ему присваивается группа каталога, в котором он содержится». [7]
Примеры
[ редактировать ]Проверка разрешений
[ редактировать ]Разрешения файла можно проверить в восьмеричной и/или алфавитной форме с помощью инструмента командной строки. stat
[ torvalds ~ ] $ stat -c "%a %A" ~/test/
1770 drwxrwx--T
ЮГ
[ редактировать ]4701 в исполняемом файле, принадлежащем root и группе root.
Пользователь с именем «Томпсон» пытается выполнить файл. Для всех пользователей установлено разрешение на исполнение («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
Владельцем процесса является не пользователь, запустивший исполняемый файл, а владелец исполняемого файла.
ОБУВЬ
[ редактировать ]2770 в каталоге с именем «музыка», принадлежащем пользователю «root» и группе «инженеры».
Пользователь с именем «torvalds», который принадлежит в первую очередь к группе «torvalds», а затем к группе «инженеры», создает каталог с именем «electronic» в каталоге с именем «music». Групповое владение новым каталогом под названием «электронный» наследуется «инженерами». То же самое происходит при создании нового файла с именем «imagine.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» создает файл с именем «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».
Пользователь с именем «Торвальдс», который принадлежит в первую очередь к группе «Торвальдс», но во вторую очередь к группе «инженеры», создает файл или каталог с именем «мысли» внутри каталога «блог». Пользователь с именем «возняк», который также принадлежит к группе «инженеры», не может удалить, переименовать или переместить файл или каталог с именем «мысли», поскольку он не является владельцем и установлен бит закрепления. Однако если «мысли» — это файл, то «Возняк» может его редактировать.
Окончательное решение принимает Sticky Bit. Если бы липкий бит и SGID не были установлены, пользователь «Возняк» мог бы переименовать, переместить или удалить файл с именем «мысли», поскольку каталог с именем «блог» разрешает чтение и запись группой, а Возняк принадлежит к группе, и по умолчанию 0002 маска позволяет редактировать новые файлы по группам. Бит Sticky и 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
Процесс – это среда процесса. Если среда не очищается должным образом привилегированным процессом, ее поведение может быть изменено непривилегированным процессом, который ее запустил. [8] Например, GNU libc в какой-то момент была уязвима для эксплойта с использованием setuid
и переменная среды, которая позволяла выполнять код из ненадежных общих библиотек . [9]
История
[ редактировать ]The setuid
бит был изобретен Деннисом Ритчи [10] и включен в su
. [10] Его работодатель, тогда еще Bell Telephone Laboratories , подал заявку на патент в 1972 году; патент был выдан в 1979 году под номером патента US 4135240 «Защита содержимого файлов данных». Позже патент был помещен в общественное достояние . [11]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ фон Хаген, Уильям (13 мая 2010 г.). Библия Ubuntu Linux . стр. 3–59. ISBN 9780470881804 .
- ^ Перейти обратно: а б с Фриш, Элин (9 февраля 2009 г.). Основное системное администрирование . О'Рейли. п. 351. ИСБН 9780596550493 .
- ^ Биллимория, Кайван Н. (2018). Практическое системное программирование в Linux: изучите интерфейсы, теорию и практику системного программирования Linux . Packt Publishing Ltd. с. 250. ИСБН 978-1-78899-674-7 .
- ^ «Unix — Часто задаваемые вопросы» .
- ^ «27.5 Каталоги и биты Set-User-ID и Set-Group-ID» . GNU Coreutils 9.1 . Фонд свободного программного обеспечения . Проверено 13 декабря 2022 г.
- ^ «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. Лаборатории Белла. 139.
- ^ «Краткое описание ключевых патентов на программное обеспечение» .
Внешние ссылки
[ редактировать ]- Чен, Хао; Вагнер, Дэвид ; и Дин, Дрю; Сетуид демистифицирован (pdf)
- Цафрир, Дэн; Да Силва, Дилма ; и Вагнер, Дэвид; Мрачная проблема изменения идентичности процесса: демистификация пересмотра Setuid (pdf)
- Поллок, Уэйн; файлов и каталогов Unix Разрешения и режимы