SETUID(2) Linux Programmeurs Handleiding SETUID(2)

setuid - zet gebruiker identiteit

#include <unistd.h>
int setuid(uid_t uid);

setuid() zet het effectieve gebruiker ID van het huidige proces. Als het huidige proces geprivilegieerd is (preciezer: als het proces de CAP_SETUID capaciteit in zijn gebruiker naamruimte heeft), dan worden zowel de echte UID als de opgeslagen set-user-ID ook gezet.

Onder Linux is setuid() geïmplementeerd zoals de POSIX versie met het _POSIX_SAVED_IDS kenmerk. Dit staat een set-user-ID programma (anders dan root) toe, al zijn gebruikers rechten te laten vallen, vervolgens wat niet-geprivilegieerd werk uit te voeren, en dan het origineel geldende gebruikers ID opnieuw op een veilige manier in te zetten.

Als de gebruiker root is of het programma is setuid root, dan moet er extra opgepast worden. De setuid() functie test het geldende uid van de aanroeper en als het de systeem beheerder is, worden alle met het proces verbonden ID's naar uid gezet. Nadat dit heeft plaatsgevonden is het onmogelijk voor het programma om root privileges terug te krijgen.

Dus een setuid-root programma dat wenst om tijdelijk root privileges te laten vallen, de identiteit aan te nemen van een niet-root gebruiker, en dan de root privileges te herwinnen, kan setuid() niet gebruiken. U kunt dat voor elkaar krijgen met de aanroep seteuid().

Bij succes wordt nul teruggegeven. Bij falen wordt -1 teruggegeven en wordt errno overeenkomstig gezet.

Opmerking: er zijn gevallen waarbij setuid() kan falen, zelfs wanneer de aanroeper UID 0 is; het is een grove veiligheidsfout om de terugkeer waarde van setuid() niet te controleren.

De aanroep zou de echte UID van de aanroeper veranderen (m.a.w., uid komt niet overeen met de echte UID van de aanroeper), maar er trad een tijdelijke fout op bij het toekennen van de benodigde data structuren in de kernel.
uid komt niet overeen met de echte gebruiker ID van de aanroeper en deze aanroep zou het aantal processen, behorende bij de echte gebruikers ID uid, boven de resource limiet RLIMIT_NPROC van de aanroeper brengen. Vanaf Linux 3.1 komt deze fout niet meer voor (nog steeds zouden robuuste applicaties op deze fout moeten controleren); zie de beschrijving van EAGAIN in execvd(2).
De gebruikers ID opgegeven in uid is niet geldig in de gebruikers naamruimte.s
De gebruiker is niet geprivilegieerd (Linux: heeft niet de CAP_SETUID capaciteit in zijn gebruikers naamruimte) en uid komt niet overeen met de echte UID of opgeslagen set-user-ID van het aanroepende proces.

POSIX.1-2001, POSIX.1-2008, SVr4. Niet geheel compatibel met de 4.4BSD aanroep, die alle echte, opgeslagen en effectieve gebruiker ID´s zet.

Linux gebruikt het idee van bestandsysteem-gebruiker-ID, normaal is dat hetzelfde als het geldende gebruiker ID. De setuid() aanroep zet ook de bestandssysteem gebruiker ID van het huidige proces. Zie setfsuid(2).

Als uid verschillend is van het oude geldende uid, dan zal het proces geen core-dumps mogen achterlaten.

De originele Linux setuid() systeem aanroep ondersteunde alleen 16-bit gebruiker IDs. Vervolgens, voegde Linux 2.4 setuid32() toe voor 32-bit IDs ondersteuning. De glibc setuid() omwikkel functies handelt de variaties in kernel versies transparant af.

Op kernel niveau zijn gebruiker ID en groep ID een per-thread attribute. Hoewel POSIX vereist dat alle threads van een proces dezelfde identiteit delen. De NPTL implementatie van threads implementeert de POSIX eis door in omwikkel functies te voorzien voor de diverse systeem aanroepen die de UID´s en GID´s veranderen. Deze omwikkel functies (inclusief die ene voor setuid() gebruiken een op signalen gebaseerde techniek om er van zeker te zijn dat als een thread zijn identiteit verandert, alle andere threads van dat proces ook hun identiteit veranderen. Zie voor details nptl(7).

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

Deze pagina is onderdeel van release 5.13 van het Linux man-pages-project. Een beschrijving van het project, informatie over het melden van bugs en de nieuwste versie van deze pagina zijn op https://www.kernel.org/doc/man-pages/ te vinden.

De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>

Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.

Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.

22 maart 2021 Linux