GitHub Advisoryadvisory · PyPI
GHSA-jh67-hwqw-m5r7 rok Python ProxyShare can be used as an SSRF proxy through absolute URL paths
CRITICAL
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