Skip to main content

Open WebUI EUVDEUVD-2026-30608

| CVE-2026-45399 HIGH
Missing Authorization (CWE-862)
2026-05-14 https://github.com/open-webui/open-webui GHSA-8jjp-r2w2-4v22
7.1
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain low-privilege user credentials
  2. Delivery
    Authenticate to Open WebUI API
  3. Exploit
    Enumerate global task IDs via GET /api/tasks
  4. Execution
    Terminate foreign tasks via POST /api/tasks/stop/{task_id}
  5. Persist
    Repeat polling and cancellation loop
  6. Impact
    Sustained denial-of-service against all users' chat tasks

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
MITRE ATT&CK

1 technique across 1 tactic: Privilege Escalation

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires authenticated access to Open WebUI with any verified user role (non-admin sufficient). The CVSS vector PR:L (low privileges required) confirms standard user credentials enable exploitation - no admin or elevated role needed. Attack succeeds against default multi-user deployments with authentication enabled and Redis-backed task management, representing standard production configurations. No special features, non-default settings, or vulnerable plugins required. Exploitation is remote (AV:N) via HTTP API without user interaction (UI:N). Limiting factors: attacker must have a valid user account on the target instance (social engineering or credential compromise prerequisite). Single-user deployments or instances with only one active user at a time see minimal impact since no cross-user tasks exist to terminate. Air-gapped deployments limit attacker reach to internal threat actors. The vulnerability does not enable unauthenticated remote exploitation or privilege escalation - impact is confined to task disruption within the attacker's authenticated session context.

Impact

Real-world risk is elevated in multi-user Open WebUI deployments. CVSS 7.1 (High) is appropriate given network vector (AV:N), low attack complexity (AC:L), low privileges required (PR:L), no user interaction (UI:N), and high availability impact (A:H) with low confidentiality impact (C:L) from task enumeration. Publicly available exploit code exists per the detailed PoC in the GitHub advisory, lowering exploitation barriers to scripting a simple authenticated HTTP request loop. No EPSS or KEV data provided, but active exploitation likelihood is moderate-to-high in exposed multi-user instances given the low skill threshold and immediate operational impact. SSVC factors indicate exploitation is proven (POC public), automatable (curl loop), and technical impact is partial (availability disruption, not full system compromise). However, scope is unchanged (S:U) - attackers cannot escalate privileges or access other users' data, only disrupt their tasks. This is a prioritization edge case: high CVSS reflects real disruption potential in multi-user SaaS or shared deployments, but limited impact in single-user or air-gapped environments. Fix availability in v0.9.0 (April 2026 per description, though this contradicts CVE year 2026 - verify actual release date) and straightforward upgrade path reduce residual risk. Defenders should prioritize patching if operating multi-tenant instances; single-user deployments face negligible risk. The GitHub advisory explicitly notes CVE-2025-63681 as a prior disclosure of the same flaw in v0.6.33, confirming vendor awareness and a history of this authorization gap.

Exploit ScenarioDerived

Attacker authenticates to a multi-user Open WebUI instance with a standard low-privilege user account. Using their bearer token, they send GET /api/tasks to enumerate all active background task IDs across the system, revealing in-progress chat generations and processing jobs for other users. The attacker scripts a loop to continuously poll this endpoint and immediately POST /api/tasks/stop/{task_id} for each discovered task, terminating chat responses mid-generation for all users on the platform. Over minutes, legitimate users experience persistent chat failures and cannot complete LLM interactions, effectively rendering the service unusable. The attacker maintains this denial-of-service with minimal effort (a 10-line bash script) as long as their authenticated session remains valid. If POC code from the GitHub advisory is adapted, exploitation requires no reverse engineering - only valid credentials.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.0% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – May 14, 2026

Broken object-level authorization in Open WebUI allows any authenticated low-privilege user to enumerate and terminate background tasks belonging to other users via GET /api/tasks and POST /api/tasks/stop/{task_id}. Attackers can disrupt system-wide chat generation and background processing by continuously canceling active tasks across the multi-user instance. Publicly available exploit code exists. Vendor-released patch in v0.9.0 restricts global task endpoints to admin-only and introduces a scoped /api/tasks/chat/{chat_id}/stop endpoint for legitimate user-owned task termination. CVSS 7.1 (AV:N/AC:L/PR:L/UI:N) reflects network-accessible, low-complexity exploitation requiring only authenticated low-privilege access, with high availability impact and low confidentiality impact from task enumeration.

RemediationAI

