CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-8JR5-V98P-W75M

GHSA-8JR5-V98P-W75M: Perception Desynchronization via Unnormalized EXIF Orientation and PNG Transparency in vLLM

Alon Barad
Alon Barad
Software Engineer

Jun 17, 2026·8 min read·36 visits

Executive Summary (TL;DR)

vLLM failed to normalize image EXIF orientation and PNG transparency metadata. This causes Vision-Language Models to see a different image (e.g., rotated or with visible high-contrast text) than what is visually shown to human moderators, enabling silent prompt injections and safety bypasses.

A critical preprocessing mismatch exists in vLLM's multimodal image pipeline before commit cf1c90672404548aa3bc51f92c4745576a65ee26. The vulnerability occurs because the engine loads user-submitted images and passes them to underlying Vision-Language Models (VLMs) without normalizing their EXIF orientation metadata or fully resolving complex transparency structures. This gap creates a perception desynchronization vulnerability where the physical pixel grid processed by the AI model differs significantly from how the image is visually rendered to human moderators or frontend applications. Attackers can exploit this mismatch to perform silent prompt injections, bypass safety moderation systems, or execute adversarial jailbreaks.

Vulnerability Overview

The integration of vision capabilities into Large Language Models (LLMs) introduces a new class of input processing vulnerabilities. In multimodal pipelines, the engine must ingest, decode, and normalize diverse image formats before feeding them to the underlying neural network. This ingestion path constitutes a critical security boundary, particularly when the system relies on human-in-the-loop validation or upstream automated classifiers.

GHSA-8JR5-V98P-W75M identifies a perception desynchronization vulnerability in the vLLM preprocessing engine. The flaw lies in the handling of image metadata and transparency structures, specifically EXIF orientation and PNG transparency channels. When vLLM processes user-supplied images, it generates a pixel representation that differs fundamentally from the image rendered to human moderators or web frontends.

This discrepancy creates an interpretation conflict classified under CWE-1156 and CWE-436. Attackers can leverage this conflict to hide adversarial payloads or bypass visual safety filters. The vulnerability affects all integrations where vLLM is deployed as the backend inference engine for multimodal applications.

Root Cause Analysis

The root cause of this vulnerability lies in the default handling of image metadata and alpha channels by the Python Imaging Library (Pillow) within vLLM's preprocessing code. The vulnerability manifests through two primary vectors: EXIF orientation desynchronization and unnormalized transparency layers.

In the first vector, images captured by physical cameras or generated by specific tools contain Exchangeable Image File Format (EXIF) metadata. This metadata includes an Orientation tag (tag ID 0x0112) that defines the correct viewing angle. Standard rendering engines, such as modern web browsers or image viewers, parse this tag and rotate the pixel grid dynamically before rendering. Prior to the fix, vLLM omitted this normalization step, passing the raw, unrotated pixel grid to the vision encoder. This caused the model to process spatial features differently from how human reviewers saw them.

In the second vector, the processing engine failed to normalize transparency indicators across diverse image modes. Transparent PNG and GIF files use alpha channels or transparency tables to mask background pixels. While vLLM previously handled explicit 'RGBA' mode images, it neglected other transparency-carrying modes. These modes include Palette-based images ('P') with a 'tRNS' chunk, Grayscale with Alpha ('LA'), and standard RGB images containing 'tRNS' metadata chunks.

When converting these unhandled formats to 'RGB', Pillow's default behavior drops transparency and maps transparent pixels to solid black or default palette index values. This behavior allows attackers to execute 'Looming' or 'AlphaDog' style prompt injections. An attacker can write malicious text in white on a transparent background. To a user or moderator on a white web interface, the text is invisible. To the vLLM engine, the background becomes black, rendering the high-contrast white text highly legible to the model.

Code Analysis

The vulnerability was located in vllm/multimodal/image.py and vllm/multimodal/media/image.py. In vulnerable versions, the image conversion routine directly called the native PIL .convert() method without inspecting the image's internal metadata for orientation or extended transparency attributes.

