# Setuid

Dans le cadre des permissions Unix, Setuid, parfois suid, abréviation de « Set owner User ID », est un moyen de transférer des droits aux utilisateurs.

## Setuid et Setgid pour les exécutables

Il s'agit de bits de contrôle d'accès appliqués aux fichiers et répertoires d'un système d'exploitation UNIX. Grâce à eux, un processus exécutant un tel fichier peut s'exécuter au nom d'un autre utilisateur.
Quand un fichier exécutable est la propriété de l'utilisateur root, et est rendu setuid, tout processus exécutant ce fichier peut effectuer ses tâches avec les permissions associées à root, ce qui constitue un risque de sécurité pour la machine, s'il existe une faille dans ce programme. En effet, un hacker pourrait utiliser cette faille pour effectuer des opérations réservées à root, par exemple en se créant un compte d'accès illimité en temps et en pouvoirs.
Notez qu'il est parfaitement possible de rendre un programme setuid d'un compte non-root, ce qui diminue nettement les risques, et l'intérêt de l'opération.
Pour d'évidentes raisons de sécurité, un processus ne peut être tracé par un utilisateur non privilégié au travers de l'exécution d'un programme setuid. Toute tentative de traçage d'un tel processus se traduit généralement par la simple non-application du changement d'utilisateur que prévoyait le bit setuid.
Il existe également une propriété Setgid (« Set Group ID ») qui modifie le groupe d'un processus, de la même façon que le Setuid modifie l'utilisateur au nom duquel il s'exécute. Les mêmes remarques de sécurité s'appliquent au bit setuid et au bit setgid.

## Setgid pour les répertoires

Sur les systèmes UNIX, Setuid n'a pas d'effet sur les répertoires.
Le fonctionnement de Setgid sur un répertoire est très différent de celui sur les exécutables : si cette propriété est appliquée à un répertoire, tout fichier ou sous-répertoire créé dans ce répertoire parent appartiendra au groupe de celui-ci et non au groupe de l'utilisateur qui crée l'élément. Ceci est utile par exemple dans un dossier de partage, où l'on souhaite que tous les membres d'un groupe de superviseurs puissent modifier ou supprimer les contributions des membres d'un autre groupe.
Lorsqu'un sous-répertoire est créé, il hérite lui aussi de la propriété Setgid. En revanche, si des sous-répertoires existent déjà au moment de l'ajout du Setgid, ils ne sont pas affectés par celui-ci.

## En pratique

Il est possible de voir si un fichier est setuid ou setgid en tapant la commande :
Le s dans la première partie (réservée au propriétaire) -rws indique que le fichier est setuid, le s dans la deuxième partie (réservée au group) r-s indique que le fichier est setgid. Si le s est en minuscule c'est que le fichier est exécutable par contre s'il est majuscule c'est qu'il n'est pas exécutable.
Il est également possible de lister tous les fichiers setuid et setgid du système grâce à la commande find / -type f -perm /6000 -ls 2>/dev/null.
Pour mettre un fichier en setuid ou setgid, voire les deux en même temps, on utilise la commande chmod comme dans les exemples suivants. Ces deux méthodes permettent de faire la même chose mais de façons différentes :
Méthode 1 :
Méthode 2 :
La valeur de setuid est 4 sur le chiffre octal de poids fort, celle de setgid est de 2 sur ce même chiffre. Ainsi, la commande chmod peut également être utilisée, par exemple, de la sorte :
Ce fichier bénéficiera du setuid (4), son propriétaire pourra le lire, le modifier et l'exécuter (7), tandis que les membres de son groupe ainsi que le reste des utilisateurs ne pourront que le lire et l'exécuter, mais pas le modifier (5).
Le cas est identique, mais en plus du setuid, on a ici mis en place le setgid (4 et 2 faisant 6). Bien entendu, le setgid peut être mis en place seul.
Pour retirer les bits setuid ou setgid à un fichier, il faut (respectivement) entrer les commandes chmod u-s nom_du_fichier ou chmod g-s nom_du_fichier.

## Sécurité

Mettre un fichier, et surtout un programme, en Setuid ou Setgid n'est pas anodin car cela court-circuite le système de protection. Ainsi la commande chmod ug+s /bin/bash donne les droits root à toute personne qui ouvre un terminal ou qui lance l'interpréteur de commande bash.

## Exemple

Voici un programme en langage C qui montre les identifiants utilisateurs et groupes effectifs :
Exemple d’utilisation :