Open WebUI: Low-privilege authenticated users can enumerate and stop global background tasks, causing system-wide chat disruption (GHSA-8jjp-r2w2-4v22) · Sieve
높음취약점
Open WebUI: Low-privilege authenticated users can enumerate and stop global background tasks, causing system-wide chat disruption
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:
Show that a non-admin user can see global active task IDs that are not their own
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.
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.