GitHub Advisoryadvisory · PyPI

GHSA-jh67-hwqw-m5r7 rok Python ProxyShare can be used as an SSRF proxy through absolute URL paths

CRITICAL Published 2026-05-19 Modified 2026-05-19 Official page ↗
Aliases
CVE-2026-45568
Ecosystem
PyPI
Packages
zrok
Severity
Critical
CVSS vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:H/SI:H/SA:L
Weaknesses
CWE-22
Reviewed
2026-05-19

Affected packages

• PyPI zrok: >= 0.4.47, <= 1.1.11 (no fix yet)

Description

Summary Alice exposes a Python SDK `ProxyShare` with a fixed target URL. Bob sends a request to the share with an absolute URL in the path. The Flask handler passes that path to `urllib.parse.urljoin`, which replaces Alice's configured target host with Bob's host and returns the server-side response to Bob. Details The Python SDK proxy route accepts every path under the share: ```python @app.route('/', defaults={'path': ''}, methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']) @app.route('/', methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']) def proxy(path): ``` It constructs the outbound URL with `urljoin` and then sends the request: ```python url = urllib.parse.urljoin(self.target, path) resp = requests.request( method=request.method, url=url, headers={key: value for (key, value) in request.headers if key.lower() not in HOP_BY_HOP_HEADERS}, data=request.get_data(), cookies=request.cookies, allow_redirects=False, stream=True, verify=self.verify_ssl ) ``` When `path` is `http://127.0.0.1:19190/metadata`, `urljoin(self.target, path)` returns `http://127.0.0.1:19190/metadata`. The proxy sends the request to Bob's chosen URL rather than Alice's target.

Related

Alias · CVE (1)

  • CVE-2026-45568 zrok is software for sharing web services, files, and network resources. vulnerability

Weakness · CWE (1)

  • CWE-22 Improper Limitation of a Pathname to a Restricted Directory weakness

References