CVE-2026-114050: vLLM: Forged multimodal UUID + P0/P1 processor-cache eviction drift: unauthenticated remote crash of the whole vLLM engine
Multimodal content parts (image_url, video_url, input_audio, …) accept a user-supplied uuid field that vLLM uses verbatim as the item’s cache identity (mm_hash). The two frontend/engine processor caches (P0 “sender” cache in the API process, P1 “receiver” cache in the EngineCore process) are independent LRU caches whose evictions are not synchronized, and the P1 hit path performs zero consistency validation — it silently substitutes the cached item’s tensor data for whatever the current request actually contains.
A single unauthenticated client can exploit this to kill the entire engine, deterministically, with default server flags:
- Seed: send a small image with
uuid="U". Both caches now mapUto an item with N_A visual tokens (e.g. 4). - Drift: send ~70 requests, each carrying a unique uuid, a max-size image, and an over-long text prompt. Each request is rejected with 400 — but after its image has been inserted into the P0 cache (insertion happens during chat rendering, before prompt-length validation), so these requests fill P0 without ever reaching the engine/P1.
Uis evicted from P0 only. - Kill: send a large image with
uuid="U". P0 misses → the image is freshly processed and the prompt is spliced with N_B (e.g. 2048+) placeholder tokens; the request carries full data to the engine, but P1 still hasU→ the engine discards the fresh data and substitutes the stale N_A-row tensor. The scheduler plans for N_B encoder slots while the worker merges N_A embeddings into N_B placeholders →ValueError: Attempted to assign 4 = 4 multimodal tokens to 2048 placeholdersatvllm/model_executor/models/utils.py:711→ uncaught in the EngineCore busy loop →_send_engine_dead()→ the EngineCore process dies, every API server reportsEngineDeadErrorand shuts down./healthnever recovers; the deployment needs a full restart.
Verified end-to-end on the official vllm/vllm-openai:v0.29.0 image with Qwen2.5-VL-3B-Instruct, default configuration (no flags beyond --served-model-name/--gpu-memory-utilization): after 70 flood requests the kill request returned 500 EngineCore encountered an issue and /health went dead permanently. The vulnerable code is byte-identical on main (post-0.29.0).
References
- github.com/advisories/GHSA-p92p-rxj5-7p2x
- github.com/vllm-project/vllm/commit/7268f6e38ebbb3d61700f16c638c6eba0c88bb0c
- github.com/vllm-project/vllm/pull/57833
- github.com/vllm-project/vllm/releases/tag/v0.31.0
- github.com/vllm-project/vllm/security/advisories/GHSA-p92p-rxj5-7p2x
- nvd.nist.gov/vuln/detail/CVE-2026-114050
- nvd.nist.gov/vuln/detail/cve-2026-114050
- www.vulncheck.com/advisories/vllm-before-0.31.0-remote-engine-crash-via-forged-multimodal-uuid
Code Behaviors & Features
Detect and mitigate CVE-2026-114050 with GitLab Dependency Scanning
Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Dependency Scanning using SBOM also detects vulnerabilities from proprietary advisories that this site does not include. Learn more about Dependency Scanning using SBOM →