CVE-2026-25990
High · 7.5CVSS
7.5
EPSS
0.5%
Published
Feb 11, 2026
CISA due date
—
Cloudanix analysis
A malicious Photoshop image file could crash or potentially compromise software that processes images with a vulnerable version of a common Python imaging library.
- Exploitation
- Local Privilege
- Attacker needs
- None
- Complexity
- Moderate
- Impact
- Full Compromise
- Component
- Library
- Class
- Memory Corruption
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Medium
What it actually does
This is a memory corruption flaw in Pillow’s PSD image parsing code affecting Pillow versions 10.3.0 through versions before 12.1.1. When Pillow loads a specially crafted Photoshop PSD file, malformed image structures can trigger an out-of-bounds write. At minimum, this can crash the process performing image parsing; depending on allocator behavior, platform hardening, and application context, memory corruption vulnerabilities may also create a path to arbitrary code execution within the privileges of the process that parses the image.
Why it matters to the business
Applications, services, batch jobs, or desktop tools that accept or process PSD uploads can be disrupted by a malicious image and may face deeper compromise if the memory corruption is exploitable in a given runtime. The highest-risk scenarios are internet-facing upload workflows, automated media-processing pipelines, document-management systems, and backend workers that process untrusted images. This issue is not currently listed in CISA KEV, has no known mature public exploit reported in the provided data, and has a low EPSS score, so urgency is lower than actively exploited vulnerabilities, but remediation is still important because image-parsing flaws are commonly reachable through normal business workflows.
How an attack unfolds
An attacker prepares a malformed PSD file designed to exercise the vulnerable Pillow parsing path. The attacker then places the file where a vulnerable application or worker will load it, such as an upload endpoint, media ingestion queue, document conversion flow, or local file-processing task. When Pillow parses the file, the crafted PSD triggers an out-of-bounds write. The likely observable result is a crash of the Python process, worker, or application component handling the file. In a more severe exploitation scenario, the attacker may attempt to shape memory corruption to execute code in the context of the affected process, which could allow access to files, secrets, network resources, or downstream systems available to that process.
How to fix it
Upgrade Pillow to version 12.1.1 or later wherever it is installed, including application virtual environments, containers, build images, serverless packages, desktop tooling, and transitive dependencies. Rebuild and redeploy applications after dependency updates so the fixed library is actually used at runtime. If using distribution-managed packages, apply the relevant vendor security update; the provided package metadata lists Debian 11 fixed package information as version 5.10.191-1 where applicable, but the Pillow-specific fixed version is 12.1.1, so confirm the authoritative package mapping for the deployed distribution. As interim mitigation, restrict or disable PSD uploads from untrusted users, validate file types before processing, run image conversion in a sandboxed low-privilege worker, enforce resource and timeout limits, and isolate media-processing workloads from sensitive credentials and internal networks.
How to confirm the fix worked
Confirm the installed Pillow version is 12.1.1 or later in every runtime that processes images. For Python environments, check with commands such as `python -m pip show Pillow`, `python -c "import PIL; print(PIL.__version__)"`, dependency lockfiles, SBOMs, and container image scans. For Debian-managed packages, verify the installed package versions with the system package manager and confirm the relevant vendor security advisory is applied. Validate that production builds, containers, and deployed artifacts were rebuilt after dependency updates rather than only updating source manifests. Test upload and processing workflows with benign PSD files to ensure functionality remains intact, and confirm untrusted PSD processing is either patched, blocked, or isolated.
Typical attack path
- Identify an application, service, or workflow that processes PSD files using a vulnerable Pillow version.
- Craft or obtain a malformed PSD file that triggers the out-of-bounds write during parsing.
- Submit the PSD through an upload form, API, email attachment workflow, file share, queue, or other ingestion path.
- Wait for the vulnerable Pillow-based process to load or validate the PSD image.
- Trigger process crash, denial of service, or potentially memory-corruption-driven code execution depending on exploit reliability and runtime protections.
- If code execution is achieved, operate with the privileges of the image-processing process and attempt credential access, lateral movement, or data access.
How to detect it
There are no unique public indicators of compromise provided for this vulnerability, and crashes from memory corruption may not leave a clear exploit signature. To assess possible prior exploitation, review application logs, upload audit logs, object storage access logs, API gateway logs, web server logs, worker queue telemetry, EDR events, and crash dumps for PSD files processed shortly before Python, Gunicorn, uWSGI, Celery, RQ, image-conversion workers, or other media-processing processes crashed or restarted. Look for unusual PSD uploads from new or low-reputation sources, repeated failed image-processing attempts, abnormally small or malformed PSD files, spikes in worker segmentation faults, and core dumps referencing Pillow or PSD parsing code. If crash dumps are available, inspect stack traces for Pillow PSD parser frames and correlate the triggering file hash, uploader/source IP, request path, and processing timestamp. Also review whether any affected process spawned unexpected child processes, made unusual outbound network connections, or accessed sensitive files after processing a PSD file, which would raise concern for exploitation beyond denial of service.
What your security team should do
- Inventory applications, containers, CI/CD images, and batch workers that include Pillow and process user-supplied or externally sourced images.
- Prioritize upgrades to Pillow 12.1.1 or later for internet-facing upload services and automated media-processing pipelines.
- Add dependency scanning rules to flag Pillow versions from 10.3.0 through versions before 12.1.1.
- Temporarily restrict PSD uploads or route them to a sandboxed converter until patching is complete.
- Run image-processing workloads with least privilege, no unnecessary secrets, constrained filesystem access, and limited outbound network access.
- Review recent crashes or restarts in image-processing services for malformed PSD activity, especially since publication on 2026-02-11.
- Ensure containers and serverless bundles are rebuilt and redeployed after updating dependency manifests or lockfiles.
The record
Pillow is a Python imaging library. From 10.3.0 to before 12.1.1, an out-of-bounds write may be triggered when loading a specially crafted PSD image. This vulnerability is fixed in 12.1.1.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | pillow | 10.3.0 | 12.1.1 |
| Chainguard | kubeflow-pipelines-visualization-server | 0 | 2.15.0-r5 |
| Chainguard | label-studio | 0 | 1.22.0-r4 |
| Chainguard | litellm | 0 | 1.81.12.1-r0 |
| Chainguard | mlflow | 0 | 3.9.0-r1 |
| Chainguard | mlflow-iamguarded-compat | 0 | 3.9.0-r1 |
| Chainguard | pgadmin4 | 0 | 9.12-r1 |
| Chainguard | pgadmin4-fips | 0 | 9.12-r1 |
| Chainguard | py3.10-vllm-cuda-12.4 | 0 | 0.16.0-r0 |
| Chainguard | py3.11-text-generation-inference | 0 | 3.3.7-r7 |
| Chainguard | py3.12-vllm-cuda-12.4 | 0 | 0.16.0-r0 |
| Chainguard | superset-5.0 | 0 | 5.0.0-r17 |
| Chainguard | superset-6.0 | 0 | 6.0.0-r2 |
| Chainguard | tensorflow-cpu-jupyter | 0 | 2.20.0-r11 |
| Chainguard | tensorflow-gpu-jupyter | 0 | 2.20.0-r10 |
| Chainguard | tritonserver-backend-vllm-cuda-12.9 | 0 | 25.9.0_git20251112-r7 |
| Chainguard | vllm-openai-cuda-12.9 | 0 | 0.15.1-r0 |
| Wolfi | kubeflow-pipelines-visualization-server | 0 | 2.15.0-r5 |
| Wolfi | mlflow | 0 | 3.9.0-r1 |
| Wolfi | mlflow-iamguarded-compat | 0 | 3.9.0-r1 |
| Wolfi | superset-5.0 | 0 | 5.0.0-r17 |
| Wolfi | superset-6.0 | 0 | 6.0.0-r2 |
| Wolfi | tensorflow-cpu-jupyter | 0 | 2.20.0-r11 |
| openSUSE:Leap 16.0 | python-Pillow | 0 | 11.3.0-160000.3.1 |
| openSUSE:Tumbleweed | python-Pillow | 0 | 12.1.1-1.1 |
Related vulnerabilities
- CVE-2025-48379 Pillow is a Python imaging library. Also affects pillow
- CVE-2024-28219 In _imagingcms.c in Pillow before 10.3.0, a buffer overflow exists because strcpy is used… Also affects pillow
- GHSA-4fx9-vc88-q2xc Infinite loop in Pillow Also affects pillow
- GHSA-jgpv-4h4c-xhw3 Uncontrolled Resource Consumption in pillow Also affects pillow
- CVE-2016-3076 Heap-based buffer overflow in the j2k_encode_entry function in Pillow 2.5.0 through 3.1.1… Also affects pillow
- CVE-2016-9190 Pillow before 3.3.2 allows context-dependent attackers to execute arbitrary code by using… Also affects pillow
- CVE-2016-9189 Pillow before 3.3.2 allows context-dependent attackers to obtain sensitive information by… Also affects pillow
- CVE-2016-4009 Integer overflow in the ImagingResampleHorizontal function in libImaging/Resample.c in… Also affects pillow