Skip to content
vLLMGHSA-pf3h-qjgv-vcpr

vLLM: Server-Side Request Forgery (SSRF) in `download_bytes_from_url `

Medium5.4CVE-2026-34753 · Published Apr 3, 2026 · updated Sep 10, 2026

GitHub advisory

Affected versions

PackageAffectedFixed in
vllm
PyPI
>= 0.16.0, < 0.19.00.19.0
Details and references

### Summary A Server Side Request Forgery (SSRF) vulnerability in `download_bytes_from_url` allows any actor who can control batch input JSON to make the vLLM batch runner issue arbitrary HTTP/HTTPS requests from the server, without any URL validation or domain restrictions. This can be used to target internal services (e.g. cloud metadata endpoints or internal HTTP APIs) reachable from the vLLM host. ------ ### Details #### Vulnerable component The vulnerable logic is in the batch runner entrypoint `vllm/entrypoints/openai/run_batch.py`, function `download_bytes_from_url`: ``` # run_batch.py Lines 442-482 async def download_bytes_from_url(url: str) -> bytes: """ Download data from a URL or decode from a data URL. Args: url: Either an HTTP/HTTPS URL or a data URL (data:...;base64,...) Returns: Data as bytes """ parsed = urlparse(url) # Handle data URLs (base64 encoded) if parsed.scheme == "data": # Format: data:...;base64,<base64_data> if "," in url: header, data = url.split(",", 1) if "base64" in header: return base64.b64decode(data) else: raise ValueError(f"Unsupported data URL encoding: {header}") else: raise ValueError(f"Invalid data URL format: {url}") # Handle HTTP/HTTPS URLs elif parsed.scheme in ("http", "https"): async with ( aiohttp.ClientSession() as session, session.get(url) as resp, ): if resp.status != 200: raise Exception( f"Failed to download data from URL: {url}. Status: {resp.status}" ) return await resp.read() else: raise ValueError( f"Unsupported URL scheme: {parsed.scheme}. " "Supported schemes: http, https, data" ) ``` Key properties: - The function only parses the URL to dispatch on the scheme (`data`, `http`, `https`). - For `http` / `https`, it directly calls `session.get(url)` on the provided string. - There is no validation of: - hostname or IP address, - whether the target is internal or external, - port number, - path, query, or redirect target. - This is in contrast to the multimodal media path (`MediaConnector`), which implements an explicit domain allowlist. `download_bytes_from_url` does not reuse that protection. #### URL controllability The `url` argument is fully controlled by batch input JSON via the `file_url` field of `BatchTranscriptionRequest` / `BatchTranslationRequest`. 1. Batch request body type: ``` # run_batch.py Line 67-80 class BatchTranscriptionRequest(TranscriptionRequest): """ Batch transcription request that uses file_url instead of file. This class extends TranscriptionRequest but replaces the file field with file_url to support batch processing from audio files written in JSON format. """ file_url: str = Field( ..., description=( "Either a URL of the audio or a data URL with base64 encoded audio data. " ), ) ``` ``` # run_batch.py Line 98-111 class BatchTranslationRequest(TranslationRequest): """ Batch translation request that uses file_url instead of file. This class extends TranslationRequest but replaces the file field with file_url to support batch processing from audio files written in JSON format. """ file_url: str = Field( ..., description=( "Either a URL of the audio or a data URL with base64 encoded audio data. " ), ) ``` There is no restriction on the domain, IP, or port of `file_url` in these models. 1. Batch input is parsed directly from the batch file: ``` # run_batch.py Line 139-179 class BatchRequestInput(OpenAIBaseModel): ... url: str body: BatchRequestInputBody @field_validator("body", mode="plain") @classmethod def check_type_for_url(cls, value: Any, info: Val

CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:L
Severity from
GitHub (reviewed advisory)
Weakness
CWE-918
Also known as
CVE-2026-34753, PYSEC-2026-3410

More vLLM advisories

All vLLM
DateAdvisory
Apr 3vLLM: Unauthenticated OOM Denial of Service via Unbounded `n` Parameter in OpenAI API Server
CVE-2026-34756Medium6.5fixed in 0.19.0
Apr 3vLLM: Denial of Service via Unbounded Frame Count in video/jpeg Base64 Processing
CVE-2026-34755Medium6.5fixed in 0.19.0
Mar 27vLLM has Hardcoded Trust Override in Model Files Enables RCE Despite Explicit User Opt-Out
CVE-2026-27893High8.8fixed in 0.18.0
Mar 9vLLM has SSRF Protection Bypass
CVE-2026-25960Medium5.4fixed in 0.17.0
Apr 27vLLM makes Use of Uninitialized Resource
CVE-2026-7141Low5.6fixed in 0.19.1
May 5vLLM Vulnerable to Remote DoS via Special-Token Placeholders
CVE-2026-44222Medium6.5fixed in 0.20.0

Critical advisories by email

Wednesdays: the week’s critical and high advisories in the AI and data stack, with the fixed versions. Only in weeks that have some.

Double opt-in. Unsubscribe any time.