Startseite > Paket- & Systemverwaltung > setuid

setuid: System Call zum Ändern der Prozess-Benutzer-ID

setuid ist ein Systemaufruf, der verwendet wird, um die tatsächliche Benutzer-ID (real user ID), die effektive Benutzer-ID (effective user ID) und die gespeicherte Set-User-ID (saved set-user-ID) des aufrufenden Prozesses zu ändern. Er wird häufig verwendet, um nach der Ausführung privilegierter Aufgaben zu niedrigeren Berechtigungen zu wechseln oder wenn Programme mit gesetztem SUID-Bit (Set User ID) mit den Berechtigungen eines bestimmten Benutzers ausgeführt werden. Es ist eine sehr wichtige Funktion für die Sicherheit und spielt eine Schlüsselrolle bei der Berechtigungsverwaltung.

Übersicht

Der setuid-Systemaufruf ändert die Benutzer-ID eines Prozesses, sodass dieser mit den Berechtigungen eines bestimmten Benutzers ausgeführt wird. Dies reduziert Sicherheitslücken und ist unerlässlich für Programme, die so konzipiert sind, dass sie nur bei Bedarf hohe Berechtigungen verwenden. Typischerweise wird er von SUID-Programmen verwendet, die mit Root-Berechtigungen gestartet werden, um nach der Ausführung bestimmter Aufgaben zu normalen Benutzerberechtigungen zurückzukehren.

Hauptfunktionen

  • Berechtigungsverwaltung: Steuert Berechtigungen durch Änderung der tatsächlichen, effektiven und gespeicherten Benutzer-IDs eines Prozesses.
  • Sicherheitsverbesserung: Reduziert potenzielle Sicherheitsrisiken, indem zu niedrigeren Berechtigungen gewechselt wird, wenn hohe Berechtigungen für eine Aufgabe nicht erforderlich sind.
  • SUID-Programme: Wird verwendet, wenn Programme mit gesetztem SUID-Bit mit den Berechtigungen eines bestimmten Benutzers (z. B. root) ausgeführt werden, um Berechtigungen vorübergehend zu erhöhen oder zu verringern.

Anwendungsbeispiele

setuid ist keine direkt in der Shell ausführbare Befehlszeile, sondern eine Systemfunktion, die innerhalb von C/C++-Programmen aufgerufen wird. Das Folgende ist ein konzeptionelles Beispiel für die Verwendung von setuid in C. Dieser Code kann nach der Kompilierung und dem Setzen des SUID-Bits mit den Berechtigungen eines bestimmten Benutzers ausgeführt werden.

Wechseln zu normalen Benutzerberechtigungen nach Ausführung mit Root-Berechtigungen

#include <unistd.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <pwd.h>\n\nint main() {\n    printf("Aktuelle effektive Benutzer-ID: %d\n", geteuid());\n\n    // Ausführen von Aufgaben, die nur mit Root-Berechtigungen möglich sind (Beispiel)\n    // ...\n\n    // Suchen der UID des Benutzers 'nobody' und Wechseln zu diesen Berechtigungen\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("Effektive Benutzer-ID nach Berechtigungswechsel: %d\n", geteuid());\n\n    // Jetzt Aufgaben ausführen, die nur mit 'nobody'-Berechtigungen möglich sind\n    // ...\n\n    return 0;\n}

Dieses Beispiel zeigt, wie ein Programm mit Root-Berechtigungen gestartet wird, bestimmte Aufgaben ausführt und dann zu den Berechtigungen eines normalen Benutzers (hier 'nobody') wechselt. Bei tatsächlicher Verwendung muss die entsprechende Benutzer-ID angegeben werden.

Kompilierung und SUID-Einrichtung (Konzept)

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

Konzeptioneller Prozess zum Kompilieren des obigen C-Codes und zum Setzen des SUID-Bits für die ausführbare Datei mit Root-Berechtigungen. **Vorsicht: SUID-Programme bergen erhebliche Sicherheitsrisiken und sollten mit äußerster Vorsicht behandelt werden.**

Tipps & Vorsichtsmaßnahmen

Der setuid-Systemaufruf ist ein mächtiges Werkzeug zur Berechtigungsverwaltung, aber seine falsche Verwendung kann zu schwerwiegenden Sicherheitslücken führen. Beachten Sie unbedingt die folgenden Punkte:

Sicherheitsüberlegungen

  • **Prinzip der geringsten Rechte**: Halten Sie hohe Berechtigungen nur für die absolut notwendige Zeit aufrecht und wechseln Sie sofort zu niedrigeren Berechtigungen, sobald die Aufgabe abgeschlossen ist.
  • **Eingabevalidierung**: SUID-Programme sollten Benutzereingaben immer gründlich validieren, um Angriffe wie Pufferüberläufe oder Befehlsinjektionen zu verhindern.
  • **Umgebungsvariablen**: SUID-Programme können unerwartetes Verhalten aufgrund von Umgebungsvariablen (PATH, LD_PRELOAD usw.) aufweisen. Es ist ratsam, die Umgebung zu Beginn der Ausführung zu bereinigen oder auf sichere Werte zurückzusetzen.
  • **Fehlerbehandlung**: Behandeln Sie Fehler bei fehlgeschlagenen setuid-Aufrufen ordnungsgemäß und stellen Sie sicher, dass das Programm nicht mit hohen Berechtigungen weiter ausgeführt wird.
  • **Vermeiden Sie setuid(0)**: Der Wechsel zu Root-Berechtigungen mit setuid(0) ist sehr gefährlich. Vermeiden Sie die Verwendung, es sei denn, es ist absolut notwendig, und erwägen Sie stattdessen die Verwendung von `seteuid()`, um nur die effektive Benutzer-ID zu ändern.

Verwandte Systemaufrufe

Neben setuid gibt es verschiedene andere Systemaufrufe zur Berechtigungsverwaltung.

  • seteuid(): Ändert nur die effektive Benutzer-ID. Die tatsächliche Benutzer-ID wird nicht geändert, sodass eine Rückkehr zu den ursprünglichen Berechtigungen bei Bedarf möglich ist.
  • setreuid(): Ändert gleichzeitig die tatsächliche und die effektive Benutzer-ID.
  • setresuid(): Eine flexible Funktion, die es ermöglicht, die tatsächliche, effektive und gespeicherte Set-User-ID zu ändern.
  • getuid(), geteuid(): Ruft die tatsächliche bzw. effektive Benutzer-ID des aktuellen Prozesses ab.


Gleiche Kategorie Befehle