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-87014

CVE-2026-87014: Session Desynchronization and Privilege Persistence in Open WebUI

Alon Barad
Alon Barad
Software Engineer

Sep 11, 2026·7 min read·23 visits

Executive Summary (TL;DR)

A session desynchronization flaw in Open WebUI lets demoted administrators retain administrative read/write access to all users' collaborative notes via active, uninvalidated Socket.IO connections.

Open WebUI from version 0.9.0 to 0.11.1 is vulnerable to a state desynchronization and privilege persistence flaw. When an administrator is demoted to a standard user via Single Sign-On (SSO) role synchronization, the local database is updated, but their active Socket.IO connection is not invalidated. Because the WebSocket handlers authorize operations using the cached role in the socket context, the demoted user retains administrative read and write access to all collaborative notes.

Vulnerability Overview

Open WebUI relies on persistent, real-time communication channels to facilitate features such as streaming completions, system status updates, and collaborative document editing. The underlying architecture integrates a stateful Socket.IO server alongside its standard HTTP REST API endpoints to manage these high-frequency, bidirectional streams. During the initial WebSocket handshake, the backend authenticates the client using their token, resolves their access permissions, and caches their current database role within the memory-resident socket session context. This design is highly efficient for serving rapid real-time updates as it eliminates the overhead of executing relational database queries for every websocket frame.

The vulnerability, designated as CVE-2026-87014, arises from a synchronization failure between the application's relational database and these memory-cached WebSocket connection states. When an administrative user is demoted to a standard user through automated Single Sign-On (SSO) mechanisms—such as reverse-proxy trusted role headers or OAuth group mapping—the role update is written exclusively to the database. The active Socket.IO connection remains open and completely untouched, retaining its stale, cached administrative privilege levels.

This desynchronization bypasses the security boundaries of the platform's authorization model. Since the WebSocket event handlers validate incoming user actions against the cached connection state rather than querying the relational database for each frame, the demoted user retains administrative read and write privileges over restricted resources. Specifically, this allows the demoted user to read, edit, or delete collaborative notes belonging to any other user on the system, completely undermining tenant isolation.

Root Cause Analysis

The primary root cause of this security vulnerability lies in the asymmetric implementation of session-management and invalidation routines within the Open WebUI platform. When an administrator manually demotes a user's role via the local administrative HTTP API (located in backend/open_webui/routers/users.py), the controller explicitly invokes the disconnect_user_sessions helper. This helper is designed to forcefully terminate all active Socket.IO connections tied to that user's ID, forcing a client reconnection and re-authentication cycle that synchronizes the privilege states.

However, this termination logic was entirely omitted in the automated, dynamic synchronization pathways used by external Identity Providers (IdPs). Specifically, during SSO reverse-proxy trusted header parsing (handled in backend/open_webui/routers/auths.py) and OAuth group-to-role mappings (handled in backend/open_webui/utils/oauth.py), the application directly executes database update queries. The backend modifies the role field within the database row representing the user, but the existing stateful TCP connections and their memory-cached variables are left intact without any session invalidation.

Because Socket.IO represents a long-lived stateful connection, the handler authorization checks are designed to optimize database performance by reading metadata directly from the connection's session object. The system assumes that any change in user privileges will be pushed to the connection, but the lack of an event framework or direct coupling between the SSO controllers and the Socket.IO subsystem allows this assumption to fail under normal operating conditions. This structural gap allows the in-memory cache to remain privileged while the primary database registry registers the demotion.

Code Analysis

Analysis of the vulnerable codebase reveals that the trusted-header and OAuth authentication flows executed isolated database updates. In backend/open_webui/routers/auths.py, the trusted-header authentication routine updated user roles using the following pattern:

if trusted_role in {'admin', 'user', 'pending'}:
    if user.role != trusted_role:
        await Users.update_user_role_by_id(user.id, trusted_role, db=db)

This pattern changed the database row but failed to notify the Socket.IO server. A similar omission was present in backend/open_webui/utils/oauth.py, which updated database records during mapping operations without triggering session invalidations.

The remediation patch introduced an event-driven synchronization architecture by registering SocketSessionEventSink in backend/open_webui/events.py. This sink handles USER_ROLE_UPDATED events globally, ensuring that any component modifying a user's role publishes an event that resolves to a WebSocket disconnection call. The patched auth controller now executes the following sequence:

if trusted_role in {'admin', 'user', 'pending'}:
    if user.role != trusted_role:
        updated_user = await Users.update_user_role_by_id(user.id, trusted_role, db=db)
        if updated_user:
            user = updated_user
            await publish_event(
                request,
                EVENTS.USER_ROLE_UPDATED,
                actor=updated_user,
                subject_id=updated_user.id,
                source='trusted_header',
                data={'role': updated_user.role},
            )

