vLLM CVE-2026-48746
CRITICALSeverity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Single unauthenticated HTTP request over the network bypasses the API key; full model access and GPU-cost availability impact, but no integrity change to the server, so I:N.
Primary rating from Vendor (https://github.com/vllm-project/vllm).
CVSS VectorVendor: https://github.com/vllm-project/vllm
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Lifecycle Timeline
3Blast Radius
ecosystem impact- 2 pypi packages depend on vllm (2 direct, 0 indirect)
Ecosystem-wide dependent count for version 0.3.0.
DescriptionCVE.org
Summary
A vulnerability in ASGI web servers and starlette's trust on those web servers enables an authentication bypass of the OpenAI API AuthenticationMiddleware, which was discovered during @x41sec's source code audit. It allows to use the API without providing the configured VLLM_API_KEY or --api-key.
Details
In https://github.com/vllm-project/vllm/blob/v0.14.0/vllm/entrypoints/openai/api_server.py#L689-L692 the url_path is taken from the URL, which is reconstructed by _starlette_ based on the request scope.
from starlette.datastructures import URL, Headers, MutableHeaders, State
# ...
url_path = URL(scope=scope).path.removeprefix(root_path)
headers = Headers(scope=scope)
if url_path.startswith("/v1") and not self.verify_token(headers):
response = JSONResponse(content={"error": "Unauthorized"}, status_code=401)
return response(scope, receive, send)
return self.app(scope, receive, send)The request scope includes the request's Host: header and reconstructs the URL as shown below:
f"{scheme}://{host_header}{path}"Neither starlette nor any of the ASGI servers (including uvicorn, which vllm uses) properly filter the Host: header for invalid characters. This allows an attacker to include special URL characters such as / or ? in the Host: header and thereby control the reconstructed URL and it's .path attribute.
FastAPI/starlette's routing uses the HTTP path and does not depend on the parsed url.path attribute, allowing attackers to reach an endpoint via a certain path while providing a different value in the .path.
Impact
- Instances of vllm that use an API Key for the OpenAI API and expose the API to attackers.
- Instances behind an RFC-conforming web server (such as nginx) are not affected.
Articles & Coverage 2
AnalysisAI
Authentication bypass in vLLM versions 0.3.0 through 0.21.x allows remote unauthenticated attackers to reach OpenAI-compatible API endpoints without supplying the configured VLLM_API_KEY by injecting URL-special characters into the HTTP Host header. The flaw stems from vLLM's AuthenticationMiddleware reconstructing the request URL via starlette's URL(scope) - which trusts an unsanitized Host value - while FastAPI routing uses the raw HTTP path, producing a mismatch the attacker controls. No public exploit identified at time of analysis, but x41-dsec disclosed full technical details and a vendor-released patch is available in 0.22.0.
Technical ContextAI
vLLM is a high-throughput LLM inference and serving engine that exposes an OpenAI-compatible REST API through a FastAPI/Starlette application served by uvicorn (an ASGI server). The vulnerable AuthenticationMiddleware in vllm/entrypoints/openai/api_server.py guards any path starting with /v1, but derives that path by calling starlette.datastructures.URL(scope=scope).path, which rebuilds a URL string as scheme://host_header/path and then re-parses it. Because neither uvicorn nor any other listed ASGI server filters invalid characters out of the Host header, an attacker who places '/' or '?' inside Host causes the parsed .path to differ from the raw scope['path'] that Starlette's router actually uses for dispatch - a classic CWE-444 (Inconsistent Interpretation of HTTP Requests / request smuggling) desynchronization between two HTTP parsers in the same stack. The fix (PR #43426) simply reads scope['path'] directly, eliminating the second parser.
RemediationAI
Vendor-released patch: upgrade vllm to 0.22.0 or later, which replaces the URL(scope).path reconstruction with a direct read of scope['path'] (see https://github.com/vllm-project/vllm/pull/43426 and advisory https://github.com/vllm-project/vllm/security/advisories/GHSA-94f4-hr76-p5j6). Where immediate upgrade is not possible, place vLLM behind an RFC-conforming reverse proxy such as nginx that strictly validates the Host header and rejects requests containing '/', '?', '#' or other URL-special characters - the vendor confirms this fully mitigates the bypass, with the trade-off of an added network hop and the operational burden of TLS termination and proxy configuration. Network-level controls such as restricting the uvicorn listener to localhost or an internal VPC and enforcing authentication at an upstream API gateway are also effective; relying solely on the application-layer API key without a sanitizing proxy should be considered unsafe for any version below 0.22.0.
The ngx_http_parse_chunked function in http/ngx_http_parse.c in nginx 1.3.9 through 1.4.0 allows remote attackers to cau
A critical vulnerability in Kubernetes ingress-nginx controller allows unauthenticated attackers with pod network access
nginx 0.8.41 through 1.4.3 and 1.5.x before 1.5.7 allows remote attackers to bypass intended restrictions via an unescap
An issue was discovered on GL.iNet devices before version 4.5.0. Rated critical severity (CVSS 9.8), this vulnerability
Nginx versions since 0.5.6 up to and including 1.13.2 are vulnerable to integer overflow vulnerability in nginx range fi
The resolver in nginx before 1.8.1 and 1.9.x before 1.9.10 allows remote attackers to cause a denial of service (invalid
Kubernetes ingress-nginx contains a configuration injection vulnerability via the mirror-target and mirror-host Ingress
A security issue was discovered in ingress-nginx https://github.com/kubernetes/ingress-nginx where the `auth-url` Ingres
A security issue was discovered in ingress-nginx https://github.com/kubernetes/ingress-nginx where the `auth-tls-match-c
Roxy-WI is a web interface for managing Haproxy, Nginx, Apache and Keepalived servers. Rated critical severity (CVSS 9.8
The STARTTLS implementation in mail/ngx_mail_smtp_handler.c in the SMTP proxy in nginx 1.5.x and 1.6.x before 1.6.1 and
Heap buffer overflow in NGINX Plus and NGINX Open Source ngx_http_rewrite_module allows remote attackers to crash worker
Same weakness CWE-444 – HTTP Request/Response Smuggling
View allSame technique Authentication Bypass
View allVendor StatusVendor
Share
External POC / Exploit Code
Leaving vuln.today
GHSA-94f4-hr76-p5j6