Start · Sprachen · PHP · Referenz · posix_seteuid

posix_seteuid

Funktion

Setzt die effektive Benutzer-ID (EUID) des aktuellen Prozesses auf den angegebenen Wert.

seit PHP 4.0.2 Kategorie: misc

Signatur

posix_seteuid(int $user_id): bool

Beschreibung

posix_seteuid() ändert die effektive Benutzer-ID (EUID) des laufenden PHP-Prozesses. Dies ist nützlich, wenn ein Prozess mit erhöhten Rechten (z. B. als root) gestartet wurde und temporär auf die Privilegien eines anderen Benutzers wechseln soll, ohne die reale Benutzer-ID dauerhaft aufzugeben.

Im Unterschied zu posix_setuid(), das sowohl die reale als auch die effektive Benutzer-ID ändert, beeinflusst posix_seteuid() nur die effektive UID. Dadurch kann ein Prozess, der ursprünglich als root läuft (oder eine passende gespeicherte Set-UID besitzt), jederzeit wieder zur ursprünglichen UID zurückwechseln.

Typische Einsatzgebiete sind Daemon-Prozesse oder CLI-Skripte, die kurzfristig bestimmte Operationen mit den Rechten eines anderen Benutzers ausführen müssen und danach wieder zur ursprünglichen Privilegienstufe zurückkehren wollen. Die Funktion ist nur auf POSIX-kompatiblen Systemen (Linux, macOS, BSD) verfügbar.

Voraussetzung für den Aufruf ist entweder, dass der Prozess als root läuft, oder dass die gewünschte user_id der realen UID des Prozesses entspricht. Andernfalls schlägt der Aufruf fehl und gibt false zurück.

Parameter

Name Typ Default Beschreibung
$user_id Pflicht int Die numerische Benutzer-ID (UID), auf die die effektive Benutzer-ID des aktuellen Prozesses gesetzt werden soll. Der Wert muss eine gültige UID auf dem System sein.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die effektive Benutzer-ID erfolgreich gesetzt wurde. Gibt false zurück, wenn der Aufruf fehlschlug (z. B. unzureichende Berechtigungen oder ungültige UID). Im Fehlerfall kann mit posix_get_last_error() und posix_strerror() der Grund abgefragt werden.

Beispiele

Effektive Benutzer-ID temporär wechseln und zurücksetzen

<?php
// Nur als root oder mit passenden Privilegien sinnvoll
$originalEuid = posix_geteuid();
echo "Aktuelle EUID: " . $originalEuid . PHP_EOL;

$targetUid = 1000; // z. B. normaler Benutzer

if (posix_seteuid($targetUid)) {
    echo "EUID erfolgreich auf " . posix_geteuid() . " gesetzt." . PHP_EOL;
    // Operationen mit den Rechten des Zielbenutzers ...

    // Zurück zur ursprünglichen effektiven UID
    if (posix_seteuid($originalEuid)) {
        echo "EUID wiederhergestellt: " . posix_geteuid() . PHP_EOL;
    }
} else {
    $errNo  = posix_get_last_error();
    $errMsg = posix_strerror($errNo);
    echo "Fehler beim Setzen der EUID: [{$errNo}] {$errMsg}" . PHP_EOL;
}
Aktuelle EUID: 0 EUID erfolgreich auf 1000 gesetzt. EUID wiederhergestellt: 0

Verfügbarkeit der POSIX-Erweiterung prüfen

<?php
if (!function_exists('posix_seteuid')) {
    echo "posix_seteuid ist nicht verfügbar (Windows oder fehlende Erweiterung)." . PHP_EOL;
    exit(1);
}

$uid = posix_getpwnam('www-data');
if ($uid === false) {
    echo "Benutzer 'www-data' nicht gefunden." . PHP_EOL;
    exit(1);
}

if (posix_seteuid($uid['uid'])) {
    echo "Effektive UID auf www-data (" . $uid['uid'] . ") gesetzt." . PHP_EOL;
} else {
    echo "Fehler: " . posix_strerror(posix_get_last_error()) . PHP_EOL;
}
Effektive UID auf www-data (33) gesetzt.

// Wichtig · Fallstricke

Sicherheitshinweis: Das Wechseln der effektiven Benutzer-ID ist ein sicherheitsrelevanter Vorgang. Stellen Sie sicher, dass die Ziel-UID korrekt validiert wurde und kein Angreifer Einfluss auf den übergebenen Wert nehmen kann. Ein unbeabsichtigter Wechsel zu root (UID 0) kann schwerwiegende Sicherheitslücken öffnen.

Plattform: posix_seteuid() ist nur auf POSIX-kompatiblen Betriebssystemen verfügbar. Unter Windows existiert diese Funktion nicht. Die PHP-POSIX-Erweiterung muss aktiviert sein (ext-posix).

Unterschied zu posix_setuid(): posix_setuid() setzt reale, effektive und gespeicherte UID dauerhaft, ein Zurückwechseln zu root ist danach nicht mehr möglich. posix_seteuid() erlaubt hingegen das reversible Wechseln der effektiven UID, sofern die reale oder gespeicherte UID die Rückkehr erlaubt.