vLLM CVE-2026-44223
MEDIUMSeverity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Network API access requires low-privilege credentials (PR:L); single request deterministically crashes service (A:H); no confidentiality or integrity impact applies.
Primary rating from Vendor (https://github.com/vllm-project/vllm).
CVSS VectorVendor: https://github.com/vllm-project/vllm
Lifecycle Timeline
3DescriptionCVE.org
Summary
The extract_hidden_states speculative decoding proposer in vLLM returns a tensor with an incorrect shape after the first decode step, causing a RuntimeError that crashes the EngineCore process. The crash is triggered when any request in the batch uses sampling penalty parameters (repetition_penalty, frequency_penalty, or presence_penalty).
A single request with a penalty parameter (e.g., "repetition_penalty": 1.1) is sufficient to crash the server. The crash is deterministic and immediate - no concurrency, race condition, or special workload is required.
Details
In vLLM v0.17.0, the extract_hidden_states proposer's propose() method returned sampled_token_ids.unsqueeze(-1), producing a tensor of shape (batch_size, 1).
In PR #37013 (first released in v0.18.0), the KV connector interface was refactored out of propose(). The return type changed from tuple[Tensor, KVConnectorOutput | None] to Tensor, and the .unsqueeze(-1) call was removed along with the KV connector output:
# Before (v0.17.0):
return sampled_token_ids.unsqueeze(-1), kv_connector_output
# shape (batch_size, 1)
# After (v0.18.0+):
return sampled_token_ids
# shape (batch_size, 2) after first decode stepThe refactor missed that sampled_token_ids changed semantics between the first and subsequent decode steps. After the first decode step, the rejection sampler allocates its output as (batch_size, max_spec_len + 1). With num_speculative_tokens=1, this produces shape (batch_size, 2) instead of the expected (batch_size, 1), causing a broadcast shape mismatch during penalty application.
Impact
Any vLLM deployment between v0.18.0 and v0.19.1 (inclusive) configured with extract_hidden_states speculative decoding is affected. A single API request containing any penalty parameter immediately and permanently crashes the EngineCore process, resulting in complete loss of service availability.
Patches
Fixed in PR #38610, first included in vLLM v0.20.0. The fix slices the return value to sampled_token_ids[:, :1], ensuring the correct (batch_size, 1) shape regardless of the rejection sampler's output dimensions.
Workarounds
- Upgrade to vLLM v0.20.0 or later.
- If upgrading is not possible, avoid using
extract_hidden_statesas the speculative decoding method on affected versions. - Alternatively, reject or strip penalty parameters (
repetition_penalty,frequency_penalty,presence_penalty) from incoming requests at an API gateway before they reach vLLM.
AnalysisAI
Denial of service in vLLM v0.18.0-v0.19.1 permanently crashes the EngineCore process when any API request includes a sampling penalty parameter against a deployment configured with extract_hidden_states speculative decoding. A refactor in PR #37013 (v0.18.0) removed the .unsqueeze(-1) call that normalized tensor shape, causing a broadcast shape mismatch ((batch_size, 2) vs. expected (batch_size, 1)) during penalty application and an unrecoverable RuntimeError. The crash is deterministic - a single request with repetition_penalty: 1.1 suffices - but no public exploit code has been identified at time of analysis and EPSS is very low (0.04%, 12th percentile).
Technical ContextAI
vLLM is a Python LLM inference engine (pip package pkg:pip/vllm) that implements speculative decoding to accelerate token generation by proposing candidate tokens via a lightweight proposer before main-model verification. The extract_hidden_states proposer, implemented in vllm/v1/spec_decode/extract_hidden_states.py, had its propose() return type changed in PR #37013 from tuple[Tensor, KVConnectorOutput | None] to bare Tensor, simultaneously dropping the .unsqueeze(-1) call. After the first decode step, the rejection sampler allocates output with shape (batch_size, max_spec_len + 1); with num_speculative_tokens=1 this becomes (batch_size, 2). When any of the three penalty tensors (repetition_penalty, frequency_penalty, presence_penalty) are broadcast against this mis-shaped output, PyTorch raises a RuntimeError. The root cause class is CWE-131 (Incorrect Calculation of Buffer Size): a refactor-induced shape invariant violation with no bounds check or defensive slicing.
RemediationAI
Upgrade to vLLM v0.20.0 or later, which includes the fix from PR #38610 (https://github.com/vllm-project/vllm/pull/38610); the patch adds sampled_token_ids[:, :1] slicing in extract_hidden_states.py to enforce the correct (batch_size, 1) shape. If immediate upgrade is not feasible, two compensating controls are available with different trade-offs: first, disable extract_hidden_states as the speculative decoding method and switch to a different proposer or disable speculative decoding entirely - this eliminates the vulnerable code path with no impact on non-speculative inference, but loses speculative decoding throughput gains; second, configure an API gateway or middleware to strip or reject requests containing repetition_penalty, frequency_penalty, or presence_penalty fields before they reach vLLM - this preserves speculative decoding performance but breaks client applications that depend on those sampling parameters.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
Same weakness CWE-131 – Incorrect Calculation of Buffer Size
View allSame technique Denial Of Service
View allVendor StatusVendor
SUSE
Severity: ModerateShare
External POC / Exploit Code
Leaving vuln.today
GHSA-83vm-p52w-f9pw