SETUID(2)

NOM
setuid - Définir l'identifiant de l'utilisateur

SYNOPSIS
#include <sys/types.h>
#include <unistd.h>

int setuid(uid_t uid);

DESCRIPTION
setuid() définit l'UID effectif du processus appelant. Si cet UID effectif est celui du superutilisateur, les UID réels et sauvés sont également définis.

Sous Linux setuid() est implémenté comme le spécifie POSIX, avec l'option _POSIX_SAVED_IDS. Ceci permet à un programme Set-UID (autre que root) d'abandonner tous ses privilèges, d'effectuer des tâches non privilégiées, et de retrouver son UID effectif de manière sécurisée.

Si l'utilisateur est le superutilisateur, ou si le programme est Set-UID root, des précautions particulières doivent être prises. La fonction setuid() vérifie l'UID effectif de l'appelant et si c'est le superutilisateur, tous les UID du processus sont mis à uid. Une fois ceci effectué, il est impossible au programme de retrouver ses privilèges de superutilisateur.

Ainsi un programme Set-UID root désireux d'abandonner temporairement ses privilèges, en prenant l'identité d'un utilisateur ordinaire, puis de récupérer ses privilèges par la suite ne doit pas utiliser setuid(). On peut accomplir ceci en utilisant l'appel seteuid(2).

VALEUR RENVOYÉE
S'il réussit, cet appel système renvoie 0. S'il échoue, il renvoie -1 et remplit errno en conséquence. Note : dans certains cas, setuid() peut échouer alors même que l'UID de l'appelant est 0 ; ne pas vérifier la valeur renvoyée par setuid() pour détecter un échec est une grave erreur qui compromet la sécurité du système.

ERREURS

EAGAIN
    L'appel a changé l'identifiant (UID) réel de l'appelant (c'est à dire que uid ne correspond pas à l'UID réel de l'appelant), mais une erreur temporaire est survenue lors de l'allocation des structures de données du noyau nécessaires à l'opération.

EAGAIN
    uid ne correspond pas à l'UID réel de l'appelant et suite à cet appel, le nombre de processus appartenant à l'utilisateur dont l'identifiant réel est uid a dépassé la limite de ressources RLIMIT_NPROC de l'appelant. A partir de Linux 3.1, cette erreur ne peut plus se produire (néanmoins, les applications sérieuses doivent vérifier que l'erreur ne s'est pas produite) ; consultez la description de EAGAIN dans execve(2).

EPERM
    L'utilisateur n'est pas privilégié (sous Linux : n'a pas la capacité CAP_SETUID) et uid ne correspond ni à l'UID réel, ni au set-uid sauvé du processus.

CONFORMITÉ
SVr4, POSIX.1-2001. Pas tout à fait compatible avec l'appel système BSD 4.4, qui positionne l'ensemble des ID réel, sauvé et effectif.

NOTES
Linux dispose d'un concept d'UID de système de fichiers, qui est normalement égal à l'UID effectif. L'appel setuid() définit également l'UID de système de fichiers du processus appelant. Consultez setfsuid(2).

Si l'uid est différent de l'ancien UID effectif, le processus ne pourra pas laisser d'image mémoire (core dump) sur le disque. L'appel système setuid() original de Linux ne gérait que des identifiants d'utilisateur sur 16 bits. En conséquence, Linux 2.4 a ajouté setuid32() qui prend en charge des identifiants 32 bits. La fonction setuid() de la glibc qui l'encapsule gère de manière transparente ces différences entre noyaux.

VOIR AUSSI
getuid(2), seteuid(2), setfsuid(2), setreuid(2), capabilities(7), credentials(7)

COLOPHON
Cette page fait partie de la publication 3.70 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).

Veuillez signaler toute erreur de traduction en écrivant à <perkamon-fr@traduc.org>.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».