Upgrade Open WebUI to version 0.9.0 or later, released April 2026 per vendor advisory (https://github.com/open-webui/open-webui/releases/tag/v0.9.0). The fix in PR #23454 (commit e7ff4768f) restricts GET /api/tasks and POST /api/tasks/stop/{task_id} to admin-only access via get_admin_user dependency, preventing low-privilege cross-user task enumeration and termination. A new scoped endpoint POST /api/tasks/chat/{chat_id}/stop allows non-admin users to stop only their own chat-associated tasks, reusing existing chat ownership validation logic. Users on v0.9.0 or later are not affected. For deployments unable to upgrade immediately, implement network-layer access controls to restrict /api/tasks/* routes to admin IP ranges only, or apply an API gateway rule rejecting non-admin requests to these paths. Note this workaround breaks legitimate admin task management via API and does not provide per-user task control - full remediation requires the v0.9.0 upgrade. No vendor-supplied temporary mitigation preserves non-admin usability; compensating controls impose admin-only operational restrictions. Verify patch application by confirming non-admin authenticated requests to GET /api/tasks return 403 Forbidden, and POST /api/tasks/chat/{owned_chat_id}/stop succeeds while POST /api/tasks/stop/{arbitrary_task_id} returns 403.

Affected VersionsENISA

open-webui < 0.9.0

Affected Packages

pypi open-webui fix: 0.9.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Open WebUI is a Python-based web interface for LLM chat interactions, often deployed in multi-user environments with Redis-backed task management. The vulnerability stems from CWE-862 (Missing Authorization) in FastAPI route handlers that enforce only authentication (get_verified_user) without object-level authorization checks. The /api/tasks and /api/tasks/stop/{task_id} endpoints in backend/open_webui/main.py operate on a global Redis-backed task namespace (REDIS_TASKS_KEY) without verifying task ownership. Task metadata lacks user_id or chat_id attribution, so the stop_task() helper in backend/open_webui/tasks.py accepts raw task_id strings and performs operations without cross-referencing the caller's identity. This contrasts with the existing scoped GET /api/tasks/chat/{chat_id} endpoint, which correctly validates chat ownership before returning task IDs. The fix in commit e7ff4768f restricts global endpoints to admin-only (get_admin_user) and adds a new POST /api/tasks/chat/{chat_id}/stop endpoint with ownership validation, avoiding schema changes while closing the authorization gap.

Know when Python gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

GitHub Advisory PRIMARY 7.1 HIGH
AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:H

Primary rating from GitHub Advisory · only source for this CVE.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
Low
Integrity
None
Availability
High

DescriptionGitHub Advisory

Summary

Any authenticated user with low privileges can enumerate active background tasks across the system and stop tasks belonging to other users via the GET /api/tasks and POST /api/tasks/stop/{task_id} methods. This allows a casual user to disrupt system-wide chat usage by continuously canceling other users' active tasks. This is a real authorization vulnerability affecting integrity and usability in multi-user deployments.

Details

Open WebUI exposes GET /api/tasks and POST /api/tasks/stop/{task_id} to any verified user. These endpoints operate on a global task namespace and accept raw task_id values without checking whether the task belongs to the current caller.

As a result, a normal authenticated user can enumerate active global task IDs and stop tasks belonging to other users.

Root cause:

  1. Route authorization is too weak.

In backend/open_webui/main.py, both endpoints only require get_verified_user:

python
@app.post('/api/tasks/stop/{task_id}')
async def stop_task_endpoint(request: Request, task_id: str, user=Depends(get_verified_user)):
    result = await stop_task(request.app.state.redis, task_id)

@app.get('/api/tasks')
async def list_tasks_endpoint(request: Request, user=Depends(get_verified_user)):
    return {'tasks': await list_tasks(request.app.state.redis)}

get_verified_user accepts both user and admin roles in backend/open_webui/utils/auth.py.

  1. The helper operates on a global namespace.

In backend/open_webui/tasks.py, task listing is global:

python
async def list_tasks(redis):
    if redis:
        return await redis_list_tasks(redis)
    return list(tasks.keys())

In backend/open_webui/tasks.py, task stopping is by raw task_id:

python
async def stop_task(redis, task_id: str):
    if redis:
        item_id = await redis.hget(REDIS_TASKS_KEY, task_id)
        await redis_send_command(redis, {'action': 'stop', 'task_id': task_id})
        await redis_cleanup_task(redis, task_id, item_id or None)

There is no owner check, no user_id check, and no mapping from task_id back to the current caller before stop or cleanup.

This also appears unintended because the codebase already has a scoped route, GET /api/tasks/chat/{chat_id}, which checks whether the chat belongs to the current user before returning task IDs.

Relevant code references:

  • backend/open_webui/main.py:1975
  • backend/open_webui/main.py:1984
  • backend/open_webui/main.py:1989
  • backend/open_webui/tasks.py:127
  • backend/open_webui/tasks.py:145
  • backend/open_webui/utils/auth.py:415

Suggested remediation:

  • Store task ownership metadata such as user_id and chat_id, then enforce owner-only access for non-admin users
  • Suggested implementation locations:
  • backend/open_webui/main.py: add authentication checks for /api/tasks and /api/tasks/stop/{task_id}
  • backend/open_webui/tasks.py: add support for storing/querying task ownership metadata such as user_id and chat_id, and support owner-scoped listing/stopping

PoC

Preconditions:

  • Default main branch deployment
  • Authentication enabled
  • Two normal user accounts, or any multi-user deployment where the attacker has one authenticated non-admin account
  • At least one task actively running for another user

This does not require any weakened security settings.

PoC objective:

  1. Show that a non-admin user can see global active task IDs that are not their own
  2. Show that the same user can stop another user's active task

Reproduction steps:

Step 1. Victim starts a long-running task

Using the UI, User A starts a long response generation or another background task and leaves it running.

Expected security model: User B should not be able to see or control User A's task.

Step 2. Attacker enumerates global task IDs

Using User B's authenticated token:

bash
curl -i -H "Authorization: Bearer <USER_B_TOKEN>" http://<open-webui-host>/api/tasks

Expected result:

  • only User B's own task IDs should be returned, or
  • the endpoint should be admin-only

Actual result: the response returns the global active task list.

Example response shape:

json
{"tasks":["<task-id-a>","<task-id-b>"]}

This exposes task IDs belonging to other users.

Step 3. Attacker stops a foreign task

Pick a task ID that belongs to User A and send:

bash
curl -i -X POST -H "Authorization: Bearer <USER_B_TOKEN>" http://<open-webui-host>/api/tasks/stop/<FOREIGN_TASK_ID>

Expected result:

  • 403 Forbidden, or
  • 404 Not Found for non-owned tasks, or
  • admin-only access

Actual result: the server accepts the request and attempts to stop the foreign task.

Example response shape:

json
{"status":true,"message":"Task <FOREIGN_TASK_ID> stopped."}
Step 4. Observe boundary violation

User A's running task is interrupted or disappears from the active task set even though User B does not own it.

What actions become possible that should not be possible:

  • enumerate globally active task IDs across users
  • cancel another user's in-progress generation or background work
  • repeat this for every returned task ID, causing broad cross-user disruption

Copy-paste PoC summary:

  1. Enumerate all active tasks as a normal non-admin user
bash
curl -s -H "Authorization: Bearer <USER_B_TOKEN>" http://<open-webui-host>/api/tasks
  1. Stop a task that does not belong to that user
bash
curl -s -X POST -H "Authorization: Bearer <USER_B_TOKEN>" http://<open-webui-host>/api/tasks/stop/<FOREIGN_TASK_ID>

Impact

Type of vulnerability: broken object-level authorization affecting a global runtime control-plane endpoint.

Who is impacted:

  • all users in a multi-user Open WebUI deployment
  • any user currently running a background task, especially chat generation tasks
  • administrators indirectly, because normal users can disrupt system-wide usage without admin privileges

Direct impact:

  • cross-user task ID disclosure
  • cross-user task cancellation

Practical impact:

  • interruption of long-running chat responses
  • interruption of background indexing or ingestion tasks associated with shared runtime jobs
  • one ordinary authenticated low-privilege user can continuously poll /api/tasks and immediately cancel every newly created active task
  • with a simple loop or script, this becomes a practical persistent denial-of-service against chat usage for all users on the instance
  • in a multi-user deployment, normal users may be unable to complete any chat generation while the attacker continues polling and cancelling tasks

Why severity is meaningful:

  • privileges required: low, only an authenticated non-admin account
  • scope: cross-user
  • impact class: integrity and availability
  • exploitation complexity: low once logged in

This is not full account takeover or privilege escalation, but it enables platform-wide operational disruption from a low-privilege account. In practice, sustained exploitation can make chat functionality effectively unusable for other users on the system.

Resolution

Fixed in commit e7ff4768f (#23454, "Add ownership checks to global task endpoints"), first released in v0.9.0 (Apr 2026).

The fix takes a simpler approach than per-task ownership tracking, which would have required a schema change to attribute every task to a user_id:

  • GET /api/tasks and POST /api/tasks/stop/{task_id} are restricted to admin-only via Depends(get_admin_user). Cross-user enumeration and termination are no longer reachable from a non-admin account.
  • A new scoped POST /api/tasks/chat/{chat_id}/stop endpoint covers the legitimate non-admin use case (a user stopping their own in-progress generation), reusing the same chat-ownership check the existing GET /api/tasks/chat/{chat_id} already enforces.

CVE-2025-63681 was a prior disclosure of the same authorization gap against v0.6.33; the fix in v0.9.0 also resolves that.

Users on >= 0.9.0 are not affected.

Executive ViewAI

Why It Matters

Open WebUI versions prior to v0.9.0 contain a broken authorization vulnerability that allows any authenticated user to view and terminate background tasks belonging to other users, enabling denial-of-service attacks against chat generation and processing workflows across multi-user deployments. Organizations running Open WebUI should prioritize patching to prevent service disruption and task enumeration by low-privileged users.

Business Impact: High
Compensating Controls

Apply vendor patch to v0.9.0 or later. If immediate patching is not feasible: restrict network access to /api/tasks and /api/tasks/stop/* endpoints to administrative users only via reverse proxy or API gateway; implement per-session rate limiting on task termination endpoints; monitor task cancellation logs for anomalous patterns from low-privilege accounts; disable non-essential background task processing until patch is deployed.

Threat Intelligence Overview

EPSS Score
0.0%
Top 90% exploitable
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.0%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Partial

Priority Score

36
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-49869 CRITICAL POC
10.0 Jun 26

Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy