Bien sûr, le casse-tête fondamental ici est que les vérifications des autorisations du système de fichiers sont basées sur la combinaison (de l'UID effectif et) du GID effectif et des GID supplémentaires. Ainsi, du point de vue des vérifications des autorisations de fichiers, le GID effectif est équivalent aux GID supplémentaires, ce qui conduit à la question du PO. (En passant: si nous parlons de Linux, ce sont en fait l'UID / GID du système de fichiers qui sont utilisés dans les vérifications des autorisations du système de fichiers, plutôt que l'UID et le GID effectifs, mais les anciens ID ont presque toujours les mêmes valeurs que les derniers ID. )
Ainsi, il doit y avoir des cas où les GID réels / effectifs / enregistrés ne sont pas équivalents aux GID supplémentaires. (Je regroupe les GID réels / effectifs / enregistrés ensemble, car les règles d'autorisation set * gid () normales indiquent qu'un processus non privilégié peut changer n'importe lequel de ces GID à la même valeur que l'un des deux autres.)
Et en effet, il y a quelques cas de ce genre. access (2) effectue ses vérifications en fonction de l' ID utilisateur réel et de l'ID de groupe du processus . Si un utilisateur non privilégié était en mesure de modifier l'ID de groupe réel pour qu'il soit le même que l'un des GID supplémentaires qui n'est pas le GID effectif ou enregistré, alors le comportement d'accès (2) pourrait être manipulé.
Il existe d'autres cas de ce genre. Voir la page de manuel Linux mkdir (2) , pour un exemple. Selon que le bit du mode set-GID est défini sur le répertoire parent, un nouveau fichier créé dans le répertoire prend la propriété de son groupe à partir du GID effectif du processus de création. Encore une fois, si un processus non privilégié pouvait changer son GID effectif pour être identique à l'un de ses GID supplémentaires, il pourrait manipuler la propriété de groupe de nouveaux fichiers de manière inattendue. Des commentaires similaires s'appliquent à mknod (2) et aux appels IPC System V semget (2), shmget (2) et msgget (2).
Il existe également des cas spécifiques à Linux où les GID d'ensemble réels / effectifs / enregistrés ne sont pas équivalents aux GID supplémentaires. Voir process_vm_readv (2) et prlimit (2), par exemple.
/usr/bin/env
avec l'autorisation setgid).