Sep 17, 2026·6 min read·6 visits
vLLM versions prior to 0.24.0 are vulnerable to remote Denial of Service via an audio decompression bomb targeting the chat completions API, causing an immediate worker crash due to memory exhaustion.
CVE-2026-57173 (GHSA-hcwq-8wjf-3gcr) represents a critical resource allocation validation vulnerability in the vLLM inference engine. Prior to version 0.24.0, vLLM's multimodal chat completions pipeline failed to enforce maximum audio decode duration limits. Unauthenticated remote attackers can exploit this to perform an audio decompression bomb attack, causing massive memory allocations that trigger immediate system Out-Of-Memory (OOM) crashes and service termination.
vLLM is an open-source, high-throughput inference and serving engine designed for Large Language Models (LLMs). To support multimodal inputs such as speech-to-text and vision-language tasks, vLLM incorporates media processing pipelines to parse, decode, and transform incoming binary files (such as images and audio) into structured numerical tensors.
Prior to version 0.24.0, a security boundary omission existed within vLLM's audio ingestion pipeline. Specifically, the multimodal chat completions path (/v1/chat/completions) failed to propagate the maximum audio decode duration constraint (VLLM_MAX_AUDIO_DECODE_DURATION_S) when calling underlying audio decoding interfaces. This omission allows unauthenticated attackers to submit crafted audio files that bypass runtime limits.
This vulnerability is classified under CWE-770 (Allocation of Resources Without Limits or Throttling). It permits a remote attacker to execute an Endpoint Denial of Service (DoS) attack, commonly referred to as an audio decompression bomb. The impact of this exploit is the immediate exhaustion of physical or virtual memory, resulting in an Out-Of-Memory (OOM) crash of the Python worker processes.
The root cause of this vulnerability lies in the structural separation of API pathways in the vLLM server. The dedicated speech-to-text transcription endpoint (/v1/audio/transcriptions) explicitly enforced duration boundaries. However, the multimodal chat completions endpoint (/v1/chat/completions) relied on the AudioMediaIO class in vllm/multimodal/media/audio.py to ingest and decode audio streams.
Within AudioMediaIO, the helper methods load_bytes and load_file are responsible for deserializing payloads. In vulnerable versions, these methods invoked the shared decoding routine load_audio(data, sr=None) without supplying the keyword argument max_duration_s. Consequently, the parameter defaulted to None inside the underlying backend wrapper, which leverages PyAV or SoundFile decoders.
Without an explicit duration limitation, the decoder attempts to decompress the entire stream regardless of its actual or declared playback length. An attacker can construct a highly compressed audio stream that expands into a massive uncompressed array of 32-bit floating-point (float32) Pulse Code Modulation (PCM) samples in RAM. Because the decompression process occurs synchronously during request parsing, the operating system's Out-Of-Memory (OOM) killer terminates the parent Python process to prevent system-wide instability.
To understand the technical correction, we must review the git diff in the affected module vllm/multimodal/media/audio.py. The patch explicitly introduces global configuration imports and passes the runtime boundary down the execution stack.
# Vulnerable Implementation
class AudioMediaIO:
# ...
def load_bytes(self, data: bytes) -> tuple[npt.NDArray, float]:
# Decodes raw bytes with no max_duration_s parameter supplied
return load_audio(BytesIO(data), sr=None)
def load_file(self, filepath: Path) -> tuple[npt.NDArray, float]:
# Decodes target local file with no max_duration_s parameter supplied
return load_audio(filepath, sr=None)# Patched Implementation
import vllm.envs as envs
class AudioMediaIO:
# ...
def load_bytes(self, data: bytes) -> tuple[npt.NDArray, float]:
# Explicitly propagates the global environmental decode limit
return load_audio(
BytesIO(data),
sr=None,
max_duration_s=envs.VLLM_MAX_AUDIO_DECODE_DURATION_S,
)
def load_file(self, filepath: Path) -> tuple[npt.NDArray, float]:
# Explicitly propagates the global environmental decode limit
return load_audio(
filepath,
sr=None,
max_duration_s=envs.VLLM_MAX_AUDIO_DECODE_DURATION_S,
)The fix is robust against normal payload abuse because the underlying load_audio implementation uses the propagated max_duration_s value to check the container's duration headers or terminate early during streaming decoding. However, a potential weakness remains if the container metadata is malformed to spoof a short duration while containing highly dense multi-channel audio data packets.
The vulnerability is exploited by targeting the /v1/chat/completions API route with a crafted payload containing a highly compressed audio stream. Attackers can leverage the asymmetric compression capabilities of modern codecs such as FLAC, Opus, or MP3. These formats can compress minutes or hours of silent or highly repetitive audio signals into a few hundred kilobytes.
Additionally, vLLM supports inline Data URLs allowing attackers to transmit base64-encoded audio directly inside JSON objects. Since these payloads are fully self-contained, they are parsed instantly upon receipt, bypassing external network fetch timeout guards such as VLLM_AUDIO_FETCH_TIMEOUT. The decoding process allocates memory according to the formula: Samples = Sample Rate * Channels * Duration. For standard 44.1 kHz stereo audio decoded to 32-bit floating point, each second requires approximately 352.8 kilobytes of memory, allowing small files to demand gigabytes of RAM during decompression.
The primary impact of this vulnerability is a complete loss of service availability for the affected vLLM node. Because vLLM often runs as a high-performance single-process system with heavy GPU and system memory allocations, a sudden spike in RAM utilization triggers the host Linux kernel's Out-Of-Memory (OOM) killer. This terminates the core serving daemon instantly, dropping all active inference sessions and preventing new requests from being served.
The CVSS v3.1 score is evaluated at 6.5 (Medium) with the vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H. Although the CVSS vector lists Privileges Required as Low (PR:L) due to standard multi-tenant API assumptions, many default vLLM deployments are exposed directly to internal networks or the open internet without authentication, making the bug practically unauthenticated. No confidentiality or integrity impact is associated with this vulnerability.
Remediation requires upgrading the vLLM engine to version 0.24.0 or higher, where the duration validation is consistently applied across all ingestion paths. For environments where immediate updates are not feasible, administrators must apply the security patches manually to the audio.py module.
In addition to upgrading, several defensive postures should be implemented:
Restrict Request Body Sizes: Configure reverse proxies (e.g., NGINX, Envoy, Cloudflare) to drop requests exceeding a strict threshold, such as 5MB, which prevents the transmission of extremely large base64-encoded audio buffers.
Adjust Environmental Limits: Set the environment variable VLLM_MAX_AUDIO_DECODE_DURATION_S to a lower value (such as 120 or 300) to restrict the maximum allowable memory allocated per-request.
Deploy API Gateways: Ensure that the model endpoints are protected behind an API gateway enforcing strict authentication, rate-limiting, and client quotas to mitigate bulk denial-of-service attempts.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
vLLM vLLM Project | < 0.24.0 | 0.24.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-770 |
| Attack Vector | Network |
| CVSS v3.1 Score | 6.5 |
| EPSS Score | Not Recorded |
| Impact | Endpoint Denial of Service (OOM Crash) |
| Exploit Status | Proof of Concept (PoC) |
| KEV Status | Not Listed |
The software allocates a resource (memory) on behalf of an actor without specifying limits on the amount of resource that can be consumed.
A critical unauthenticated arbitrary module import vulnerability in the djust framework before version 1.0.7 allows remote attackers to execute arbitrary code by exploiting unsafe Python reflection during LiveView connection mounting.
A denial-of-service (DoS) and resource exhaustion vulnerability exists in Grav CMS prior to version 2.0.0. The package installer decompressor fails to validate ZIP archive limits before extraction, allowing authenticated administrators to cause disk exhaustion, inode exhaustion, or process termination.
Grav CMS before v2.0.1 contains a security bypass vulnerability in its blueprint validation logic. The XSS detection routine, Security::detectXss(), was executed on raw page contents prior to Twig engine processing. When Twig processing is enabled for editor-authored page content, an attacker can dynamically reconstruct harmful HTML elements, attributes, or protocols using string concatenation (e.g. `{{ 'on' ~ 'error' }}`). When compiled, the benign source converts into active XSS payloads, which are rendered to the client browser via raw filters. This vulnerability was resolved in version 2.0.1 by adding a post-render validation backstop.
An OAuth resource spoofing vulnerability in the rmcp crate prior to 2.0.0 allows a malicious Model Context Protocol (MCP) server to spoof protected resource metadata. By presenting metadata pointing to a legitimate resource and authorization server, the attacker can trick the client into completing the authentication flow and subsequently sending the authorized token back to the malicious server.
CVE-2026-63128 is a high-severity uncontrolled resource consumption vulnerability in the Model Context Protocol (MCP) official Rust SDK (the rmcp crate) prior to version 2.0.0. An unauthenticated attacker can exploit this vulnerability by sending malformed or mismatching handshake requests to the stateful Streamable HTTP server, causing persistent memory allocation without cleanup. This results in an unbounded memory leak and lock contention that ultimately leads to complete denial of service.
A cross-site scripting (XSS) vulnerability was identified in @nuxtjs/mdc prior to version 0.22.1. Gaps in the HTML/SVG attribute verification and URL protocol parsing allow unauthenticated remote attackers to bypass the application's sanitization routines. By embedding malicious SVG links or data-encoded iframe elements within Markdown, attackers can execute arbitrary JavaScript in the victim's browser context.