Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L
PR:L because a valid authenticated account is mandatory; C/I/A all Low because impact is unauthorized backend access without credential exfiltration, data disclosure, or scope change.
Primary rating from Vendor (https://github.com/open-webui/open-webui).
CVSS VectorVendor: https://github.com/open-webui/open-webui
Lifecycle Timeline
2DescriptionCVE.org
Summary
Several direct, index-addressed Ollama proxy routes accept a caller-supplied url_idx path parameter and use it as a raw index into the admin-configured OLLAMA_BASE_URLS list. Access control on these routes validates only whether the user may use the requested *model*, never which *backend* the request is routed to. Any authenticated user can append an arbitrary url_idx to force their request onto an Ollama backend they were never authorized to reach, including internal, higher-privilege, or explicitly admin-disabled backends.
Affected endpoints
All indexed Ollama routes that resolve the backend through get_ollama_url():
POST /ollama/api/chat/{url_idx}
POST /ollama/api/generate/{url_idx}
POST /ollama/api/embed/{url_idx}
POST /ollama/api/embeddings/{url_idx}
POST /ollama/v1/chat/completions/{url_idx}
POST /ollama/v1/completions/{url_idx}
POST /ollama/v1/messages/{url_idx}
POST /ollama/v1/responses/{url_idx}Root cause
backend/open_webui/routers/ollama.py - get_ollama_url() consults the model-to-backend allow-list (OLLAMA_MODELS[model]["urls"]) only when url_idx is omitted. When the caller supplies url_idx, that mapping is skipped and the value is used directly as an index:
async def get_ollama_url(request: Request, model: str, url_idx: Optional[int] = None):
if url_idx is None:
models = request.app.state.OLLAMA_MODELS
if model not in models:
raise HTTPException(...)
url_idx = random.choice(models[model].get("urls", []))
url = request.app.state.config.OLLAMA_BASE_URLS[url_idx]
# caller-controlled, no authz
return url, url_idxThe outbound request is then sent to that backend using the backend's own configured API key. Backends an admin has disabled (OLLAMA_API_CONFIGS["<idx>"].enable = false) are hidden from model discovery but remain reachable through the indexed route, because the disabled state is never re-checked at request time.
Impact
A verified, non-admin user with read access to any single model can:
- route requests to internal / higher-capability / restricted Ollama backends in
multi-backend deployments, bypassing backend-level isolation;
- reach backends the admin has explicitly disabled;
- have those requests authenticated with the target backend's configured API key
(the key is used server-side; it is not returned to the attacker);
- consume the restricted backend's compute.
There is no cross-user data disclosure and no exfiltration of the backend credential itself; the impact is unauthorized access to, and use of, restricted backend resources.
Affected / Patched
- Affected:
<= 0.9.5 - Patched:
>= 0.9.6
Fix
0.9.6 adds validate_ollama_backend_idx(), invoked on every indexed route (directly and via get_ollama_url()), which returns 403 for any non-admin caller-supplied url_idx that is not in the requested model's allowed urls. Because disabled backends are absent from every model's urls, the same check also blocks routing to disabled backends.
AnalysisAI
Incorrect authorization in Open WebUI versions 0.9.5 and earlier allows any authenticated non-admin user to route LLM inference requests to arbitrary configured Ollama backends - including internally restricted, higher-privilege, or admin-disabled instances - by supplying a raw integer url_idx path parameter on eight indexed proxy routes. The flaw bypasses backend-level access isolation entirely: model authorization is checked, but backend authorization is silently skipped when url_idx is caller-supplied, and disabled backends remain reachable because their disabled state is never re-evaluated at request time. No public exploit code and no CISA KEV listing have been identified at time of analysis; however, the attack requires only a valid user account and knowledge of the URL pattern, making it a low-barrier insider threat in any multi-backend deployment.
Technical ContextAI
Open WebUI is a Python-based (FastAPI) web interface for managing and proxying requests to one or more Ollama LLM backends. In multi-backend configurations, admins populate OLLAMA_BASE_URLS as an ordered list and assign models to specific backend indices via OLLAMA_MODELS[model]['urls']. The vulnerable function get_ollama_url() in backend/open_webui/routers/ollama.py contains a conditional branch: when url_idx is absent, it enforces the model-to-backend allowlist; when url_idx is present (caller-supplied), it skips that check entirely and indexes directly into OLLAMA_BASE_URLS[url_idx]. Eight POST routes expose this parameter in their URL path. The root cause is CWE-863 (Incorrect Authorization): the system correctly authenticates the user and checks model-level permissions, but omits the orthogonal authorization check of whether the authenticated user is permitted to target a specific backend index. The affected package is pip/open-webui (CPE: pkg:pip/open-webui). The fix in 0.9.6 introduces validate_ollama_backend_idx() called on every indexed route, returning HTTP 403 for any non-admin url_idx not present in the requested model's authorized backend list.
RemediationAI
Upgrade open-webui to version 0.9.6 or later, which is the vendor-released patch (confirmed by GitHub Security Advisory GHSA-9rpj-v7hf-vv2w). Version 0.9.6 introduces validate_ollama_backend_idx() on all eight affected indexed routes, enforcing that any caller-supplied url_idx is present in the model's authorized backend list and blocking routing to disabled backends. The advisory is at https://github.com/open-webui/open-webui/security/advisories/GHSA-9rpj-v7hf-vv2w. If immediate upgrade is not feasible, a compensating control is to block the /{url_idx} path variants at the reverse proxy or API gateway layer (e.g., deny any request path matching /ollama/(api|v1)/[^/]+/[0-9]+$); note this will break any clients that depend on direct backend indexing and may affect legitimate admin workflows. A second workaround - with significant operational trade-off - is to consolidate to a single Ollama backend, eliminating the attack surface entirely at the cost of multi-backend capability.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
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
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
Same weakness CWE-863 – Incorrect Authorization
View allSame technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-38522
GHSA-9rpj-v7hf-vv2w