Setuid
Dans le cadre des permissions Unix, Setuid, parfois suid, abréviation de « Set 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[1].
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 :
$ ls -l nom_du_fichier
-rwsr-sr-x 1 propriétaire groupe 158998 mars 12 17:12 nom_du_fichier
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
[2].
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 :
chmod ug+s nom_du_fichier # pour activer les Setuid et Setgid
chmod u+s nom_du_fichier # pour activer le Setuid
chmod g+s nom_du_fichier # pour activer le Setgid
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 :
chmod 4755 nom_du_fichier
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).
chmod 6755 nom_du_fichier
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
[2].
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 :
/*
* printid.c — Montrer les identifiants d’utilisateur et de groupe.
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
printf("Real UID\t= %d\n", getuid());
printf("Effective UID\t= %d\n", geteuid());
printf("Real GID\t= %d\n", getgid());
printf("Effective GID\t= %d\n", getegid());
return EXIT_SUCCESS;
}
Exemple d’utilisation :
[bob@foo]$ cat /etc/passwd
alice:x:1007:1007::/home/alice:/bin/bash
bob:x:1008:1008::/home/bob:/bin/bash
[bob@foo]$ gcc -Wall printid.c -o printid
[bob@foo]$ chmod ug+s printid
[bob@foo]$ su alice
Password:
[alice@foo]$ ls -l
-rwsr-sr-x 1 bob bob 6944 2007-11-06 10:22 printid
[alice@foo]$ ./printid
Real UID = 1007
Effective UID = 1008
Real GID = 1007
Effective GID = 1008
[alice@foo]$
Notes et références
- (en) http://www.gnu.org/software/libc/manual/html_node/Setuid-Program-Example.html
- ANSSI, RECOMMANDATIONS DE CONFIGURATION D'UN SYSTÈME GNU/LINUX : Guide ANSSI, Paris, , 64 p. (lire en ligne [PDF]), chap. 6.5.3 (« Les fichiers exécutables setuid ou setgid »), p. 34.