# Vulnerable Implementation
def load_bytes(self, data: bytes) -> MediaWithBytes[Image.Image]:
    try:
        # Lazily opens the image bytes
        image = Image.open(BytesIO(data))
        # Loads the image without checking EXIF Orientation (0x0112)
        image.load()
        # Direct conversion to RGB potentially discards transparency chunks
        image = image.convert("RGB")

The patch introduces the normalize_image helper, which uses PIL's ImageOps.exif_transpose to physically rewrite the pixel matrix according to the embedded EXIF orientation tag. This guarantees that the physical matrix processed by the vision encoder matches the visual representation rendered in standard web interfaces.

# Patched Implementation
def normalize_image(image: Image.Image) -> Image.Image:
    """Normalize EXIF orientation so the pixel data matches visual display."""
    with contextlib.suppress(Exception):
        image = ImageOps.exif_transpose(image)
    return image

Additionally, the patch addresses the transparency vulnerability by implementing a robust detection function _has_transparency and updating the conversion routine to perform alpha-compositing over a solid white canvas prior to RGB conversion.

def _has_transparency(image: Image.Image) -> bool:
    """Detect whether an image carries transparency data."""
    if image.mode in ("RGBA", "LA", "PA"):
        return True
    return "transparency" in getattr(image, "info", {})
 
def convert_image_mode(
    image: Image.Image,
    to_mode: str,
    background_color: tuple[int, int, int] | list[int] = (255, 255, 255),
) -> Image.Image:
    if image.mode == to_mode:
        return image
 
    # If converting to RGB and transparency is detected, perform alpha-compositing
    if to_mode == "RGB" and _has_transparency(image):
        if image.mode != "RGBA":
            image = image.convert("RGBA")
        return rgba_to_rgb(image, background_color)
 
    return image.convert(to_mode)

A critical technical limitation remains in the patch. The use of contextlib.suppress(Exception) in normalize_image ignores errors thrown during EXIF parsing. If an attacker crafts an image with a corrupt EXIF header that crashes Pillow's parser but is successfully recovered and rendered by a target web browser, the perception desynchronization vulnerability can still be achieved.

Exploitation

An attacker can exploit this vulnerability through two principal vectors to bypass visual content filters or insert hidden text instructions. The first vector leverages the alpha channel desynchronization to conduct invisible prompt injections, while the second uses EXIF orientation parameters to scramble input features for classifiers.

In the prompt injection scenario, the attacker generates a PNG image in Palette ('P') mode. The background of this image is set to palette index 1, which is marked as transparent using the tRNS metadata chunk. The attacker then writes text instructions in white (RGB: 255, 255, 255) over this background. When displayed in a typical browser UI with a white background, the white text is unreadable against the white canvas. However, when processed by vLLM, the transparent index resolves to black, making the white text highly visible to the Vision-Language Model.

In the classification bypass scenario, the attacker takes an offensive image, rotates the raw pixel canvas by 180 degrees, and embeds an EXIF orientation metadata value of 3. A human moderator or front-end classifier that respects EXIF tags will rotate the image back to upright and flag or review it based on its content. If the backend inference pipeline does not normalize EXIF metadata, vLLM processes the raw, upside-down image. The spatial encoding of the vision model (such as the patch embeddings in a Vision Transformer) is scrambled relative to the downstream text generator, preventing the model from recognizing safety-violating concepts.

Impact Assessment

The impact of perception desynchronization in multimodal environments is high, especially for systems automating decisions based on visual content. Because Vision-Language Models are increasingly deployed to automate administrative, moderating, or security-critical tasks, the ability to feed different data to the model than what humans approve represents a substantial security bypass vector.

If the VLM is used for document extraction (e.g., parsing invoices or legal contracts), an attacker can inject hidden instructions to modify financial amounts or extract system variables. Since the human auditor only sees a clean, benign document in the PDF viewer, the exploit runs silently in the background. The model processes the raw text extracted from the unnormalized pixels, leading to unauthorized operations or data exfiltration.

