Obviamente, o enigma fundamental aqui é que as verificações de permissão do sistema de arquivos se baseiam na combinação (do UID efetivo e) do GID efetivo e dos GIDs complementares. Portanto, do ponto de vista das verificações de permissões de arquivo, o GID efetivo é equivalente aos GIDs suplementares, o que leva à pergunta do OP. (De passagem: se estamos falando sobre Linux, na verdade são os UID / GID do sistema de arquivos usados nas verificações de permissão do sistema de arquivos, em vez dos UID e GID efetivos, mas os IDs anteriores quase sempre têm os mesmos valores que os IDs anteriores. )
Portanto, deve haver alguns casos em que os GIDs reais / efetivos / salvos não são equivalentes aos GIDs suplementares. (Agrupo os GIDs reais / efetivos / conjunto salvo, porque as regras normais de permissão set * gid () dizem que um processo sem privilégios pode alterar qualquer um desses GIDs para o mesmo valor que um dos outros dois.
E, de fato, existem alguns desses casos. O access (2) faz suas verificações com base no ID do usuário real e no ID do grupo. Se um usuário sem privilégio conseguir alterar o ID do grupo real para ser o mesmo de um dos GIDs suplementares que não são o GID definido ou salvo ou salvo, o comportamento do acesso (2) poderá ser manipulado.
Existem outros casos desse tipo. Veja a página do manual Linux mkdir (2) , para um exemplo. Dependendo se o bit do modo set-GID está definido no diretório pai, um novo arquivo criado no diretório obtém sua propriedade de grupo do GID efetivo do processo de criação. Novamente, se um processo sem privilégios puder mudar seu GID efetivo para ser o mesmo que um de seus GIDs complementares, ele poderá manipular a propriedade do grupo de novos arquivos de maneiras inesperadas. Comentários semelhantes se aplicam ao mknod (2) e o IPC do System V chama semget (2), shmget (2) e msgget (2).
Há também alguns casos específicos do Linux em que os GIDs reais / efetivos / salvos não são equivalentes aos GIDs suplementares. Veja process_vm_readv (2) e prlimit (2), por exemplo.
/usr/bin/env
com a permissão setgid).