L'enregistrement de l'ID utilisateur effectif dans une variable au début du programme ne rendrait-il pas inutile l'ID utilisateur enregistré ?
Ce n'est pas une question de ce dont le programme de l'espace utilisateur se souvient, mais de quels droits le noyau lui permet d'utiliser. Pour que la séparation entre les utilisateurs fonctionne, il doit y avoir un système qui contrôle les ID utilisateur qu'un processus peut utiliser. Sinon, n'importe quel processus pourrait simplement demander à devenir root.
Comment puis-je récupérer l'ID utilisateur enregistré dans un programme C ? Je n'ai trouvé aucune fonction faisant cela.
Avec les fonctions standard, vous ne pouvez pas (il n'y a que getuid()
et geteuid()
). Au moins Linux a getresuid()
qui renvoient les trois ID utilisateur, cependant.
Quoi qu'il en soit, vous n'auriez généralement pas besoin de le lire. Il est là pour permettre la commutation entre l'ID utilisateur réel et l'ID utilisateur effectif dans le cas d'un programme setuid, de sorte qu'il démarre comme une copie de l'ID utilisateur effectif.
Dans un programme setuid, l'ID utilisateur réel est celui de l'utilisateur qui l'exécute, et les ID utilisateur effectifs et enregistrés sont ceux de l'utilisateur propriétaire du programme. L'ID utilisateur effectif est celui qui compte pour les vérifications de privilèges, donc si le processus veut supprimer temporairement les privilèges, il change l'ID utilisateur effectif entre l'ID utilisateur réel et l'ID utilisateur enregistré.
De quelle manière le noyau utilise-t-il l'ID utilisateur enregistré pour vérifier si un processus peut ou non changer son ID utilisateur ? Cela signifie-t-il que lorsqu'un processus tente de modifier son ID utilisateur effectif, le noyau vérifie l'ID utilisateur enregistré pour s'assurer que le processus est autorisé à le faire ?
Oui. La page de manuel Linux pour setuid()
le mentionne, mais c'est un peu caché :
ERRORS
EPERM The user is not privileged and uid does not match the real
UID or saved set-user-ID of the calling process.
En d'autres termes, vous ne pouvez définir l'ID utilisateur (effectif) que sur l'un des ID réels ou enregistrés.
La page de manuel pour setreuid()
est plus clair là-dessus :
Unprivileged processes may only set the effective user ID to the real
user ID, the effective user ID, or the saved set-user-ID.