2.
Это хорошая книга по написанию безопасного программного обеспечения, она включает проблемы setuid. Предполагается, что вы знакомы с основными API Linux/Unix; к моменту прочтения данной книги вы должны быть готовы к ее прочтению.
3. "Setuid Demystified," by Hao Chen, David Wagner, and Drew Dean. Proceedings of the 11th USENIX Security Symposium, August 5–9, 2002 http://www.cs.berkeley.edu/~daw/papers/setuid-usenix02.pdf.
Гарфинкель, Спаффорд и Шварц (Garfinkel, Spafford, Schwartz) рекомендуют прочтение этого материала «до того, как вы даже подумаете о написании кода, который пытается сохранять и восстанавливать привилегии». Мы всецело согласны с ними.
11.10. Резюме
• Использование значений ID пользователя и группы (UID и GID) для идентификации файлов и процессов — вот что превращает Linux и Unix в многопользовательские системы. Процессы имеют значения как действительных, так и эффективных UID и GID, а также набор дополнительных групп. Обычно именно эффективный UID определяет, как один процесс может повлиять на другой, и эффективные UID, GID и набор групп проверяются на соответствие с правами доступа к файлу. Пользователи с эффективным UID, равным нулю, известные как root
или
• Концепции сохраненных set-user ID и set-group ID пришли из System V и были приняты POSIX с полной поддержкой в GNU/Linux. Наличие этих отдельных значений ID дает возможность легко и безошибочно переключать при необходимости действительные и эффективные UID (и GID).
• Программы setuid и setgid создают процессы, в которых действительные и эффективные ID различаются. Программы как таковые помечаются дополнительными битами прав доступа к файлу. Биты setuid и setgid должны быть добавлены к файлу после его создания.
• getuid()
и geteuid()
получают значения действительного и эффективного UID соответственно, a getgid()
и getegid()
получают значения действительного и эффективного GID соответственно, getgroups()
получает набор дополнительных групп, а в среде POSIX может запросить у системы, сколько членов содержит набор групп.
• Функция access()
осуществляет проверку прав доступа к файлу для stat()
сведений может не представить полной картины при условии, что файл может находиться на не родной или сетевой файловой системе.
• Функция GLIBC euidaccess()
сходна с access()
, но осуществляет проверку на основе значений эффективных UID и GID.
• «Липкий» бит и бит setgid при использовании с каталогами привносят дополнительную семантику. Когда для каталога установлен бит setgid, новые файлы в этом каталоге наследуют группу этого каталога. Новые каталоги делают то же самое, они также автоматически наследуют установку бита setgid. Без установленного бита setgid новые файлы и каталоги получают эффективный GID создающего их процесса. «Липкий» бит, установленный для каталогов, в которые в других отношениях разрешена запись, ограничивает право на удаление файла владельцем файла, владельцем каталога и root
.
• Набор групп изменяется с помощью setgroups()
. Эта функция не стандартизована POSIX, но существует на всех современных системах Unix. Ее может использовать лишь root
.
• Изменение UID и GID довольно сложно. Семантика различных системных вызовов с течением времени изменилась. Новые приложения, которые будут изменять лишь свои эффективные UID/GID, должны использовать seteuid()
и setegid()
. Приложения, не действующие от имени root
, могут также устанавливать свои эффективные ID с помощью setuid()
и setgid()
. Вызовы setreuid()
и setregid()
от BSD были предназначены для обмена значениями UID и GID; их использование в новых программах не рекомендуется.
• Приложения, действующие как root
, могут перманентно заменить значения действительного, эффективного и сохраненного ID с помощью setuid()
и setgid()
. Одним из таких примеров является login
, которая должна превратиться из программы, выполняющейся как root
в не непривилегированную зарегистрированную оболочку, выполняющуюся от имени обычного пользователя.
• Функции Linux setresuid()
и setresgid()
следует использовать всегда, когда они доступны, поскольку они обеспечивают самое чистое и наиболее надежное поведение