Ausführung mit unnötigen Privilegien

Beschreibung

Ausführung mit unnötigen Privilegien tritt auf, wenn Software Operationen auf einer höheren Privilegienstufe ausführt, als für diese Operation minimal erforderlich ist. Wenn Code mit erhöhten Privilegien (root, Administrator, SYSTEM) läuft, wird jede Schwachstelle in diesem Code wesentlich gefährlicher. Normale Sicherheitsprüfungen, die vom Betriebssystem durchgeführt werden, können umgangen werden, und erfolgreiche Ausnutzung gewährt Angreifern erhöhten Zugriff. Dies verletzt das Prinzip der geringsten Privilegien, ein grundlegendes Sicherheitsdesign-Prinzip, das potenziellen Schäden von jeder einzelnen kompromittierten Komponente begrenzt.

Risiko

Das Ausführen mit unnötigen Privilegien verstärkt die Konsequenzen jeder Schwachstelle. Ein Buffer Overflow in einem Root-Prozess ermöglicht sofortige Systemkompromittierung, während derselbe Bug in einem unprivilegierten Prozess begrenzte Auswirkungen haben kann. Signal-Handler, gespawnte Prozesse und Kind-Threads erben die Privilegienstufe ihres Elternprozesses. In industriellen Kontrollsystemen, VPN-Gateways und anderer kritischer Infrastruktur erlauben erhöhte Privilegien Angreifern oft, von Anwendungskompromittierung zu vollständiger Systemkontrolle zu pivotieren. Viele reale Exploits zielen gezielt auf hoch-privilegierte Dienste, weil erfolgreiche Ausnutzung sofort maximalen Zugriff gewährt.

Lösung

Wenden Sie das Prinzip der geringsten Privilegien während des gesamten Softwareentwicklungszyklus an. Legen Sie Privilegien so früh wie möglich nach Startoperationen ab, die Erhöhung erfordern. Verwenden Sie separate Prozesse mit unterschiedlichen Privilegienstufen. Vermeiden Sie das Ausführen von Diensten als root/Administrator, wenn nicht erforderlich. Verwenden Sie Capability-basierte Systeme (Linux Capabilities), um nur spezifische erforderliche Privilegien zu gewähren. Implementieren Sie Privilegientrennung-Architekturen, bei denen hoch-privilegierte Komponenten minimiert werden. Konfigurieren Sie Dienste so, dass sie als dedizierte niedrig-privilegierte Benutzer laufen. Überprüfen Sie Privilegienanforderungen für alle Operationen und reduzieren Sie wo möglich.

Häufige Auswirkungen

AuswirkungDetails
ZugriffskontrolleBereich: Privilegieneskalation

Schwachstellen in hoch-privilegiertem Code ermöglichen Angreifern, System-Level-Zugriff statt User-Level-Zugriff zu erlangen.
IntegritätBereich: Systemkompromittierung

Erhöhte Privilegien erlauben Modifikation von Systemdateien, Sicherheitseinstellungen und anderen kritischen Ressourcen.
VertraulichkeitBereich: Vollständiger Datenzugriff

System-Level-Zugriff ermöglicht das Lesen aller Daten, einschließlich Anmeldedaten, Schlüssel und Daten anderer Benutzer.

Beispielcode + Lösungscode

Anfälliger Code

// ANFÄLLIG: Gesamte Anwendung läuft als root
int main(int argc, char *argv[]) {
    // Prüfen ob als root ausgeführt (aber nie Privilegien ablegen!)
    if (getuid() != 0) {
        fprintf(stderr, "Muss als root ausgeführt werden\n");
        exit(1);
    }

    // Alle nachfolgenden Operationen laufen mit root-Privilegien
    process_user_input();      // Buffer Overflow hier = root-Kompromittierung
    handle_network_requests(); // Remote-Exploit = root-Shell
    write_log_file();          // Dateioperation als root

    return 0;
}

// ANFÄLLIG: Dienst läuft als SYSTEM unter Windows
// Windows-Dienst mit LocalSystem-Konto installiert
// Jede Schwachstelle gibt Angreifer SYSTEM-Zugriff
# ANFÄLLIG: Webanwendung läuft als root
import os
from flask import Flask

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_file():
    # Läuft als root - Datei mit root-Eigentümerschaft hochgeladen
    # Path Traversal hier könnte jede Systemdatei überschreiben
    file = request.files['file']
    file.save('/uploads/' + file.filename)
    return 'OK'

if __name__ == '__main__':
    # Läuft unnötigerweise als root
    if os.geteuid() != 0:
        print("Als root ausführen!")
        exit(1)
    app.run(host='0.0.0.0', port=80)

