GHSA-65pg-qhhw-mxwg — open-webui
MEDIUMGHSA-65pg-qhhw-mxwg is a medium-severity (CVSS 5.3) Missing Authentication vulnerability in open-webui. A fix is available for open-webui — see the affected versions and patch details below.
Open WebUI Vulnerable to Unauthenticated RAG Configuration Disclosure
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
- CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
Exploitation and automatability from CISA’s SSVC triage for GHSA-65pg-qhhw-mxwg.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
GHSA-65pg-qhhw-mxwg by exploitation likelihood (EPSS) against impact (CVSS). Outside the shaded patch-first corner.
Where this sits among everything scored
Of 379,842 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Counts from FIRST.org, log-scaled.
Real-World Exposure
open-webuiReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects PyPI packages — download data is not available via public APIs for these ecosystems.
Description
Vulnerability Type: Information Disclosure / Missing Authentication
Severity: Medium
Component: backend/open_webui/routers/retrieval.py — get_status() (GET /)
Affected Endpoint: GET /api/v1/retrieval/
Affected Version: Open WebUI main branch — confirmed unpatched through v0.9.2
Authentication Required: None — internet-facing with zero credentials
CVSSv3.1 Score: 5.3 (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N)
Summary
GET /api/v1/retrieval/ returns live RAG pipeline configuration to any unauthenticated HTTP client. No Authorization header, cookie, or API key is required. Every adjacent endpoint on the same router (/embedding, /config) is correctly guarded by get_admin_user making this a targeted omission.
Root Cause
backend/open_webui/routers/retrieval.py:262
@router.get('/')
async def get_status(request: Request): # ← no Depends(get_verified_user)
return {
'status': True,
'CHUNK_SIZE': request.app.state.config.CHUNK_SIZE,
'CHUNK_OVERLAP': request.app.state.config.CHUNK_OVERLAP,
'RAG_TEMPLATE': request.app.state.config.RAG_TEMPLATE,
'RAG_EMBEDDING_ENGINE': request.app.state.config.RAG_EMBEDDING_ENGINE,
'RAG_EMBEDDING_MODEL': request.app.state.config.RAG_EMBEDDING_MODEL,
'RAG_RERANKING_MODEL': request.app.state.config.RAG_RERANKING_MODEL,
'RAG_EMBEDDING_BATCH_SIZE': request.app.state.config.RAG_EMBEDDING_BATCH_SIZE,
'ENABLE_ASYNC_EMBEDDING': request.app.state.config.ENABLE_ASYNC_EMBEDDING,
'RAG_EMBEDDING_CONCURRENT_REQUESTS': request.app.state.config.RAG_EMBEDDING_CONCURRENT_REQUESTS,
}
Compare with every adjacent endpoint on the same router:
@router.get('/embedding')
async def get_embedding_config(request: Request, user=Depends(get_admin_user)): # ✅
@router.get('/config')
async def get_rag_config(request: Request, user=Depends(get_admin_user)): # ✅
Proof Of Concept — No Token Required
curl -s http://TARGET/api/v1/retrieval/
{
"status": true,
"CHUNK_SIZE": 1000,
"CHUNK_OVERLAP": 100,
"RAG_TEMPLATE": "### Task:\nRespond to the user query using the provided context...\n<context>\n{{CONTEXT}}\n</context>",
"RAG_EMBEDDING_ENGINE": "",
"RAG_EMBEDDING_MODEL": "sentence-transformers/all-MiniLM-L6-v2",
"RAG_RERANKING_MODEL": "",
"RAG_EMBEDDING_BATCH_SIZE": 1,
"ENABLE_ASYNC_EMBEDDING": true,
"RAG_EMBEDDING_CONCURRENT_REQUESTS": 0
}
Disclosed Information and Its Value to an Attacker
| Field | What it reveals |
|---|---|
RAG_EMBEDDING_ENGINE | Backend type (OpenAI, Ollama, Azure, etc.) |
RAG_EMBEDDING_MODEL | Exact model name — reveals embedding model |
RAG_RERANKING_MODEL | Reranker in use — reveals reranker |
RAG_TEMPLATE | RAG template — exposes the RAG template |
CHUNK_SIZE / CHUNK_OVERLAP | Chunking parameters — enables exact reconstruction of how documents are split and retrieved |
Attack Scenario
- Attacker sends one unauthenticated HTTP GET to
/api/v1/retrieval/. - Response reveals the embedding model and chunking parameters.
- Attacker uses the exact chunk size/overlap to craft RAG poisoning payloads that are guaranteed to be retrieved.
Impact
- RAG template disclosure
- Infrastructure fingerprinting — embedding engine and model name reveal the AI stack to an internet scanner
- RAG attack surface mapping — chunk parameters enable precise calculation of retrieval boundaries
- Zero-effort recon — no brute force, no credentials, no rate-limit concern. Single request from any IP.
Recommended Fix
Add get_verified_user dependency (or get_admin_user for stricter control):
# BEFORE (vulnerable)
@router.get('/')
async def get_status(request: Request):
# AFTER
@router.get('/')
async def get_status(request: Request, user=Depends(get_verified_user)):
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐍PyPI | open-webui | all versions | 0.9.5pip install --upgrade 'open-webui==0.9.5' |
Affected Products
open webuiopenwebuiDetection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for open-webui, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update open-webui to 0.9.5 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-65pg-qhhw-mxwg is resolved across your whole dependency graph.
Workarounds
Put an independent control in front of the weakness: restrict the affected endpoint or interface to trusted networks, require an additional authentication factor or proxy-level check, and invalidate existing sessions and credentials in case the flaw has already been used.
How to detect GHSA-65pg-qhhw-mxwg
A community-maintained Nuclei template exists for this CVE. You can scan for it directly:
nuclei -id ghsa-65pg-qhhw-mxwg -u https://target- Template
- Open WebUI < 0.9.5 - Information Disclosure
- Severity
- medium
- Impact
- Remote attackers can access sensitive configuration data without authentication, potentially aiding further attacks.
- Remediation
- Update to version 0.9.5 or later.
Template by ProjectDiscovery nuclei-templates (0x_Akoko), MIT licensed. View the full template. Scan only systems you are authorised to test.
Frequently Asked Questions
Is GHSA-65pg-qhhw-mxwg in your dependencies?
Find it across PyPI, including transitive dependencies.