CSIRTS // UNIFIED SECURITY ADVISORY FEEDSYS ● ONLINE · POWERED BY INTELFUSIONS.COM

CVE-2026-54017

highCVSS 7.7covered by 1 sourcefirst seen 2026-06-17
Summary The terminal-server reverse proxy in backend/open_webui/routers/terminals.py does not fully confine the user-controlled path segment before forwarding it to an admin-configured terminal server. An authenticated user who has been granted access to a terminal server can craft path values containing encoded ../ traversal sequences that escape the intended path (or policy) scope on that server, reaching unintended endpoints and files on the terminal-server host. Where the terminal server fans requests out to internal services, this also gives SSRF-style reach into those services. This is a separate code path from the /api/v1/retrieval/process/web SSRF (GHSA-c6xv-rcvw-v685), with its own input. Two distinct vectors are consolidated here: 1. Raw path forwarding / single-encoded traversal (original report). 2. A bypass of the subsequently-added _sanitize_proxy_path mitigation using double-encoded dots (%252e%252e). The attacker-controlled input is the request path, supplied by the non-admin user, not anything an administrator configures, so this is not an admin-trust / Rule-9 situation. Affected code The proxy route forwards an arbitrary trailing path to the configured terminal server: routers/terminals.py @router.api_route('/{server_id}/{path:path}', methods=PROXY_METHODS) async def proxy_terminal(server_id, path, request, user=Depends(get_verified_user)): ... safe_path = _sanitize_proxy_path(path) if safe_path is None: return JSONResponse({'error': 'Invalid path'}, status_code=400) target_url = f'{base_url}/{safe_path}' policy_id = connection.get('policy_id') if policy_id: target_url = f'{base_url}/p/{policy_id}/{safe_path}' Access requires has_connection_access(user, connection, ...), i.e. a non-admin user the administrator has granted to that terminal server. Vector 1 — single-encoded traversal (original) The path was originally concatenated to the base URL with no sanitization (target_url = f"{base_url}/{path}"), so single-encoded traversal escaped t

⚡ Watch CVE-2026-54017

Get an email if CVE-2026-54017 is added to CISA KEV, gains public exploit code, or a new advisory cites it — max one per day, one-click unsubscribe.

Exploitation outlook

Advisory coverage (1)

External references

NVD record for CVE-2026-54017

CVE.org record

Embed the live status

CVE-2026-54017 live status badge — this badge updates automatically when the KEV or exploit status changes. How to embed it →

[![CVE-2026-54017 status](https://www.csirts.com/badge/CVE-2026-54017)](https://www.csirts.com/cve/CVE-2026-54017)