pypi package report

Is vllm safe?

111 known vulnerabilities, worst severity CRITICAL.

// reach

97 direct dependencies

25 carry known advisories, worst CRITICAL

40 packages depend on it

an advisory here reaches each of them

Create a free accountfor every dependency path, dependent and what to upgrade
// ai models

108 published models carry an advisory from this package

0 pin a version the advisory is confirmed against; the rest declare it without a version.

ATH-MaaS/OvisOCR3CRITICALnot pinned
BDRC/tibetan-ocrCRITICALnot pinned

110 published models

0 declared · 110 observed · 0 inferred

ModelEvidence
abhishekchohan/gemma-3-12b-it-quantized-W4A16observed
ai-sage/GigaChat3.1-Audio-10B-A1.8Bobserved
Create a free accountto see all 108 models and per-model risk

110 published AI models are associated with this package: 0 name it in a requirements or pyproject file, 110 load it or import it directly, and 0 are inferred from the runtime stack their declared library pulls in. Only 0 state a version requirement, so this is not a count of affected models.


cvss
9.1
critical

CVSS v3.1 base score out of 10

epss
1.2%
medium

chance of exploitation in 30 days, 67th percentile of all CVEs

xyz score
4.9
medium

CyberXYZ composite out of 10

fig. 01 — GHSA-94f4-hr76-p5j6, the advisory selected below

// 111 advisories

GHSA-94f4-hr76-p5j6

CRITICALGitHub ratingCVE-2026-48746
// 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.
// cvss v3.1 vector

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H

Attack vector
Network
Attack complexity
Low
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
High

Checked 2026-11-06 at 21:51 UTC. The most recent advisory here was published 2026-10-28. Updated continuously from NVD, GHSA, OSV and CNA feeds.

Think a verdict here is wrong? Tell us — we respond within 2 business days.