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() sets the effective user ID of the calling process. If the calling process is privileged (more precisely: if the process has the CAP_SETUID capability in its user namespace), the real UID and saved set-user-ID are also set.

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.

If the user is root or the program is set-user-ID-root, special care must be taken: setuid() checks the effective user ID of the caller and if it is the superuser, all process-related user ID's are set to uid. After this has occurred, it is impossible for the program to regain root privileges.

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
En cas de succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et errno reçoit une valeur adéquate.

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).

EINVAL
    L'identifiant utilisateur indiqué dans uid n'est pas valide dans cet espace de noms utilisateur.

EPERM
    The user is not privileged (Linux: does not have the CAP_SETUID capability in its user namespace) and uid does not match the real UID or saved set-user-ID of the calling process.

CONFORMITÉ
POSIX.1-2001, POSIX.1-2008, SVr4. Not quite compatible with the 4.4BSD call, which sets all of the real, saved, and effective user IDs.

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.

  différences entre bibliothèque C et noyau
At the kernel level, user IDs and group IDs are a per-thread attribute. However, POSIX requires that all threads in a process share the same credentials. The NPTL threading implementation handles the POSIX requirements by providing wrapper functions for the various system calls that change process UIDs and GIDs. These wrapper functions (including the one for setuid()) employ a signal-based technique to ensure that when one thread changes credentials, all of the other threads in the process also change their credentials. For details, see nptl(7).

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

COLOPHON
Cette page fait partie de la publication 5.08 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page, peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com> et Frédéric Hantrais <fhantrais@gmail.com> Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à <debian-l10n-french@lists.debian.org>.