
Prueba de concepto de exploit para CVE-2026-24688, una vulnerabilidad de denegación de servicio en el análisis de esquemas de pypdf. Incluye un generador de PDF malicioso y scripts de reproducción que demuestran el agotamiento de memoria y el bloqueo del sistema.
Este repositorio incluye código de prueba de concepto para desencadenar CVE-2026-24688.
Vulnerabilidad crítica de Denegación de Servicio en la lógica de análisis de esquemas (marcadores) de pypdf. Al procesar un PDF con referencias circulares en el esquema, el analizador entra en un bucle infinito que asigna memoria continuamente, consumiendo cientos de MB de memoria por segundo, en mi máquina (TM), y provoca un bloqueo completo del sistema.
Esto es un DoS a nivel de sistema, no solo un cuelgue de la aplicación.
malicious_circular_outline.pdf - PDF de explotación con esquema circular (754 bytes)create_malicious_pdf.py - Script para generar el PDF de explotaciónsimple_read_pdf.py - Script de prueba simple para reproducir la vulnerabilidadtest_pypdf.sh - Script de prueba automatizado (instala pypdf y ejecuta la prueba)README.mdADVERTENCIA: Estas pruebas pueden bloquear tu sistema si no vigilas el consumo de memoria y lo cancelas a tiempo.
# Ejecuta el script de prueba automatizado (con protección de tiempo de espera)
chmod +x test_pypdf.sh
./test_pypdf.sh
# Esto hará:
# 1. Instalar la versión vulnerable de pypdf
# 2. Ejecutar la prueba con un tiempo de espera de 15 segundos
# 3. Mostrar el comportamiento del consumo de memoria
# Instalar pypdf (versión vulnerable 6.6.0)
pip install "pypdf==6.6.0"
# Ejecutar con tiempo de espera
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
# Instalar pypdf (versión vulnerable 6.6.0)
pip install "pypdf==6.6.0"
# Ejecutar sin tiempo de espera
python3 simple_read_pdf.py malicious_circular_outline.pdf
def _get_outline(self, node, outline=None):
while True: # ❌ ¡Sin detección de ciclos!
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ ¡Asignación de memoria en el bucle!
if "/Next" not in node:
break
node = node["/Next"] # ❌ Sigue referencias circulares
Causa Raíz: Sin conjunto de visitados, sin límite de iteraciones, asignación continua de memoria
Prueba en el Mundo Real:
Características del Ataque:
Corregido en la versión 6.6.2