Furthermore, safety filters relying on visual classifiers can be completely bypassed. By manipulating the EXIF orientation metadata, offensive, copyrighted, or sensitive material can be ingested into the training or inference pipeline without triggering spatial detection heuristics. This vulnerability shows that the security boundary of LLM-based applications extends deep into standard media preprocessing utilities.

Remediation

To remediate this vulnerability, organizations must upgrade vLLM to a version containing the official fix integrated in Pull Request #44974 and Commit cf1c90672404548aa3bc51f92c4745576a65ee26.

For systems where immediate updates are not feasible due to compatibility constraints, legacy pipelines must implement custom preprocessing wrappers. These wrappers must normalize EXIF orientation using Pillow's ImageOps.exif_transpose and flatten any transparency channels prior to submitting the images to the inference engine. The following Python middleware example demonstrates how to secure an image input stream:

from io import BytesIO
from PIL import Image, ImageOps
 
def secure_preprocess_image(raw_bytes: bytes) -> Image.Image:
    image = Image.open(BytesIO(raw_bytes))
    
    # Normalize EXIF orientation
    try:
        image = ImageOps.exif_transpose(image)
    except Exception as e:
        # Handle or log parsing errors instead of silently suppressing them
        raise ValueError("Malformed EXIF header") from e
    
    # Normalize transparency by compositing over white canvas
    if image.mode in ("RGBA", "LA", "PA") or "transparency" in image.info:
        image = image.convert("RGBA")
        canvas = Image.new("RGBA", image.size, (255, 255, 255, 255))
        image = Image.alpha_composite(canvas, image).convert("RGB")
    else:
        image = image.convert("RGB")
        
    return image

Security teams should also audit their frontends to ensure that the rendering of images matches the background color used for alpha blending in the backend (RGB: 255, 255, 255). Alignment between frontend display constraints and backend model preprocessing is critical to preventing interpretation conflicts.

Official Patches

vllm-projectOfficial Pull Request resolving image preprocessing bugs

Fix Analysis (1)

Technical Appendix

CVSS Score
8.6/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N

Affected Systems

vllm

Affected Versions Detail

Product
Affected Versions
Fixed Version
vllm
vllm-project
< commit cf1c90672404548aa3bc51f92c4745576a65ee26commit cf1c90672404548aa3bc51f92c4745576a65ee26
AttributeDetail
CWE IDCWE-1156 / CWE-436
Attack VectorNetwork
CVSS8.6
ImpactPerception Desynchronization / Security Bypass
Exploit StatusPoC Available
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1036Masquerading
Defense Evasion
T1566Phishing
Initial Access
T1204User Execution
Execution
CWE-1156
Identification of Entity with Multiple Interpretations

The application identifies or resolves an entity with multiple potential interpretations, leading to an interpretation conflict or perception desynchronization.

Known Exploits & Detection

GitHub Security AdvisoryProof of Concept validation code demonstrating transparency and EXIF manipulation using Pillow.

References & Sources

  • [1]GHSA-8JR5-V98P-W75M Security Advisory
  • [2]vLLM Pull Request #44974
  • [3]vLLM Bug Fix Commit

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•36 minutes ago•CVE-2026-119197
7.5

CVE-2026-119197: Quadratic Algorithmic Complexity Denial of Service in pyasn1 REAL Mantissa Decoder

An algorithmic complexity vulnerability (CWE-407) in pyasn1 versions prior to 0.6.5 allows unauthenticated attackers to cause a Denial of Service (DoS) via crafted ASN.1 payloads. The flaw resides in the binary-encoded ASN.1 REAL mantissa deserialization routine within RealPayloadDecoder.valueDecoder. By performing iterative byte-string slicing and repeated bitwise shifts on a growing arbitrary-precision integer, the decoder exhibits quadratic time and memory allocation complexity relative to the mantissa length. Supplying a BER-, CER-, or DER-encoded payload with a large REAL mantissa causes excessive CPU consumption and blocks application worker processes.

