PoC de CVE-2026-25940 para jsPDF
Una prueba de concepto para CVE-2026-25940 que demuestra cómo apariencias de botones de radio AcroForm especialmente diseñadas pueden desencadenar JavaScript incrustado en visores de PDF vulnerables (p. ej., Foxit). El repositorio incluye un generador basado en Node y un entorno de visor en navegador para ejercitar diferentes rutas de análisis.
⚠️ Úsalo solo en entornos aislados y no productivos. Las cargas útiles de muestra ejecutan JavaScript intencionalmente y pueden invocar solicitudes de red o programas externos. No abras el PDF generado con visores no confiables en un equipo que te importe.
Contenido del repositorio
- poc.js: Genera un PDF malicioso con múltiples opciones de botones de radio y flujos de apariencia distintos para mostrar diferentes comportamientos.
- viewer.html: Entorno de visor mínimo para generar el PoC en el navegador o cargar una muestra existente, y renderizarlo tanto de forma nativa (iframe) como mediante PDF.js.
- package.json: Declara la dependencia de jsPDF para el PoC de Node.
Requisitos previos
Configuración
- Instala las dependencias:
npm install
- (Opcional) Sirve el visor localmente para una carga más limpia del HTML/JS:
npx http-server .
# luego abre http://localhost:8080/viewer.html
- Ejecuta el generador:
node poc.js
- El script escribe
test.pdf en la raíz del proyecto. Ábrelo con tu visor de PDF objetivo para observar el comportamiento. Mantén el bloqueo de red activado si quieres evitar solicitudes salientes.
Flujo de trabajo del visor basado en navegador
- Abre viewer.html directamente en un navegador o mediante un servidor local.
- Haz clic en Generar PDF del PoC para construir el documento malicioso en el navegador y cargarlo tanto en el iframe (manejador nativo/del navegador) como en el lienzo de PDF.js.
- Alternativamente, elige Cargar archivo y selecciona un PDF que hayas generado con el script de Node.
- Observa la actividad de consola/red como evidencia de ejecución de JavaScript; algunos visores pueden suprimir alertas mientras aún ejecutan acciones incrustadas.
Notas
- Las cargas útiles están ajustadas al comportamiento de Foxit; otros visores pueden mitigarlas o bloquearlas parcialmente.
- Si adaptas la carga útil, mantén tamaños similares para evitar cambiar los desplazamientos de objetos de los que dependen algunas cadenas de explotación.
- Prueba siempre en una máquina virtual o sandbox con salida de red restringida.