CVE-2026-54018: open-webui: SSRF via redirect bypass in Playwright loader
GHSA-jrfp-m64g-pcwv HIGH CISA: TRACK*Open WebUI's Playwright-based RAG web loader validates only the initial submitted URL but blindly follows HTTP 301/302 redirects, allowing a low-privileged attacker to reach internal infrastructure — including cloud Instance Metadata Services (AWS/GCP/Azure IMDS at 169.254.169.254), internal APIs, and Docker container networks — by pointing the loader at an attacker-controlled redirect server. The CVSS Scope:Changed and Confidentiality:High reflect a true cross-boundary breach: a web UI user piercing network isolation to steal cloud IAM credentials or enumerate internal services. EPSS places this in the top 91% of CVEs by exploitation likelihood, the attack requires only a basic HTTP server and a low-privilege account, and a working PoC is published in the GitHub advisory. Patch to open-webui 0.9.6 immediately; as an interim control, switch RAG_WEB_LOADER_ENGINE away from playwright and block egress to 169.254.169.254 and RFC1918 ranges at the network layer.
What is the risk?
High. CVSS 7.7 with Scope:Changed and Confidentiality:High reflects cross-boundary impact where a web-tier attacker breaches internal infrastructure. Attack Complexity is Low and only a valid account is required (Privileges:Low), making this accessible to any user-level threat actor. The top-91% EPSS percentile and a publicly documented PoC in the GitHub advisory significantly compress the exploitation window. Cloud-hosted deployments are at highest risk due to IMDS credential theft enabling full cloud account pivot. Container-based deployments face lateral movement across the Docker network. The package carries 107 tracked CVEs and a risk score of 38/100, indicating a persistent vulnerability surface warranting architectural review beyond this single fix.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Open WebUI | pip | <= 0.9.5 | 0.9.6 |
Do you use Open WebUI? You're affected.
How severe is it?
What is the attack surface?
What should I do?
5 steps-
Patch
upgrade open-webui to >= 0.9.6, which implements Playwright page.route() interception to validate all URLs in the redirect chain before connection — the only complete fix.
-
Immediate workaround
set RAG_WEB_LOADER_ENGINE to a non-Playwright engine (e.g., requests-based loader) to eliminate the vulnerable code path until patching is complete.
-
Network-layer defense
add egress firewall rules on Open WebUI containers blocking outbound connections to 169.254.169.254 (AWS/GCP/Azure IMDS), 100.100.100.200 (Alibaba IMDS), and all RFC1918 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16).
-
Detection
monitor for HTTP 3xx responses from external hosts resolving to private or link-local IPs; alert on outbound connections from Open WebUI processes to internal network ranges.
-
Audit
treat all historical URL submissions by non-admin users to the URL Loader or Web Search features as potentially adversarial and review corresponding network logs for anomalous internal requests.
What does CISA's SSVC say?
Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-54018?
Open WebUI's Playwright-based RAG web loader validates only the initial submitted URL but blindly follows HTTP 301/302 redirects, allowing a low-privileged attacker to reach internal infrastructure — including cloud Instance Metadata Services (AWS/GCP/Azure IMDS at 169.254.169.254), internal APIs, and Docker container networks — by pointing the loader at an attacker-controlled redirect server. The CVSS Scope:Changed and Confidentiality:High reflect a true cross-boundary breach: a web UI user piercing network isolation to steal cloud IAM credentials or enumerate internal services. EPSS places this in the top 91% of CVEs by exploitation likelihood, the attack requires only a basic HTTP server and a low-privilege account, and a working PoC is published in the GitHub advisory. Patch to open-webui 0.9.6 immediately; as an interim control, switch RAG_WEB_LOADER_ENGINE away from playwright and block egress to 169.254.169.254 and RFC1918 ranges at the network layer.
Is CVE-2026-54018 actively exploited?
No confirmed active exploitation of CVE-2026-54018 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-54018?
1. **Patch**: upgrade open-webui to >= 0.9.6, which implements Playwright page.route() interception to validate all URLs in the redirect chain before connection — the only complete fix. 2. **Immediate workaround**: set RAG_WEB_LOADER_ENGINE to a non-Playwright engine (e.g., requests-based loader) to eliminate the vulnerable code path until patching is complete. 3. **Network-layer defense**: add egress firewall rules on Open WebUI containers blocking outbound connections to 169.254.169.254 (AWS/GCP/Azure IMDS), 100.100.100.200 (Alibaba IMDS), and all RFC1918 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16). 4. **Detection**: monitor for HTTP 3xx responses from external hosts resolving to private or link-local IPs; alert on outbound connections from Open WebUI processes to internal network ranges. 5. **Audit**: treat all historical URL submissions by non-admin users to the URL Loader or Web Search features as potentially adversarial and review corresponding network logs for anomalous internal requests.
What systems are affected by CVE-2026-54018?
This vulnerability affects the following AI/ML architecture patterns: RAG pipelines, AI web UI deployments, containerized ML infrastructure, cloud-hosted AI workspaces.
What is the CVSS score for CVE-2026-54018?
CVE-2026-54018 has a CVSS v3.1 base score of 7.7 (HIGH). The EPSS exploitation probability is 0.34%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0049 Exploit Public-Facing Application AML.T0053 AI Agent Tool Invocation AML.T0064 Gather RAG-Indexed Targets AML.T0086 Exfiltration via AI Agent Tool Invocation Compliance Controls Affected
What are the technical details?
Original Advisory
### Summary The SafePlaywrightURLLoader implements a validate_url 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 ENABLE_RAG_LOCAL_WEB_FETCH being set to False ### Details Root Cause The application validates the initial user-provided URL using self._safe_process_url_sync(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._safe_process_url_sync(url) page = browser.new_page() response = page.goto(url, timeout=self.playwright_timeout) #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. ENABLE_RAG_LOCAL_WEB_FETCH=False (Default) 3. RAG_WEB_LOADER_ENGINE=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 # attack_server.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 lazy_load and alazy_load methods: ```python # async context async def intercept_route(route): try: await run_in_threadpool(validate_url, route.request.url) await route.continue_() except Exception: await route.abort() await page.route("**/*", intercept_route) response = await page.goto(url, timeout=self.playwright_timeout) ```
Exploitation Scenario
An attacker with a basic Open WebUI account deploys a minimal Flask server on a public VPS responding to all requests with HTTP 302 to http://169.254.169.254/latest/meta-data/iam/security-credentials/role-name. They submit the VPS URL via Open WebUI's URL Loader feature. SafePlaywrightURLLoader resolves the VPS domain to a public IP, passes validation, and calls page.goto(). Playwright follows the 302 to the IMDS endpoint without re-validation, fetching the AWS IAM credential JSON (AccessKeyId, SecretAccessKey, Token). The RAG pipeline surfaces the response in the UI or in an error message containing the raw HTTP body. The attacker extracts the temporary credentials and uses them to enumerate S3 buckets, escalate IAM privileges, or access RDS instances — pivoting from a web UI user account to full cloud account compromise.
Weaknesses (CWE)
CWE-918 — Server-Side Request Forgery (SSRF): The web server receives a URL or similar request from an upstream component and retrieves the contents of this URL, but it does not sufficiently ensure that the request is being sent to the expected destination.
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N References
Timeline
Related Vulnerabilities
CVE-2026-44551 9.1 open-webui: LDAP auth bypass — full account takeover
Same package: open-webui CVE-2026-45672 8.8 open-webui: code exec gate bypass via API endpoint
Same package: open-webui CVE-2026-44552 8.7 open-webui: Redis cache poisoning enables cross-instance tool hijack
Same package: open-webui CVE-2025-64495 8.7 Open WebUI: XSS-to-RCE via malicious prompt injection
Same package: open-webui CVE-2026-45315 8.7 open-webui: stored XSS → JWT theft and admin takeover
Same package: open-webui