Provided by: manpages-de-dev_4.15.0-9_all bug

BEZEICHNUNG

       setuid - Benutzeridentität setzen

ÜBERSICHT

       #include <unistd.h>

       int setuid(uid_t uid);

BESCHREIBUNG

       setuid()  setzt  die effektive Benutzer-ID des aufrufenden Prozesses. Falls der aufrufende
       Prozess privilegiert ist (genauer: der Prozess verfügt über die Capability  CAP_SETUID  in
       seinem Namensraum), so wird die reale und die gespeichert set-user-ID auch gesetzt.

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

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

       Somit  kann  ein  »set-user-ID-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
       gesetzt, um den Fehler anzuzeigen.

       Hinweis:  In  manchen  Fällen  kann  setuid()  selbst  dann fehlschlagen, wenn die UID des
       Aufrufenden 0 ist; es ist ein gravierender Sicherheitsfehler,  wenn  der  Test  auf  einen
       Fehlschlag von setuid() nicht ausgeführt wird.

FEHLER

       EAGAIN Der  Aufruf  würde die reale UID des Aufrufenden ändern (das heißt, sie würde nicht
              mit der realen UID des Aufrufenden übereinstimmen), aber es  gab  einen  temporären
              Fehlschlag beim Zuweisen der nötigen Datenstrukturen des Kernels.

       EAGAIN uid  entspricht nicht der realen Benutzerkennung des Aufrufenden, und dieser Aufruf
              würde die Prozesse mit der  realen  Benutzerkennung  uid  die  Ressourcenbegrenzung
              RLIMIT_NPROC des Aufrufenden übersteigen lassen. Seit Linux 3.1 tritt dieser Fehler
              nicht mehr auf (aber robuste Anwendungen sollten  die  Möglichkeit  dieses  Fehlers
              prüfen); siehe die Beschreibung von EAGAIN in execve(2).

       EINVAL Die in uid angegebene Benutzerkennung ist in diesem Benutzer-Namensraum unzulässig.

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

KONFORM ZU

       POSIX.1-2001,  POSIX.1-2008, SVr4. Nicht wirklich zum 4.4BSD-Aufruf kompatibel, der sowohl
       die reale, gespeicherte als auch die effektive Benutzerkennung setzt.

ANMERKUNGEN

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

       Falls sich uid von der alten effektiven UID  unterscheidet,  wird  dem  Prozess  verboten,
       Speicherauszüge (»core dumps«) zu erstellen.

       Der  ursprüngliche  Linux-Systemaufruf setuid() unterstützte nur 16-Bit-Benutzerkennungen.
       Danach führte Linux 2.4 mit setuid32() die Unterstützung für 32-Bit-Kennungen  hinzu.  Die
       Glibc-Wrapperfunktion  setuid()  behandelt  die Unterschiede zwischen den Kernel-Versionen
       transparent.

   Unterschiede C-Bibliothek/Kernel
       Auf der Kernelebene sind  Benutzer-  und  Gruppenkennungen  Attribute  pro  Thread.  POSIX
       verlangt aber, dass sich alle Threads in einem Prozess die gleichen Berechtigungsnachweise
       teilen.  Die  NPTL-Threading-Implementierung  behandelt  die   POSIX-Anforderungen   durch
       Bereitstellung  von  Wrapper-Funktionen  für die verschiedenen Systemaufrufe, die die UIDs
       und GIDs der  Prozesse  ändern.  Diese  Wrapper-Funktionen  (darunter  die  für  setuid())
       verwenden  eine  signalbasierte  Technik,  um  sicherzustellen,  dass bei der Änderung der
       Berechtigungsnachweise  eines  Threads  auch  alle  anderen  Threads  des  Prozesses  ihre
       Berechtigungsnachweise ändern. Für Details siehe nptl(7).

SIEHE AUCH

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

KOLOPHON

       Diese Seite  ist  Teil  der  Veröffentlichung  5.13  des  Projekts  Linux-man-pages.  Eine
       Beschreibung  des  Projekts,  Informationen,  wie  Fehler gemeldet werden können sowie die
       aktuelle Version dieser Seite finden sich unter https://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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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 die Mailingliste der Übersetzer ⟨debian-l10n-german@lists.debian.org⟩.