Конечно, основная загадка здесь состоит в том, что проверки разрешений файловой системы основаны на комбинации (эффективного 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).
/usr/bin/env
с разрешением setgid).