Korrigierter Code

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

// SICHER: Privilegien nach Initialisierung ablegen
int main(int argc, char *argv[]) {
    // Privilegierte Operationen zuerst ausführen
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    bind(sock, (struct sockaddr*)&addr, sizeof(addr));

    // Bindung an privilegierten Port erfordert root, jetzt Privilegien ablegen
    drop_privileges("nobody");

    // Alle verbleibenden Operationen laufen als unprivilegierter Benutzer
    listen(sock, 10);
    process_connections(sock);  // Schwachstellen hier begrenzt in Auswirkung

    return 0;
}

void drop_privileges(const char *username) {
    struct passwd *pw = getpwnam(username);
    if (!pw) {
        exit(1);
    }

    // Zusätzgruppen ablegen
    if (setgroups(0, NULL) != 0) {
        exit(1);
    }

    // Gruppenrechte zuerst ablegen (Reihenfolge wichtig!)
    if (setgid(pw->pw_gid) != 0) {
        exit(1);
    }

    // Benutzerrechte ablegen
    if (setuid(pw->pw_uid) != 0) {
        exit(1);
    }

    // Verifizieren, dass Privilegien tatsächlich abgelegt wurden
    if (getuid() == 0 || geteuid() == 0) {
        exit(1);  // Ablegen der Privilegien fehlgeschlagen
    }
}
# SICHER: Mit minimalen Privilegien ausführen
import os
import pwd
from flask import Flask

app = Flask(__name__)

def drop_privileges(user='www-data'):
    if os.getuid() != 0:
        return  # Bereits nicht root

    # uid/gid für unprivilegierten Benutzer holen
    pwnam = pwd.getpwnam(user)

    # Gruppenrechte ablegen
    os.setgroups([])
    os.setgid(pwnam.pw_gid)
    os.setuid(pwnam.pw_uid)

    # Verifizieren
    assert os.getuid() != 0

@app.route('/upload', methods=['POST'])
def upload_file():
    # Läuft jetzt als www-data - begrenzter Schäden durch Schwachstellen
    file = request.files['file']
    # Sichere Dateinamenbehandlung verwenden
    filename = secure_filename(file.filename)
    file.save(os.path.join(UPLOAD_DIR, filename))
    return 'OK'

if __name__ == '__main__':
    # An Port 80 als root binden, dann Privilegien ablegen
    # Oder Reverse-Proxy (nginx) verwenden um root ganz zu vermeiden
    drop_privileges()
    app.run(host='0.0.0.0', port=8080)  # Nicht-privilegierter Port

Ausgenutzt in der Praxis

Ewon Cosy+ VPN-Gateway (Industrie, 2024)

CVE-2024-33894 betraf alle Firmware-Versionen der Ewon Cosy+ VPN-Gateways, die in industriellen Umgebungen verwendet werden. Das Gerät führte kritische Dienste mit unnötig erhöhten Privilegien aus, was Privilegieneskalationsangriffe ermöglichte.

IBM Db2 Privilegieneskalation (IBM, 2025)

Ausführung mit unnötigen Privilegien-Schwachstelle in IBM Db2 Datenbank, die authentifizierten Angreifern ermöglichte, Privilegien über ihre zugewiesenen Rollen hinaus zu eskalieren.

Icinga 2 Monitoring (Icinga, 2025)

Mehrere Schwachstellen im Icinga 2 Überwachungssystem wurden durch Dienste verstärkt, die mit erhöhten Privilegien liefen, was Systemkompromittierung ermöglichte.


Tools zum Testen/Ausnutzen

  • LinPEAS — Linux Privilegieneskalations-Enumeration, findet hoch-privilegierte Dienste.

  • WinPEAS — Windows Privilegieneskalations-Enumeration.

  • pspy — Linux-Prozesse ohne root überwachen, um Privilegienmuster zu identifizieren.


CVE-Beispiele

  • CVE-2024-33894 — Ewon Cosy+ industrielles VPN unnötige Privilegien.

  • CVE-2021-22555 — Linux Netfilter Exploit verstärkt durch Kernel-Privilegien.

  • CVE-2021-3156 — sudo Heap-Overflow ermöglicht root von jedem Benutzer.


Referenzen

  1. MITRE. "CWE-250: Execution with Unnecessary Privileges." https://cwe.mitre.org/data/definitions/250.html

  2. CERT. "POS36-C. Observe correct revocation order while relinquishing privileges." https://wiki.sei.cmu.edu/confluence/display/c/POS36-C