Startpagina > Pakket- en systeembeheer > setuid

setuid: Systeemoproep om de gebruikers-ID van een proces te wijzigen

setuid is een systeemoproep die wordt gebruikt om de real user ID (echte gebruikers-ID), effective user ID (effectieve gebruikers-ID) en saved set-user-ID (opgeslagen set-user-ID) van het aanroepende proces te wijzigen. Het wordt voornamelijk gebruikt om over te schakelen naar lagere privileges na het uitvoeren van taken die privileges vereisen, of wanneer een programma met de SUID (Set User ID) bit is ingesteld, wordt uitgevoerd met de privileges van een specifieke gebruiker. Het is een zeer belangrijke functie voor beveiliging en speelt een cruciale rol bij het beheer van rechten.

Overzicht

De setuid systeemoproep wijzigt de gebruikers-ID van een proces, waardoor het proces met de rechten van een specifieke gebruiker kan worden uitgevoerd. Dit vermindert beveiligingskwetsbaarheden en is essentieel voor programma's die zijn ontworpen om hoge privileges alleen te gebruiken wanneer dat nodig is. Over het algemeen wordt het gebruikt door SUID-programma's die met root-privileges worden uitgevoerd om terug te keren naar normale gebruikersrechten na het uitvoeren van specifieke taken.

Belangrijkste functies

  • Rechtenbeheer: Wijzigt de echte, effectieve en opgeslagen gebruikers-ID's van een proces om de rechten te beheren.
  • Beveiligingsverbetering: Vermindert potentiële beveiligingsrisico's door over te schakelen naar lagere rechten wanneer hoge rechten niet nodig zijn voor taken.
  • SUID-programma's: Wordt gebruikt wanneer een programma met de SUID-bit is ingesteld, wordt uitgevoerd met de rechten van een specifieke gebruiker (bijv. root), om de rechten tijdelijk te verhogen of te verlagen.

Gebruiksvoorbeelden

setuid is geen opdracht die rechtstreeks vanuit de shell wordt uitgevoerd, maar een systeemfunctie die binnen C/C++-programma's wordt aangeroepen. Het volgende is een conceptueel voorbeeld van het gebruik van setuid in C. Deze code kan na compilatie worden uitgevoerd met de rechten van een specifieke gebruiker door de SUID-bit in te stellen.

Overgang van root-rechten naar normale gebruikersrechten na uitvoering

#include <unistd.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <pwd.h>\n\nint main() {\n    printf("Huidige effectieve gebruikers-ID: %d\n", geteuid());\n\n    // Voer taken uit die alleen mogelijk zijn met root-rechten (voorbeeld)\n    // ...\n\n    // Zoek de UID van de 'nobody' gebruiker en schakel over naar die rechten\n    struct passwd *pw = getpwnam("nobody");\n    if (pw == NULL) {\n        perror("getpwnam");\n        return 1;\n    }\n\n    if (setuid(pw->pw_uid) == -1) {\n        perror("setuid");\n        return 1;\n    }\n\n    printf("Effectieve gebruikers-ID na rechtenovergang: %d\n", geteuid());\n\n    // Voer nu taken uit die alleen mogelijk zijn met 'nobody'-rechten\n    // ...\n\n    return 0;\n}

Dit voorbeeld laat zien hoe een programma dat met root-rechten begint, specifieke taken uitvoert en vervolgens overschakelt naar de rechten van een normale gebruiker (hier 'nobody'). Bij daadwerkelijk gebruik moet de juiste gebruikers-ID worden opgegeven.

Compilatie en SUID-instelling (concept)

gcc -o myprogram myprogram.c\nsudo chown root:root myprogram\nsudo chmod u+s myprogram\n./myprogram

Dit is het conceptuele proces voor het compileren van de bovenstaande C-code en het instellen van de SUID-bit voor het uitvoerbare bestand met root-rechten. **Let op: SUID-programma's vormen een aanzienlijk beveiligingsrisico en moeten met grote voorzichtigheid worden behandeld.**

Tips & Aandachtspunten

De setuid systeemoproep is een krachtig hulpmiddel voor rechtenbeheer, maar verkeerd gebruik kan leiden tot ernstige beveiligingskwetsbaarheden. Houd rekening met de volgende punten:

Beveiligingsoverwegingen

  • **Principe van minimale rechten**: Houd hoge rechten slechts voor de kortst mogelijke tijd aan en schakel onmiddellijk terug naar lagere rechten na voltooiing van de taak.
  • **Invoer validatie**: SUID-programma's moeten altijd grondige invoervalidatie uitvoeren bij het ontvangen van gebruikersinvoer om aanvallen zoals buffer overflows of command injection te voorkomen.
  • **Omgevingsvariabelen**: SUID-programma's kunnen onverwacht gedrag vertonen als gevolg van omgevingsvariabelen (PATH, LD_PRELOAD, etc.). Het is daarom raadzaam om de omgeving vroeg in de uitvoering op te schonen of opnieuw in te stellen op veilige waarden.
  • **Foutafhandeling**: Zorg voor een adequate foutafhandeling bij het falen van de setuid-oproep en wees voorzichtig om niet door te gaan met uitvoering met hoge rechten.
  • **Vermijd setuid(0)**: Het overschakelen naar root-rechten met setuid(0) is zeer gevaarlijk. Vermijd het gebruik ervan, tenzij absoluut noodzakelijk, en overweeg in plaats daarvan alleen de effectieve gebruikers-ID te wijzigen met `seteuid()`.

Gerelateerde systeemoproepen

Naast setuid zijn er verschillende andere systeemoproepen voor rechtenbeheer.

  • seteuid(): Wijzigt alleen de effectieve gebruikers-ID. De echte gebruikers-ID wordt niet gewijzigd, waardoor het mogelijk is om terug te keren naar de oorspronkelijke rechten indien nodig.
  • setreuid(): Wijzigt tegelijkertijd de echte en effectieve gebruikers-ID's.
  • setresuid(): Een flexibele functie die de echte, effectieve en opgeslagen set-user-ID's allemaal kan wijzigen.
  • getuid(), geteuid(): Haalt respectievelijk de echte en effectieve gebruikers-ID's van het huidige proces op.


Hétzelfde categoriecommando