SETUID(2)

BEZEICHNUNG
setuid - Benutzeridentität setzen

ÜBERSICHT
#include <sys/types.h>
#include <unistd.h>

int setuid(uid_t uid);

BESCHREIBUNG
setuid() setzt die effektive Benutzer-ID des aufrufenden Prozesses. Wird diese Funktion durch Root aufgerufen, so wird die reale und die gesicherte ID auch gesetzt.

Unter Linux ist setuid() wie die POSIX-Version mit dem Merkmal _POSIX_SAVED_IDS implementiert. Damit kann ein (von root verschiedenes) setuid-Programm sämtliche Privilegien abgeben, unprivilegierte Arbeiten verrichten und anschließend auf sichere Art und Weise die ursprüngliche, effektive Benutzer-ID wieder erlangen.

Wenn der Benutzer root oder das Programm setuid root ist, ist besondere Sorgfalt notwendig. Die Funktion setuid() überprüft die effektive Benutzer-ID (UID) des Aufrufenden. Falls es der Superuser ist, werden alle diesen Prozess betreffenden Benutzer-IDs auf uid gesetzt. Danach ist es für das Programm unmöglich, die root-Privilegien wiederzuerlangen.

Somit kann ein »setuid-root«-Programm setuid() nicht nutzen, um vorübergehend Root-Rechte abzugeben, die Identität eines unprivilegierten Benutzers anzunehmen und dann wieder erneut Root-Privilegien zu erlangen. Sie können dies mit seteuid(2) bewerkstelligen.

RÜCKGABEWERT
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt. Note: there are cases where setuid() can fail even when the caller is UID 0; it is a grave security error to omit checking for a failure return from setuid().

FEHLER

EAGAIN
    The call would change the caller's real UID (i.e., uid does not match the caller's real UID), but there was a temporary failure allocating the necessary kernel data structures.

EAGAIN
    uid does not match the real user ID of the caller and this call would bring the number of processes belonging to the real user ID uid over the caller's RLIMIT_NPROC resource limit. Since Linux 3.1, this error case no longer occurs (but robust applications should check for this error); see the description of EAGAIN in execve(2).

EPERM
    Der Benutzer ist nicht privilegiert (Linux: verfügt nicht über die CAP_SETUID-Capability) und uid entspricht nicht der realen Benutzer-ID oder der gespeicherten »set-user«-ID des aufrufenden Prozesses.

KONFORM ZU
SVr4, POSIX.1-2001. Nicht wirklich zum 4.4BSD-Aufruf kompatibel, der sowohl die reale, gespeicherte als auch die effektive Benutzer-ID setzt.

ANMERKUNGEN
Linux verfügt über das Konzept der Dateisystem-Benutzer-ID, die normalerweise mit der effektiven Benutzer-ID identisch ist. Der Aufruf von setuid() setzt auch die Dateisystem-Benutzer-ID des aufrufenden Prozesses (siehe setfsuid(2)).

Falls sich uid von der alten effektiven Benutzer-ID unterscheidet, wird dem Prozess verboten, Speicherauszüge (»core dumps«) zu erstellen. Der ursprüngliche Linux-Systemaufruf setuid() unterstützte nur 16-Bit-Benutzer-IDs. Danach führte Linux 2.4 mit setuid32() die Unterstützung für 32-Bit-IDs hinzu. Die Glibc-Wrapperfunktion setuid() behandelt die Unterschiede zwischen den Kernel-Versionen transparent.

SIEHE AUCH
getuid(2), seteuid(2), setfsuid(2), setreuid(2), capabilities(7), credentials(7)

KOLOPHON
This page is part of release 3.70 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Stefan Janke <gonzo@burg.studfb.unibw-muenchen.de>, Helge Kreutzmann <debian@helgefjell.de>, Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> und Mario Blättermann <mario.blaettermann@gmail.com> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.