Различные set*gid()
системные вызовы требуют привилегий для изменения групп, за исключением очень немногих случаев. Изменение основной группы на одну из дополнительных групп процессов, по-видимому, не является одной из них, а это означает, что, например, командам newgrp
/ sg
необходимо повысить привилегии для переключения основной группы.
Есть ли причина, по которой setgid()
/ setegid()
/ setregid()
/ setfsgid()
не разрешаем переходить на дополнительную группу без привилегий? Если так, то в чем причина?
security
group
system-calls
Уильям Хэй
источник
источник
/usr/bin/env
с разрешением setgid).newgrp/sg
относится к базе данных учетных записей, а не к списку дополнительных групп процесса.setgid()
позволит вам покинуть членство в группе (что может быть проблемой безопасности), но с другой стороны вы также можете сделать это с тем же приемом setgid, что и выше, и ваш гид обычно также находится в вашем дополнительном списке (initgroups(3)
принимает аргумент гид только для этого).Ответы:
Конечно, основная загадка здесь состоит в том, что проверки разрешений файловой системы основаны на комбинации (эффективного UID и) эффективного GID и дополнительных GID. Таким образом, с точки зрения проверки прав доступа к файлам эффективный GID эквивалентен дополнительным GID, что приводит к вопросу OP. (Попутно: если мы говорим о Linux, то в действительности при проверке разрешений файловой системы используются именно UID / GID файловой системы, а не эффективные UID и GID, но первые идентификаторы почти всегда имеют те же значения, что и последние идентификаторы. )
Таким образом, должны быть некоторые случаи, когда реальные / эффективные / сохраненные установленные GID не эквивалентны дополнительным GID. (Я группирую GID реального / эффективного / сохраненного набора вместе, потому что обычные правила разрешений set * gid () говорят, что непривилегированный процесс может изменить любой из этих GID на то же значение, что и один из двух других.)
И действительно, есть несколько таких случаев. access (2) выполняет свои проверки на основе реального идентификатора пользователя процесса и идентификатора группы. Если непривилегированный пользователь мог изменить действительный идентификатор группы таким же, как один из дополнительных GID, который не является действующим или сохраненным GID набора, тогда можно было бы манипулировать поведением доступа (2).
Есть и другие подобные случаи. См. Страницу руководства Linux mkdir (2) для примера. В зависимости от того, установлен ли бит режима set-GID в родительском каталоге, новый файл, созданный в каталоге, получает свою групповую собственность от действующего GID процесса создания. Опять же, если непривилегированный процесс может изменить свой эффективный GID таким же, как один из его дополнительных GID, он может неожиданно манипулировать владением группой новыми файлами. Аналогичные комментарии применимы для mknod (2) и вызовов System V IPC semget (2), shmget (2) и msgget (2).
Существуют также некоторые специфичные для Linux случаи, когда реальные / эффективные / сохраненные установленные GID не эквивалентны дополнительным GID. Смотрите, например, process_vm_readv (2) и prlimit (2).
источник
Я думаю, что причина в первую очередь историческая. Дополнительные группы не были добавлены до 4.2BSD (около 1983 года). До этого у вас были только реальные и эффективные подсказки и подсказки.
Поведение для setuid / setgid было полностью симметричным и не имело оснований этого не делать. Вы бы переключали пользователя с помощью
su
и группировали сsg
/newgrp
всеми исполняемыми файлами setuid. Информация о членстве в группе пользователей хранится только в пользовательской базе данных, а не в атрибутах процессов.И интерфейс setuid / setgid не изменился, когда были добавлены дополнительные гиды.
Технически теперь, если у вас есть доступ на запись в файловую систему (где выполнение и setuid / setgid не отключены), вы все равно можете установить свой действительный или реальный идентификатор пользователя для любого из ваших дополнительных гидов (без необходимости прибегать к
sg
/newgrp
which, к примеру, только позволяют перейти к группам, определенным в пользовательской базе данных, которая не обязательно совпадает со списком дополнительных данных процесса).И после выполнения
env
ваш egid переключается наany-sup-group
.источник