A default-role user account in open-webui can store a chat whose message history contains a parent-reference cycle with a missing id field, causing the server-side history walker to loop forever on the shared asyncio event loop and hang every request in the process, including unauthenticated health checks and admin endpoints. Any of the 3 downstream dependents running open-webui as their chat UI is exposed, and severity is compounded because the malformed chat persists in the database — a process restart only buys time until the next request touches that chat, and unbounded memory growth means the failure mode can escalate from hang to OOM kill. No exploit code or scanner template is public and this isn't in CISA KEV, but the attack requires nothing more than one authenticated account and a single crafted API request, so exploitability is effectively trivial once an attacker has any login. Upgrade to open-webui 0.11.1 immediately, and because the fix only prevents new hangs, proactively audit and delete any already-stored chats with cyclic or malformed parent chains before or right after patching. In the interim, monitor for sudden CPU pinning and rising resident memory on the open-webui process alongside failing /health checks as an indicator of active exploitation.
What is the risk?
CVSS 6.5 (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H) understates the operational severity for availability-sensitive deployments: exploitation requires only low privileges (any default-role account, which is granted by default), no user interaction, and a single fire-and-forget request — the attacker can disconnect immediately and the loop keeps running. There is no confidentiality or integrity impact, but availability impact is total and process-wide, not scoped to the attacker's own session. No EPSS score, public exploit, or Nuclei template exists and it is not in CISA KEV, so there's no evidence of active mass exploitation, but the low bar to trigger (a single crafted JSON POST plus one GET) means a malicious or careless insider, or any compromised low-privilege account, can reproduce the outage trivially. The persistence of the malformed chat in the database elevates this from a one-off DoS to a recurring outage risk until the specific chat is deleted or the instance is patched.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Open WebUI | pip | >= 0.5.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-
1) Upgrade to open-webui >= 0.11.1, which fixes the walker to key on the map position rather than the attacker-controlled id field, making it terminate after at most one step per stored message. 2) Because upgrading does not retroactively clean bad data, identify and delete any chats already stored with cyclic parentId references lacking id fields — the advisory confirms that once the walk logic is fixed, previously malformed chats become harmless, but if still on a vulnerable version, deletion is the only recovery path (restarting does not help). 3) Add monitoring/alerting for anomalous CPU pinning (single core near 100%) and steadily climbing resident memory on the open-webui process, and for /health check timeouts, as early indicators of this condition. 4) Consider adding server-side schema validation on chat history writes (reject cycles, require id fields) as defense-in-depth even post-patch, since the write path historically accepted unvalidated chat objects.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-88002?
A default-role user account in open-webui can store a chat whose message history contains a parent-reference cycle with a missing id field, causing the server-side history walker to loop forever on the shared asyncio event loop and hang every request in the process, including unauthenticated health checks and admin endpoints. Any of the 3 downstream dependents running open-webui as their chat UI is exposed, and severity is compounded because the malformed chat persists in the database — a process restart only buys time until the next request touches that chat, and unbounded memory growth means the failure mode can escalate from hang to OOM kill. No exploit code or scanner template is public and this isn't in CISA KEV, but the attack requires nothing more than one authenticated account and a single crafted API request, so exploitability is effectively trivial once an attacker has any login. Upgrade to open-webui 0.11.1 immediately, and because the fix only prevents new hangs, proactively audit and delete any already-stored chats with cyclic or malformed parent chains before or right after patching. In the interim, monitor for sudden CPU pinning and rising resident memory on the open-webui process alongside failing /health checks as an indicator of active exploitation.
Is CVE-2026-88002 actively exploited?
No confirmed active exploitation of CVE-2026-88002 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-88002?
1) Upgrade to open-webui >= 0.11.1, which fixes the walker to key on the map position rather than the attacker-controlled id field, making it terminate after at most one step per stored message. 2) Because upgrading does not retroactively clean bad data, identify and delete any chats already stored with cyclic parentId references lacking id fields — the advisory confirms that once the walk logic is fixed, previously malformed chats become harmless, but if still on a vulnerable version, deletion is the only recovery path (restarting does not help). 3) Add monitoring/alerting for anomalous CPU pinning (single core near 100%) and steadily climbing resident memory on the open-webui process, and for /health check timeouts, as early indicators of this condition. 4) Consider adding server-side schema validation on chat history writes (reject cycles, require id fields) as defense-in-depth even post-patch, since the write path historically accepted unvalidated chat objects.
What systems are affected by CVE-2026-88002?
This vulnerability affects the following AI/ML architecture patterns: self-hosted LLM chat UI / model serving frontend, agent frameworks (subagent-invoking chat pipelines), multi-tenant internal AI assistants.
What is the CVSS score for CVE-2026-88002?
CVE-2026-88002 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.T0034.001 Resource-Intensive Queries Compliance Controls Affected
What are the technical details?
Original Advisory
## Summary Chat histories are stored as an unvalidated JSON object. The walk that reconstructs a chat's message chain detected repeats using each message's own `id` field while moving through the history by map key, so a message that simply omitted `id` was never recorded as visited. A history whose messages referenced each other in a parent cycle therefore made the walk run forever. Any account with the default `user` role could store such a chat and trigger the walk, blocking the server for everyone. ## Preconditions One account with the default `user` role. No administrator rights, no additional permissions, no configuration change and no non-default setting: creating a chat 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. Instances where every account is trusted are affected in the sense that the fault is reachable, but require a user acting deliberately. ## 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. The list it appends to grows without bound, so a memory-capped deployment ends in an out-of-memory kill rather than a hang. The work is not cancelled when the client disconnects, so one fire-and-forget request is enough and the attacker can disconnect immediately. The malformed chat stays in the database, so restarting the process does not clear the condition: the next request that walks that chat hangs the new process, and recovery requires deleting the stored chat. No data is disclosed, altered or deleted. ## Fix Fixed in 0.11.1 by https://github.com/open-webui/open-webui/commit/5c79ccc9e5c9efc2bc024d8f0b9757652ece929a. The walk now records the map key it is currently positioned at instead of the message's self-reported `id`, 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 message-chain reconstruction helper in `backend/open_webui/utils/misc.py`, reached from every path that rebuilds a chat's history, including chat completion, per-chat statistics, context compaction, subagents and timers. Affected setup: all builds from 0.5.0 up to and including 0.11.0. The loop's visited set was keyed on the message body's `id` field while the loop itself advanced by looking the parent up as a key in the history map, so the two used different notions of identity. That `id` field is part of the stored chat object and is fully attacker-controlled, and the guard explicitly skipped recording it when absent, which left the exit condition unreachable for any message that omitted it. The write path does not validate the structure of a chat's history, so a history containing id-less messages in a parent cycle was persisted exactly as submitted. ## Proof of concept As a default-role user on a running instance, store one chat of two messages that reference each other as parents, with the `id` field omitted: ```json {"chat":{"title":"poc","history":{"currentId":"A","messages":{ "A":{"parentId":"B","role":"user","content":"a","childrenIds":[]}, "B":{"parentId":"A","role":"assistant","content":"b","childrenIds":[]}}}}} ``` `POST /api/v1/chats/new` stores it verbatim. A single subsequent `GET /api/v1/chats/stats/usage` as the same user then never returns. Sampled during the hang, the worker consumed one full CPU core and reached 1.86 GB resident within 60 seconds, still growing. Unauthenticated `GET /health` and administrator API calls both time out for as long as the process lives, and continue to do so after the attacker's connection closes. Restarting the server restores service until the first request that walks the stored chat, which hangs the new process the same way. On 0.11.1 the same payload returns promptly, `/health` stays available throughout, and a well-formed chat still resolves its full history. ## Credits @YashvantHange, who reported the missing-`id` cycle in the message-chain walk, demonstrated the resulting server-wide outage end to end against a live instance, and showed that it survives both attacker disconnect and a process restart.
Exploitation Scenario
An employee or contractor with only a standard, default-role open-webui account (no admin rights needed) crafts a two-message chat history where message A's parentId points to B and B's parentId points to A, deliberately omitting the id field from both, and submits it via POST /api/v1/chats/new — the endpoint stores it verbatim with no structural validation. The attacker then issues a single GET to a stats or chat-load endpoint (e.g., /api/v1/chats/stats/usage) that triggers the vulnerable history-reconstruction helper, immediately disconnects, and walks away. On the server, the walker spins forever on the cycle, pins a CPU core, and its unbounded visited-message list grows memory past 1.8GB within a minute — freezing every other user's requests, admin endpoints, and unauthenticated health checks for as long as the process survives. Ops restarts the container to restore service, but the same malformed chat is still in the database, so the very next request that touches it (from any user, at any time) hangs the freshly restarted process the same way, turning a single crafted message into a recurring, self-reinforcing outage until someone identifies and deletes the poisoned chat or patches to 0.11.1.
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