Additionally, the session invalidation function disconnect_user_sessions within backend/open_webui/socket/main.py was hardened. The original implementation queried only specific room associations using get_session_ids_from_room(f'user:{user_id}'). The updated logic implements get_session_ids_by_user_id(user_id), which additionally scans the global in-memory SESSION_POOL mapping to ensure no stale connections escape disconnection:

def get_session_ids_by_user_id(user_id: str) -> list[str]:
    session_ids = set(get_session_ids_from_room(f'user:{user_id}'))
    session_ids.update(sid for sid, entry in SESSION_POOL.items() if entry and entry.get('id') == user_id)
    return list(session_ids)

Exploitation Methodology

To successfully exploit this session desynchronization flaw, an attacker must first obtain administrative privileges on an Open WebUI instance that integrates with an external SSO identity provider. The attacker must establish a stateful, active Socket.IO connection by opening a session in a web browser. This populates the memory-resident cache of the Socket.IO server with an active 'admin' context, mapping the specific WebSocket session ID to the administrative security classification.

While this connection remains active, the attacker's administrative privileges must be revoked or downgraded on the external identity provider side. When the Open WebUI application processes an HTTP request containing the updated SSO headers or handles an OAuth refresh/callback, the backend executes the database write to downgrade the user's role to 'user'. Because the Socket.IO session is not killed, the WebSocket connection remains established.

The attacker can then issue custom Socket.IO events targeted at collaborative notes endpoints. When the server-side handler processes these events, it queries the connection metadata rather than the database. Finding the cached 'admin' string, the handler permits the execution of administrative operations, allowing the attacker to read, modify, or delete collaborative notes across all user accounts on the platform.

Impact Assessment

The technical impact of CVE-2026-87014 is categorized as a high-severity privilege persistence and authorization bypass. An attacker who has been demoted from an administrative role retains complete read and write access to all collaborative notes in the system. Since these notes can contain sensitive configuration data, prompt templates, proprietary source code, or private user queries, unauthorized access poses a severe risk to data confidentiality and integrity.

The CVSS v3.1 score is calculated as 6.5 (Medium) with the vector CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:N. Although the impact on confidentiality and integrity is high, the overall score is mitigated by the requirement for high privileges (PR:H) to establish the initial administrative state. However, in enterprise environments utilizing dynamic group memberships and automated SSO role assignments, this window of vulnerability remains wide if demotions are not enforced in real-time.

The EPSS score is currently estimated at 0.00278, which indicates a low immediate probability of active exploitation in the wild. Additionally, this CVE is not listed in CISA's Known Exploited Vulnerabilities (KEV) catalog, and there are no public weaponized exploits or proof-of-concept scripts available, making this a secondary threat vector that must still be addressed to guarantee session integrity.

Remediation & Mitigation

The primary remediation path is upgrading the Open WebUI deployment to version 0.11.1 or later. This version incorporates the event-driven session-disconnection framework and the hardened session lookup helper. Upgrades can be performed using standard Python package management tools or by pulling the updated Docker images:

pip install --upgrade open-webui

If an immediate upgrade is not feasible due to change control constraints, administrators should implement a manual mitigation procedure. This involves executing a complete restart of the Open WebUI application service or Docker container immediately following any SSO-driven role changes or user demotions. Restarting the service terminates the in-memory SESSION_POOL and forces all clients to establish new Socket.IO handshakes, which will pull the updated role from the database.

Additionally, security teams should implement logging and monitoring rules to detect anomalous WebSocket behavior. Specifically, monitoring scripts should correlate database user roles against active Socket.IO session IDs and log any actions where a user with a database role of 'user' initiates WebSocket commands that are structurally restricted to administrative accounts.

Fix Analysis (1)

Technical Appendix

CVSS Score
6.5/ 10
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:N
EPSS Probability
0.28%
Top 80% most exploited

Affected Systems

Open WebUI

Affected Versions Detail

Product
Affected Versions
Fixed Version
Open WebUI
Open WebUI
>= 0.9.0, < 0.11.10.11.1
AttributeDetail
CWE IDCWE-613 / CWE-863
Attack VectorNetwork
CVSS Score6.5 (Medium)
EPSS Score0.00278 (0.28%)
ImpactHigh (Confidentiality & Integrity)
Exploit StatusNo public PoC
KEV StatusNot listed

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-613
Insufficient Session Expiration

The software does not invalidate a session or cache after a state or privilege change occurs, allowing persistent unauthorized access.

References & Sources

  • [1]GitHub Security Advisory GHSA-wjwr-xfp9-r66p
  • [2]Fix Commit
  • [3]Open WebUI v0.11.1 Release
  • [4]NVD - CVE-2026-87014

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
10 views•10 min read
•2 days 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
8 views•12 min read
•2 days 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
•2 days 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
11 views•9 min read