CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-87013

CVE-2026-87013: Denial of Service via Cyclic Folder Structures in Open WebUI

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 11, 2026·6 min read·18 visits

Executive Summary (TL;DR)

Authenticated users can create self-referencing folder loops in Open WebUI, triggering an infinite recursion that consumes 100% CPU and causes a Denial of Service.

An authenticated denial of service vulnerability exists in Open WebUI versions 0.10.0 through 0.11.0. An attacker can update a folder's parent identifier to establish cyclic folder references, causing recursive tree-walking operations to execute infinitely, leading to CPU exhaustion and localized application denial of service.

Vulnerability Overview

The Open WebUI platform is a feature-rich, self-hosted user interface designed for interacting with large language models. To facilitate user organization of prompts, custom agents, and active chat sessions, the platform includes a folder hierarchy subsystem. Folders are represented in the backend database as discrete entries containing an ID and an optional parent ID pointer, constructing a directed tree structure. The endpoint POST /api/v1/folders/{id}/update/parent is responsible for handling parent folder reassignments when users move folders within the interface.\n\nPrior to version 0.11.1, Open WebUI did not perform validation checks on parent folder updates to determine whether the proposed parent was the folder itself or one of its descendants. This omission allowed authenticated users to configure folder trees with circular references, effectively introducing directed cycles within the database graph. When recursive operations are executed against these components, the absence of a visited-node tracking mechanism leads to infinite iterations.\n\nThe resulting vulnerability is classified under CWE-835: Loop with Unreachable Exit Condition. Although the vulnerability requires low-privileged authentication to trigger, it presents a reliable vector for denial of service. A single user can lock up database access and application server threads by forcing the backend to endlessly loop through queries and memory-appends, exhausting the available pool of system resources.

Root Cause Analysis

The core issue stems from a logical failure during the write-path operation of updating folder hierarchies. In the backend implementation, a folder is modeled with an identifier and a nullable parent identifier field. When the parent ID is updated, the server processes the database change immediately. However, it lacks hierarchical structure validation, allowing a folder's parent pointer to refer to any target, including its own children or itself.\n\nOnce a cycle is introduced, any routine traversing the tree recursively from top-to-bottom or bottom-to-top will run into an infinite loop. The tree traversal logic executes a depth-first search (DFS) without maintaining a registry of previously visited identifiers. Consequently, when the recursive iterator navigates to a child node that references an ancestor as its parent, the execution state loops indefinitely.\n\nThis execution loop occurs synchronously on the application worker thread. While Python's asynchronous model (async/await) allows thread yielding during database queries, the absolute consumption of database connections and synchronous data appends inside the cycle causes immediate thread starvation. The continuous scheduling of the looping task blocks other operations, resulting in application exhaustion and localized Denial of Service.

Code Analysis and Vulnerable Path

The vulnerable logic is visible across several backend services, including retrieval, deletion, and permission checking. In the vulnerable version of backend/open_webui/models/folders.py, the subtree extraction function get_children does not keep track of nodes already visited during recursive execution:\n\npython\n# Vulnerable recursive retrieval logic in folders.py\nasync def get_children(folder):\n children = await self.get_folders_by_parent_id_and_user_id(folder.id, user_id, db=db)\n for child in children:\n # Recursion triggers without tracking visited folder IDs\n await get_children(child)\n folders.append(child)\n\n\nThe patch implemented in commit 23b3a69bc26839bfa74edd1be6bfa2568ae902f4 fixes this structural risk by maintaining a seen_ids set on both retrieval and deletion paths. If an ID is encountered that already exists within the set, the recursion path is aborted:\n\npython\n# Patched recursive retrieval logic in folders.py\nasync def get_children_folders_by_id_and_user_id(id, user_id, db):\n # ...\n folders = []\n seen_ids = {id}\n\n async def get_children(folder):\n children = await self.get_folders_by_parent_id_and_user_id(folder.id, user_id, db=db)\n for child in children:\n if child.id in seen_ids:\n continue # Abort cycle if the child folder was already visited\n seen_ids.add(child.id)\n await get_children(child)\n folders.append(child)\n\n\nAdditionally, the patch implements preventive validations inside the update router (backend/open_webui/routers/folders.py). It queries the database to verify whether the new parent_id resides within the folder's existing subtree before allowing the record modification:\n\npython\n# Preventative validation check during parent updates\nif form_data.parent_id and form_data.parent_id in await Folders.get_folder_ids_by_id_and_user_id_in_subtree(\n id, user.id, db=db\n):\n raise HTTPException(\n status_code=status.HTTP_400_BAD_REQUEST,\n detail=ERROR_MESSAGES.DEFAULT('Cannot move a folder into itself or one of its subfolders'),\n )\n

Exploitation Methodology

