euid, ruid, suid
Variables d'Identification de l'Utilisateur
ruid
: L'identifiant d'utilisateur réel désigne l'utilisateur qui a lancé le processus.euid
: Connu sous le nom d'identifiant d'utilisateur effectif, il représente l'identité de l'utilisateur utilisée par le système pour déterminer les privilèges du processus. Généralement,euid
reflèteruid
, sauf dans des cas comme l'exécution d'un binaire SetUID, oùeuid
prend l'identité du propriétaire du fichier, accordant ainsi des autorisations opérationnelles spécifiques.suid
: Cet identifiant d'utilisateur sauvegardé est essentiel lorsqu'un processus à haute privilège (fonctionnant généralement en tant que root) doit temporairement abandonner ses privilèges pour effectuer certaines tâches, pour ensuite retrouver son statut élevé initial.
Note Importante
Un processus n'opérant pas sous root ne peut modifier son euid
que pour correspondre au ruid
, euid
ou suid
actuel.
Compréhension des Fonctions set*uid
setuid
: Contrairement aux hypothèses initiales,setuid
modifie principalementeuid
plutôt queruid
. Spécifiquement, pour les processus privilégiés, il aligneruid
,euid
etsuid
avec l'utilisateur spécifié, souvent root, solidifiant efficacement ces identifiants en raison de la substitution desuid
. Des informations détaillées sont disponibles dans la page de manuel de setuid.setreuid
etsetresuid
: Ces fonctions permettent l'ajustement nuancé deruid
,euid
etsuid
. Cependant, leurs capacités dépendent du niveau de privilège du processus. Pour les processus non root, les modifications sont limitées aux valeurs actuelles deruid
,euid
etsuid
. En revanche, les processus root ou ceux avec la capacitéCAP_SETUID
peuvent attribuer des valeurs arbitraires à ces identifiants. Plus d'informations sont disponibles dans la page de manuel de setresuid et la page de manuel de setreuid.
Ces fonctionnalités sont conçues non pas comme un mécanisme de sécurité, mais pour faciliter le flux opérationnel prévu, comme lorsqu'un programme adopte l'identité d'un autre utilisateur en modifiant son identifiant d'utilisateur effectif.
Il est important de noter que, bien que setuid
puisse être couramment utilisé pour l'élévation des privilèges vers root (car il aligne tous les identifiants sur root), différencier ces fonctions est crucial pour comprendre et manipuler les comportements des identifiants d'utilisateur dans divers scénarios.
Mécanismes d'Exécution de Programmes sous Linux
Appel Système execve
execve
Fonctionnalité:
execve
lance un programme, déterminé par le premier argument. Il prend deux tableaux d'arguments,argv
pour les arguments etenvp
pour l'environnement.Comportement: Il conserve l'espace mémoire de l'appelant mais rafraîchit la pile, le tas et les segments de données. Le code du programme est remplacé par le nouveau programme.
Préservation de l'Identifiant d'Utilisateur:
Les identifiants
ruid
,euid
et les identifiants de groupe supplémentaires restent inchangés.euid
peut subir des changements nuancés si le nouveau programme a le bit SetUID défini.suid
est mis à jour à partir deeuid
après l'exécution.Documentation: Des informations détaillées sont disponibles sur la page de manuel de
execve
.
Fonction system
system
Fonctionnalité: Contrairement à
execve
,system
crée un processus enfant en utilisantfork
et exécute une commande dans ce processus enfant en utilisantexecl
.Exécution de Commande: Exécute la commande via
sh
avecexecl("/bin/sh", "sh", "-c", commande, (char *) NULL);
.Comportement: Comme
execl
est une forme deexecve
, il fonctionne de manière similaire mais dans le contexte d'un nouveau processus enfant.Documentation: Des informations supplémentaires peuvent être obtenues à partir de la page de manuel de
system
.
Comportement de bash
et sh
avec SUID
bash
et sh
avec SUIDbash
:Possède une option
-p
influençant la manière donteuid
etruid
sont traités.Sans
-p
,bash
définiteuid
surruid
s'ils diffèrent initialement.Avec
-p
, l'euid
initial est préservé.Plus de détails sont disponibles sur la page de manuel de
bash
.sh
:Ne possède pas de mécanisme similaire à
-p
dansbash
.Le comportement concernant les identifiants d'utilisateur n'est pas explicitement mentionné, sauf sous l'option
-i
, mettant l'accent sur la préservation de l'égalité deeuid
etruid
.Des informations supplémentaires sont disponibles sur la page de manuel de
sh
.
Ces mécanismes, distincts dans leur fonctionnement, offrent une gamme variée d'options pour exécuter et passer d'un programme à un autre, avec des nuances spécifiques dans la gestion et la préservation des identifiants d'utilisateur.
Test des Comportements des Identifiants d'Utilisateur lors des Exécutions
Exemples tirés de https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, consultez-le pour plus d'informations
Cas 1: Utilisation de setuid
avec system
setuid
avec system
Objectif: Comprendre l'effet de setuid
en combinaison avec system
et bash
en tant que sh
.
Code C:
Compilation et autorisations :
Analyse :
ruid
eteuid
commencent respectivement à 99 (nobody) et 1000 (frank).setuid
les aligne tous les deux sur 1000.system
exécute/bin/bash -c id
en raison du lien symbolique de sh vers bash.bash
, sans-p
, ajusteeuid
pour correspondre àruid
, ce qui fait que les deux valent 99 (nobody).
Cas 2 : Utilisation de setreuid avec system
Code C :
Compilation et autorisations :
Exécution et Résultat :
Analyse :
setreuid
définit à la fois ruid et euid sur 1000.system
invoque bash, qui maintient les IDs utilisateur en raison de leur égalité, fonctionnant efficacement en tant que frank.
Cas 3 : Utilisation de setuid avec execve
Objectif : Explorer l'interaction entre setuid et execve.
Exécution et Résultat :
Analyse:
ruid
reste à 99, maiseuid
est défini à 1000, en accord avec l'effet desetuid
.
Exemple de code C 2 (Appel de Bash):
Exécution et Résultat :
Analyse :
Bien que
euid
soit défini à 1000 parsetuid
,bash
réinitialise euid àruid
(99) en raison de l'absence de l'option-p
.
Exemple de code C 3 (Utilisation de bash -p) :
Exécution et Résultat :
Références
Last updated