CVE-2026-88002: open-webui: infinite-loop DoS crashes entire server

GHSA-jqhh-cjmq-vmv6 MEDIUM
Published September 9, 2026
CISO Take

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.

Sources: NVD GitHub Advisory CISA KEV ATLAS

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?

Crafted payload submission
A default-role user POSTs a chat with two messages whose parentId fields reference each other in a cycle and omit the id field; the write path stores it verbatim with no structural validation.
Trigger infinite loop
A single follow-up request (e.g. chat stats) invokes the history-reconstruction helper, which never terminates because it tracks visited messages by the attacker-controlled id field instead of the map key used to advance.
AML.T0034.001
Service-wide denial of service
The synchronous loop pins the shared asyncio event loop and grows memory without bound, blocking /health and all authenticated and admin requests until an OOM kill occurs, and the condition recurs after restart until the malformed chat is deleted.
AML.T0029

What systems are affected?

Package Ecosystem Vulnerable Range Patched
Open WebUI pip >= 0.5.0, < 0.11.1 0.11.1
151.8K 3 dependents Pushed 7d ago 83% patched ~5d to patch Full package profile →

Do you use Open WebUI? You're affected.

How severe is it?

CVSS 3.1
6.5 / 10
EPSS
0.3%
chance of exploitation in 30 days
Higher than 26% of all CVEs
Exploitation Status
No known exploitation
Sophistication
Trivial

What is the attack surface?

AV AC PR UI S C I A
AV Network
AC Low
PR Low
UI None
S Unchanged
C None
I None
A High

What should I do?

1 step
  1. 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:

EU AI Act
Article 15 - Accuracy, robustness and cybersecurity
OWASP LLM Top 10
LLM04 - Model Denial of Service

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

self-hosted LLM chat UI / model serving frontendagent frameworks (subagent-invoking chat pipelines)multi-tenant internal AI assistants

MITRE ATLAS Techniques

AML.T0029 Denial of AI Service
AML.T0034.001 Resource-Intensive Queries

Compliance Controls Affected

EU AI Act: Article 15
OWASP LLM Top 10: LLM04

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'): 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

Timeline

Published
September 9, 2026
Last Modified
September 14, 2026
First Seen
September 10, 2026

Related Vulnerabilities