Amit Schendel
Amit Schendel
4 views•10 min read
•about 2 hours ago•CVE-2026-119196
7.5

CVE-2026-119196: Quadratic CPU Consumption in pyasn1 Constructed BIT STRING Decoding

A vulnerability classified under CWE-407 (Inefficient Algorithmic Complexity) exists in the pyasn1 library prior to version 0.6.5. When parsing constructed ASN.1 BIT STRING payloads under BER, CER, or schema-driven DER encoding rules, the BitStringPayloadDecoder repeatedly shifts and copies the entire accumulated bit value for each incoming fragment. Processing inputs with a large number of small constructed fragments induces quadratic CPU consumption, allowing unauthenticated remote attackers to cause a denial of service via resource exhaustion during the initial decoding phase.

Alon Barad
Alon Barad
5 views•10 min read
•about 3 hours ago•CVE-2026-119209
5.5

CVE-2026-119209: Uncontrolled Resource Consumption in pypdf XRef Stream Parser

CVE-2026-119209 is an uncontrolled resource consumption vulnerability in the pypdf Python library prior to version 6.21.3. The flaw exists within the PDF 1.5 cross-reference (XRef) stream parsing routines in pypdf/_reader.py. Due to the absence of a document-wide entry limit across chained cross-reference streams and improper validation of negative entry counts in the /Index array, an attacker can craft a compact PDF file that triggers excessive memory allocation, resulting in a Denial of Service (DoS) via MemoryError or process termination.

Alon Barad
Alon Barad
5 views•11 min read
•about 4 hours ago•CVE-2026-119208
7.1

CVE-2026-119208: Uncontrolled Resource Consumption in pypdf Encrypted Page Count Evaluation

CVE-2026-119208 is an uncontrolled resource consumption vulnerability in the pypdf Python library prior to version 6.21.3. When processing an encrypted PDF file after successful decryption, the get_num_pages() method fails to verify whether the encryption handler has already unlocked the document. Consequently, pypdf returns the unvalidated /Count integer directly from the /Pages catalog dictionary instead of traversing and flattening the actual page tree. Attackers can supply an encrypted PDF with an artificially inflated /Count attribute to trigger excessive memory allocation and prolonged CPU usage during downstream operations such as page iteration or label resolution.

Amit Schendel
Amit Schendel
6 views•9 min read
•about 5 hours ago•CVE-2026-119207
7.1

CVE-2026-119207: Asymmetric Resource Consumption in pypdf Dictionary Parser

CVE-2026-119207 (GHSA-4vqv-7265-gm2w) is an asymmetric resource consumption and denial-of-service (DoS) vulnerability in the open-source Python PDF manipulation library pypdf. In versions prior to 6.21.3, the DictionaryObject.read_from_stream method fails to bound exception message lengths when encountering malformed, unclosed dictionary structures in strict mode. When nested dictionary parsing fails, each level catches the inner exception and raises a new PdfReadError initialized with the string representation (exc.__repr__()) of the caught exception. This recursive wrapping causes geometric string expansion across the call stack, enabling a minimal PDF payload of a few hundred bytes to exhaust gigabytes of heap memory and crash the host Python process.

Alon Barad
Alon Barad
6 views•10 min read
•about 6 hours ago•CVE-2026-119206
7.1

CVE-2026-119206: Algorithmic Complexity Denial of Service in pypdf Page Label Resolution

CVE-2026-119206 is an algorithmic complexity vulnerability in pypdf prior to version 6.21.3 that causes uncontrolled CPU resource consumption when evaluating the page_labels property. Due to repeated linear scans of the PDF catalog's /PageLabels number tree from index zero for each individual page, processing a document with a large number of pages and label ranges scales quadratically. An unauthenticated attacker can supply a crafted PDF document to an application that reads page labels, resulting in prolonged execution times and denial of service.

Amit Schendel
Amit Schendel
8 views•10 min read