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
| Auswirkung | Details |
|---|---|
| Zugriffskontrolle | Bereich: Privilegieneskalation Schwachstellen in hoch-privilegiertem Code ermöglichen Angreifern, System-Level-Zugriff statt User-Level-Zugriff zu erlangen. |
| Integrität | Bereich: Systemkompromittierung Erhöhte Privilegien erlauben Modifikation von Systemdateien, Sicherheitseinstellungen und anderen kritischen Ressourcen. |
| Vertraulichkeit | Bereich: 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
-
MITRE. "CWE-250: Execution with Unnecessary Privileges." https://cwe.mitre.org/data/definitions/250.html
-
CERT. "POS36-C. Observe correct revocation order while relinquishing privileges." https://wiki.sei.cmu.edu/confluence/display/c/POS36-C