To exploit this vulnerability, an attacker must first obtain a standard, low-privileged authenticated session on the Open WebUI application. No administrator permissions are necessary to trigger the flaw, as the affected endpoint is accessible to any registered user managing their folders.\n\nFirst, the attacker identifies two folders owned by their user account, for example, folder_A and folder_B. They send an HTTP POST request to nested folder endpoints to place folder_B under folder_A. Next, they issue another POST request targeting the endpoint of folder_A and set its parent identifier to folder_B. This API call constructs a closed loop within the database:\n\nhttp\nPOST /api/v1/folders/folder_A_id/update/parent HTTP/1.1\nHost: target.domain\nAuthorization: Bearer <user_jwt_token>\nContent-Type: application/json\n\n{\n \"parent_id\": \"folder_B_id\"\n}\n\n\nOnce the database record is saved with the cyclic structure, the attacker triggers the infinite loop by executing any API action that causes a recursive tree walk. A common trigger is deleting folder_A, retrieving the folder structure, or loading active UI elements that query folder memberships. As the server receives the request, it gets locked in the infinite recursion loop, fully exhausting a CPU core and rapidly filling the available heap.

Impact and Severity Assessment

The primary impact of CVE-2026-87013 is localized Denial of Service (DoS). Because Python's standard web deployments run on limited worker processes (typically controlled by Gunicorn or Uvicorn), locking up even a few worker threads through recursive infinite loops can render the entire application completely unresponsive to all other users.\n\nFurthermore, introducing a cycle causes structural corruption within the user interface. Cyclic folders cannot locate their root ancestor; consequently, they fail to render in the UI sidebar, disappearing from standard client view. Because the database contains corrupted foreign key mappings, affected users are unable to delete or modify these "invisible" folders from the frontend, requiring direct database administrator intervention to clean up.\n\nThe vulnerability has been assigned a CVSS score of 4.3 (Medium). This reflects the low complexity of the attack, the network vector, and the low privilege requirement, combined with a partial loss of availability. Although it does not expose sensitive data or facilitate arbitrary code execution, the ease with which a standard user can disrupt system availability makes it an important flaw to address in multi-user deployments.

Remediation and Mitigation

The definitive resolution for this issue is upgrading Open WebUI to version 0.11.1 or above. The update implements rigorous validation on the write-path to block the creation of cyclic parent-child links, and integrates self-healing recovery logic on the read-path to automatically re-root folders when structural cycles are detected.\n\nmermaid\ngraph LR\n A[\"Client API Request\"] --> B{\"Validation Check\"}\n B -- \"Cycle Detected\" --> C[\"HTTP 400 Bad Request\"]\n B -- \"No Cycle\" --> D[\"Write to DB\"]\n\n\nIf upgrading is not immediately possible, administrators can mitigate the risk by deploying a custom Web Application Firewall (WAF) rule to block self-referential parent updates. Specifically, rules should match POST requests to /api/v1/folders/(?P<id>[^/]+)/update/parent and compare the path variable {id} with the JSON body key parent_id. If they are identical, the WAF should drop the request immediately.\n\nAlternatively, database administrators can identify and resolve loops manually by executing a recursive Common Table Expression (CTE) query to find circular references. If any are discovered, setting the parent_id column of the looping nodes to NULL will safely break the cycle and restore normal system operations.

Technical Appendix

CVSS Score
4.3/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L

Affected Systems

Open WebUI

Affected Versions Detail

Product
Affected Versions
Fixed Version
open-webui
open-webui
>= 0.10.0, < 0.11.10.11.1
AttributeDetail
CWE IDCWE-835
Attack VectorNetwork
CVSS Severity4.3 (Medium)
EPSS Score0.00268 (Percentile: 18.84%)
ImpactDenial of Service (DoS) via Thread Exhaustion
Exploit StatusNo Public PoC / No Active Exploitation
CISA KEV StatusNot Listed
CWE-835
Loop with Unreachable Exit Condition ('Infinite Loop')

Vulnerability Timeline

Fix commit merged in Pull Request #28748
2026-08-24
GitHub Security Advisory GHSA-8r35-5x5r-hv74 published
2026-09-09
CVE-2026-87013 assigned
2026-09-09
NVD record updated
2026-09-10

References & Sources

  • [1]https://github.com/open-webui/open-webui/security/advisories/GHSA-8r35-5x5r-hv74
  • [2]https://github.com/open-webui/open-webui/pull/28748
  • [3]https://github.com/open-webui/open-webui/commit/23b3a69bc26839bfa74edd1be6bfa2568ae902f4
  • [4]https://github.com/open-webui/open-webui/releases/tag/v0.11.1
  • [5]https://nvd.nist.gov/vuln/detail/CVE-2026-87013

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•1 day ago•CVE-2026-115895
8.8

CVE-2026-115895: Code Injection via Unsanitized Import Alias in Happy DOM ECMAScript Module Compiler

CVE-2026-115895 is a high-severity code injection vulnerability (CWE-94) in the happy-dom npm package prior to version 21.0.4. The vulnerability exists within the ECMAScriptModuleCompiler component, which transforms ECMAScript module syntax into executable Node.js functions when JavaScript evaluation is enabled. Due to an incomplete fix for CVE-2026-33943, the compiler failed to validate local named import aliases against legal JavaScript identifier rules. Attackers supplying crafted module imports—specifically utilizing destructuring default initializers alongside JSON module attributes—can inject arbitrary JavaScript expressions directly into the host Node.js runtime context.

Amit Schendel
Amit Schendel
7 views•10 min read
•1 day ago•CVE-2026-115883
6.0

CVE-2026-115883: Cross-Namespace Access via Dot-Delimited Labels in LangGraph Postgres and SQLite Stores

An improper input validation and authorization bypass vulnerability exists in the LangGraph storage layer affecting langgraph, langgraph-checkpoint-postgres, and langgraph-checkpoint-sqlite. Because relational store implementations serialize namespace tuples into dot-delimited strings without validating labels on read, search, delete, and batch operations, an attacker who controls a namespace label can inject periods (.) to traverse namespace boundaries and access, modify, or delete data belonging to other namespaces.

Amit Schendel
Amit Schendel
8 views•9 min read
•1 day ago•CVE-2026-115886
6.5

CVE-2026-115886: Unauthenticated Server-Side Request Forgery and Unsafe Reflection in MLflow Scorer Evaluation Endpoints

CVE-2026-115886 (GHSA-2wqp-q3c6-ccj5) is a Server-Side Request Forgery (SSRF) and Unsafe Reflection vulnerability in MLflow versions 3.12.0rc0 prior to 3.17.0. Unauthenticated REST API endpoints accept serialized third-party scorer JSON payloads that are dynamically deserialized and reflectively instantiated without sanitizing constructor keyword arguments. When optional dependencies such as trulens and trulens-providers-litellm are installed, attackers can inject egress-steering arguments into the scorer payload, forcing the MLflow server to dispatch outbound HTTP requests to arbitrary internal destinations or cloud metadata services.

Alon Barad
Alon Barad
9 views•10 min read
•1 day ago•CVE-2026-113872
7.5

CVE-2026-113872: Unauthenticated Process Crash in Express Multer via Late Busboy Stream Resumption

CVE-2026-113872 (GHSA-q7qp-rjg7-q26m) is a high-severity denial-of-service vulnerability affecting the multer multipart/form-data upload middleware for Node.js and Express in versions 2.0.0 through 2.4.0. When an endpoint is configured to accept multiple files using an asynchronous fileFilter callback, a crafted, truncated multipart HTTP request can trigger an unhandled error event on the underlying busboy stream parser after request teardown has already completed. Because all error listeners are stripped during teardown, Node.js treats the resulting error event as an uncaught exception and immediately terminates the server process.

Amit Schendel
Amit Schendel
7 views•12 min read
•1 day ago•CVE-2026-115897
2.1

CVE-2026-115897: Cross-Site Scripting via Function Body Boundary Bypass in serialize-javascript

CVE-2026-115897 (also tracked as GHSA-m5mm-p8h7-m29v and aliased as CVE-2026-115754) is a Cross-Site Scripting (XSS) vulnerability in the Yahoo serialize-javascript npm package prior to version 7.1.3. The flaw exists in the regular expression used by escapeFunctionBody() to neutralize HTML script closing tags within serialized JavaScript functions. Because function bodies are sanitized in isolation before structural formatting is applied, a function whose string representation terminates directly with the sequence '</script' bypasses the positive lookahead check. When combined with serialization formatting options that introduce whitespace delimiters and a subsequent property that supplies a closing bracket, an attacker can prematurely terminate an enclosing HTML <script> block and inject arbitrary HTML or JavaScript into the rendered document.

Amit Schendel
Amit Schendel
7 views•13 min read
•1 day ago•CVE-2026-109841
5.9

CVE-2026-109841: Subresource Integrity Verification Bypass in Node.js Undici

CVE-2026-109841 is a Subresource Integrity (SRI) verification bypass vulnerability in undici, the official HTTP/1.1 and HTTP/2 client library for Node.js that powers the global fetch() implementation. The flaw stems from improper handling of case sensitivity (CWE-178) when validating cryptographic hash algorithm tokens within SRI metadata. Because undici compared incoming algorithm identifiers against a strictly lowercase set without prior ASCII-lowercase normalization, valid uppercase or mixed-case tokens such as SHA256- or Sha384- were treated as unrecognized algorithms and discarded. Under SRI forward-compatibility rules, discarding all provided tokens results in an empty integrity list, causing undici to fail open and accept tampered HTTP response bodies without cryptographic verification.

Alon Barad
Alon Barad
10 views•9 min read