CVE-2026-54018

highPriorität · verfolgen · 0EPSS 0.004 · 32. PerzentilEUUS
grimoire priorityP2 · Scheduled
Exploitable?
—
no known exploitation
Likely / severe?
0.39% (32nd) EPSS
CVSS 7.7 · high
Is it mine?
3 products
Prüfe deine Angriffsfläche
Who says so?
4 sources
cnnvd · enisa_euvd · osv · nvd

EPSS · bewertet 2026-10-27

Open WebUI is a self-hosted artificial intelligence platform designed to operate entirely offline. Prior to 0.9.6, 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 This vulnerability is fixed in 0.9.6.

01

cvss

Technischer Schweregrad, 0–10. Eine Zeile je Quelle.

7.7
010

Basiswert 0–10 · höher = schwerwiegender · Vektor überfahren zum Auflösen

v3.17.7highCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:Nsecondary · ENISA EU
v3.17.7highCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:Nsecondary · security-advisories@github.comAusnutzbarkeit 3.1 · Auswirkung 4
v3.17.7highCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:Nsecondary · OSV
v3.17.1highCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N/E:Usecondary · CVSS-BT (t0sche)
02

SSVC

Eine Handlungsentscheidung — aus Ausnutzung und Auswirkung.

Exploitation: poc · Automatable: no · Technical Impact: partialcoordinatorcisa_ssvcUS
03

schwächen

Die CWE-Schwächeklassen, zu denen dies gehört.

04

betroffene Produkte (3)

Betroffene Produkte und Versionsbereiche.

05

Advisories (2)

Hersteller- und Ökosystem-Meldungen dazu.

  • GHSA-jrfp-m64g-pcwvOpen WebUI: SSRF Protection Bypass in Playwright Web Loader via HTTP Redirects2026-06-17ghsa · osvUS

    ### 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) ```

  • PYSEC-2026-2743Open WebUI: SSRF Protection Bypass in Playwright Web Loader via HTTP Redirects2026-07-13vendor · osvUS

    ### 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) ```

06

auch bekannt als (6)

Weitere Namen und Kennungen dieser Entität.

07

quellen

Welche Quellen diesen Datensatz belegen und wann.

veröffentlicht 2026-06-23geändert 2026-06-25
09

Referenzen (3)

Externe Belege — Patches, Meldungen, Analysen.

scry

Angreifer nutzen Schwachstellen wie diese gegen im Internet exponierte Dienste aus. Sehen Sie mit einem kostenlosen Passiv-Scan, was exponiert ist.

Kostenloser Scan