Les divers set*gid()
appels système nécessitent des privilèges pour changer de groupe, sauf dans de très rares cas. La modification du groupe principal en l'un des groupes supplémentaires des processus ne semble pas être l'un d'eux, ce qui signifie que les commandes newgrp
/, sg
par exemple, doivent élever les privilèges pour changer de groupe principal.
Y a-t-il une raison pour laquelle setgid()
/ setegid()
/ setregid()
/ setfsgid()
ne permet pas de passer à un groupe supplémentaire sans privilèges? Si oui, quelle en est la raison?
security
group
system-calls
William Hay
la source
la source
/usr/bin/env
avec l'autorisation setgid).newgrp/sg
fait référence à la base de données des comptes et non à la liste de groupes supplémentaires du processus.setgid()
vous permettrait de quitter l'appartenance à un groupe (ce qui serait un problème de sécurité), mais vous pouvez également le faire avec la même astuce exécutable setgid que ci-dessus, et votre gid est généralement également dans votre liste supplémentaire (initgroups(3)
prend un argument gid juste pour cela).Réponses:
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.
la source
Je pense que la raison est avant tout historique. Les groupes supplémentaires n'ont pas été ajoutés avant 4.2BSD (vers 1983). Avant cela, vous n'aviez que les uids et les gids réels et efficaces.
Le comportement de setuid / setgid était complètement symétrique et n'avait aucune raison de ne pas l'être. Vous devez changer d'utilisateur avec
su
et regrouper avecsg
/newgrp
tous les exécutables setuid. Les informations sur l'appartenance à un groupe d'utilisateurs résidaient uniquement dans la base de données d'utilisateurs, pas dans les attributs des processus.Et l'interface setuid / setgid n'a pas été modifiée lorsque des gids supplémentaires ont été ajoutés.
Techniquement maintenant, si vous avez accès en écriture à un système de fichiers (où l'exécution et setuid / setgid ne sont pas désactivés), vous pouvez toujours définir votre ID utilisateur effectif ou réel sur n'importe lequel de vos gids supplémentaires (sans avoir à recourir à
sg
/newgrp
lequel uniquement btw permettent de passer aux groupes définis dans la base de données utilisateurs, ce qui n'est pas forcément la même que la liste des gids supplémentaires du processus).Et lors de l'exécution
env
, votre egid passe àany-sup-group
.la source