CVE-2026-88000: open-webui: malicious chat history causes DoS
GHSA-3cgp-3cqx-j8w2 MEDIUM CISA: TRACK*A vulnerability in open-webui lets any account with the default low-privilege 'user' role — including self-registered users — freeze the entire server: by storing a chat whose messages reference each other as children and then deleting one message, the message-resolution logic enters an infinite loop on the server's async event loop, pinning one CPU core and blocking every other request, including unauthenticated health checks and admin endpoints, until the process is killed. There's no data disclosure or alteration — this is a pure availability hit — but for teams running open-webui as their internal LLM chat front-end, a single fire-and-forget request from one low-privilege user is enough to take down the service for all users, and the poisoned chat re-triggers the outage on every subsequent deletion attempt against it. There is no CISA KEV listing, no published EPSS score, and no public exploit code or Nuclei template circulating yet, so this looks opportunistic rather than actively weaponized; the package tracks only 3 known downstream dependents, which limits blast radius outside direct deployments. CISOs running open-webui should patch to 0.11.1 immediately — the fix requires no data migration and self-heals previously-poisoned chats — and in the interim should restrict self-service account creation and watch for single workers pinned at 100% CPU with flat memory as a detection signal.
What is the risk?
Exploitability is high in practical terms despite the CVSS AC:L/PR:L profile — the attack is trivial to trigger (a ~300-byte JSON payload plus one DELETE request, no AI/ML expertise required) by any authenticated user, including self-registered accounts where open signup is enabled. Impact is a full, sustained denial of service (CVSS A:H) affecting all users sharing the same worker, including health/liveness checks used by orchestrators, which can cascade into automated restarts or failover loops in containerized deployments. There is no confidentiality or integrity impact. Overall risk is medium-high for any multi-user or externally exposed open-webui deployment, and lower for strictly single-user/trusted-only instances.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Open WebUI | pip | >= 0.10.0, < 0.11.1 | 0.11.1 |
Do you use Open WebUI? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step-
Patch to open-webui >= 0.11.1 — the fix adds cycle detection to the child-link walk and is fully backward compatible, including for chats already poisoned under a vulnerable version. Until patched: disable open self-registration or restrict signups to vetted users to reduce who can reach the vulnerable endpoint, and if feasible, rate-limit or gate DELETE /api/v1/chats/{id}/messages/{message_id} for non-admin accounts at a reverse proxy. Detect exploitation by monitoring for a worker process pinned near 100% CPU on a single core with flat/unchanged memory and no corresponding throughput, combined with health-check timeouts; run multiple replicas/workers with process-level health checks that auto-restart a hung worker to limit blast radius. After patching, consider auditing stored chats for cyclic childrenIds structures — the malformed data persists but becomes inert once the walk terminates safely under 0.11.1.
What does CISA's SSVC say?
Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-88000?
A vulnerability in open-webui lets any account with the default low-privilege 'user' role — including self-registered users — freeze the entire server: by storing a chat whose messages reference each other as children and then deleting one message, the message-resolution logic enters an infinite loop on the server's async event loop, pinning one CPU core and blocking every other request, including unauthenticated health checks and admin endpoints, until the process is killed. There's no data disclosure or alteration — this is a pure availability hit — but for teams running open-webui as their internal LLM chat front-end, a single fire-and-forget request from one low-privilege user is enough to take down the service for all users, and the poisoned chat re-triggers the outage on every subsequent deletion attempt against it. There is no CISA KEV listing, no published EPSS score, and no public exploit code or Nuclei template circulating yet, so this looks opportunistic rather than actively weaponized; the package tracks only 3 known downstream dependents, which limits blast radius outside direct deployments. CISOs running open-webui should patch to 0.11.1 immediately — the fix requires no data migration and self-heals previously-poisoned chats — and in the interim should restrict self-service account creation and watch for single workers pinned at 100% CPU with flat memory as a detection signal.
Is CVE-2026-88000 actively exploited?
No confirmed active exploitation of CVE-2026-88000 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-88000?
Patch to open-webui >= 0.11.1 — the fix adds cycle detection to the child-link walk and is fully backward compatible, including for chats already poisoned under a vulnerable version. Until patched: disable open self-registration or restrict signups to vetted users to reduce who can reach the vulnerable endpoint, and if feasible, rate-limit or gate DELETE /api/v1/chats/{id}/messages/{message_id} for non-admin accounts at a reverse proxy. Detect exploitation by monitoring for a worker process pinned near 100% CPU on a single core with flat/unchanged memory and no corresponding throughput, combined with health-check timeouts; run multiple replicas/workers with process-level health checks that auto-restart a hung worker to limit blast radius. After patching, consider auditing stored chats for cyclic childrenIds structures — the malformed data persists but becomes inert once the walk terminates safely under 0.11.1.
What systems are affected by CVE-2026-88000?
This vulnerability affects the following AI/ML architecture patterns: LLM chat UI / self-hosted front-ends, multi-user AI application backends.
What is the CVSS score for CVE-2026-88000?
CVE-2026-88000 has a CVSS v3.1 base score of 6.5 (MEDIUM). The EPSS exploitation probability is 0.33%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0029 Denial of AI Service AML.T0049 Exploit Public-Facing Application Compliance Controls Affected
What are the technical details?
Original Advisory
## Summary Chat histories are stored as an unvalidated JSON object. After a message is deleted, the code that picks the chat's new current message walked down the `childrenIds` links without recording where it had already been. Any account with the default `user` role could store a chat whose messages list each other as children, then delete a message from it, and the walk would run forever. That walk runs on the server's request loop, so it blocks every other user's requests until the process is killed. ## Preconditions One account with the default `user` role. No administrator rights, no additional permissions, no configuration change and no non-default setting: creating and deleting chats is available to every user out of the box. The attack runs entirely against the attacker's own chat, so no knowledge of any other user's data is needed. Versions before 0.10.0 are unaffected because neither the message-deletion endpoint nor the affected code existed. ## Impact The walk is synchronous and runs on the asyncio event loop, so while it spins, every request from every user is blocked, including unauthenticated `/health` and administrator endpoints. External health checks and orchestrator liveness probes fail alongside the UI. This is a pure CPU pin with no list growth, so a worker consumes one full core with flat memory and has to be killed rather than being reclaimed by an out-of-memory kill. The work is not cancelled when the client disconnects, so a single fire-and-forget request is enough and the attacker can disconnect immediately. The malformed chat stays in the database, so the condition re-arms on the next deletion attempt against that chat. No data is disclosed, altered or deleted. ## Fix Fixed in 0.11.1 by https://github.com/open-webui/open-webui/commit/b933292d63d12be3fd1416fe55519ddc7aa336bc. The walk now records the ids it has already passed through, so it terminates after at most one step per stored message whatever the message contents are. Upgrading fully resolves the issue, including for chats stored while the deployment was on an affected version, which become harmless once the walk terminates. ## Root cause Affected component: the chat-history message deletion helper in `backend/open_webui/models/chats.py`, reached from `DELETE /api/v1/chats/{id}/messages/{message_id}`. Affected setup: all builds from 0.10.0 up to and including 0.11.0. Resolving the chat's new current message after a deletion means descending to the deepest remaining child, and that descent had no notion of where it had already been, so two messages naming each other as children sent it back and forth indefinitely. The write path does not validate the structure of a chat's history, and the child-link rebuild that runs on other write paths does not apply when a chat is created, so a history whose `childrenIds` form a cycle was persisted exactly as submitted. ## Proof of concept As a default-role user on a running instance, store one chat of roughly 300 bytes whose messages reference each other as children: ```json {"chat":{"title":"poc","history":{"currentId":"C","messages":{ "A":{"id":"A","parentId":null,"role":"user","content":"a","childrenIds":["B","C"],"timestamp":1}, "B":{"id":"B","parentId":"A","role":"assistant","content":"b","childrenIds":["A"],"timestamp":2}, "C":{"id":"C","parentId":"A","role":"user","content":"c","childrenIds":[],"timestamp":3}}}}} ``` `POST /api/v1/chats/new` stores it verbatim, with the child links unchanged. A single `DELETE /api/v1/chats/{id}/messages/C` as the same user then never returns: ``` unauthenticated GET /health -> HTTP 000 after 10.007s DELETE -> HTTP 000 after 20.007s ``` Sampled during the hang, the worker had consumed 42.9 seconds of CPU on one fully occupied core with flat resident memory, and unauthenticated `GET /health` timed out for as long as the process lived, including after the attacker's connection closed. On 0.11.1 the same payload returns HTTP 200 in 0.011s, `/health` stays available throughout, and deleting a middle message from a well-formed four-message chain still resolves the current message correctly. ## Credits @Classic298, who found the unguarded descent through the chat's child links, demonstrated the resulting server-wide outage end to end against a live instance, and supplied the fix.
Exploitation Scenario
An attacker who holds any low-privilege 'user' account — via open self-service signup, phished credentials, or a legitimate internal account — crafts a small JSON chat object where two messages list each other in childrenIds, forming a cycle, and submits it via POST /api/v1/chats/new, which stores it verbatim since chat structure isn't validated on write. The attacker then sends DELETE /api/v1/chats/{id}/messages/{message_id} against the cyclic message and immediately disconnects; because the walk is not cancelled on client disconnect, the server keeps executing the now-infinite traversal on its event loop. Every other request routed to that worker — other users' chats, unauthenticated health checks, and admin cockpit pages — hangs until an operator kills the process, and since the malformed chat remains in the database, the attacker (or anyone able to reach that chat) can re-trigger the outage at will.
Weaknesses (CWE)
CWE-835 Loop with Unreachable Exit Condition ('Infinite Loop')
Primary
CWE-835 Loop with Unreachable Exit Condition ('Infinite Loop') CWE-835 — Loop with Unreachable Exit Condition ('Infinite Loop'): The product contains an iteration or loop with an exit condition that cannot be reached, i.e., an infinite loop.
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H References
Timeline
Related Vulnerabilities
CVE-2026-44551 9.1 open-webui: LDAP auth bypass — full account takeover
Same package: open-webui CVE-2026-45672 8.8 open-webui: code exec gate bypass via API endpoint
Same package: open-webui CVE-2025-64495 8.7 Open WebUI: XSS-to-RCE via malicious prompt injection
Same package: open-webui CVE-2026-44552 8.7 open-webui: Redis cache poisoning enables cross-instance tool hijack
Same package: open-webui CVE-2026-45315 8.7 open-webui: stored XSS → JWT theft and admin takeover
Same package: open-webui