Pourquoi les privilèges sont-ils requirejs pour setgid () en groupes supplémentaires

Les différents appels système set*gid() nécessitent des privilèges pour changer de groupe, sauf dans quelques cas très rares. La modification du groupe principal en l'un des groupes supplémentaires des process ne semble pas être l'un d'eux, ce qui signifie que les commands newgrp / sg par exemple, doivent élever les privilèges pour changer de groupe primaire.

Y at-il une raison pour que setgid() / setegid() / setregid() / setfsgid() ne permette pas de passer à un groupe supplémentaire sans privilèges? Si oui, quelle est la raison?

Bien sûr, l'énigme fondamentale ici est que les vérifications d'autorisation de système de files sont basées sur la combinaison de (l'UID effectif et) le GID efficace et les GID supplémentaires. Ainsi, du sharepoint vue des vérifications d'permissions de files, le GID effectif est équivalent aux GID supplémentaires, ce qui conduit à la question de l'OP. En passant, si on parle de Linux, c'est en fait le système de files UID / GID qui est utilisé dans les controls d'autorisation du système de files, plutôt que les UID et GID effectifs, mais les anciens ID ont presque toujours les mêmes valeurs que les derniers ID. )

Il doit donc y avoir des cas où les GID réels / effectifs / sauvegardés ne sont pas équivalents aux GID supplémentaires. (Je regroupe les GID réels / effectifs / sauvegardés set, car les règles d'autorisation normales set * gid () disent qu'un process non privilégié peut changer l'un 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 user réel et de l'ID de groupe du process. Si un user non privilégié a pu changer l'ID de groupe réel pour qu'il soit le même que l'un des GID supplémentaires qui n'est pas l'set effectif ou enregistré, alors le comportement de access (2) pourrait être manipulé.

Il y a d'autres cas semblables. Voir la page de manuel Linux mkdir (2) , par exemple. Selon que le bit du mode set-GID est défini sur le directory parent, un nouveau file créé dans le directory prend sa propriété de groupe à partir du GID effectif du process de création. Encore une fois, si un process non privilégié pouvait changer son GID effectif pour qu'il soit identique à l'un de ses GID supplémentaires, il pourrait manipuler la propriété de groupe de nouveaux files de manière inattendue. Des commentaires similaires s'appliquent pour mknod (2) et les appels IPC System V semget (2), shmget (2) et msgget (2).

Il existe également des cas spécifiques à Linux où les GID de l'set réel / effectif / enregistré ne sont pas équivalents aux GID supplémentaires. Voir process_vm_readv (2) et prlimit (2), par exemple.

Je pense que la raison est principalement historique. Les groupes supplémentaires n'ont pas été ajoutés jusqu'à 4.2BSD (vers 1983). Avant cela, vous ajoutez uniquement les uids et les gids réels et efficaces.

Le comportement de setuid / setgid était complètement symésortingque et n'avait aucune raison de ne pas l'être. Vous newgrp user avec su , et newgrp avec sg / newgrp tous les exécutables setuid. Les informations sur l'appartenance à un groupe d'users résidaient uniquement dans la database des users, et non dans les attributes des process.

Et l'interface setuid / setgid n'a pas été changée lorsque des gids supplémentaires ont été ajoutés.

Techniquement, si vous avez un access en écriture à un système de files (où exécution et setuid / setgid ne sont pas désactivés), vous pouvez toujours définir votre ID user effectif ou réel sur n'importe lequel de vos gids supplémentaires (sans devoir recourir à sg / newgrp qui btw ne permettent que de passer aux groupes définis dans la database des users, ce qui n'est pas forcément la même que la list des gids supplémentaires du process).

 cp /usr/bin/env . chgrp any-sup-group env chmod g+s ./env 

Et lors de l'exécution d' env , votre egid passe à any-sup-group .