Zwei jsPDF-Lücken: PDF-Injection und XSS
CVE-2026-25755 und CVE-2026-31938 legen ein grundlegendes Risiko in JavaScript-basierter Browser-PDF-Erzeugung offen: unsanitierte Nutzereingaben fließen direkt in PDF-Streams. Behoben in jsPDF 4.2.0 und 4.2.1.
VaultTools · 24. März 2026
Foto von Ilya Pavlov auf Unsplash
Inhaltsverzeichnis
- Was geschah
- Was die Schwachstellen ermöglichen
- Warum JavaScript-PDF-Bibliotheken dieses Risiko strukturell tragen
- Wie Rust-basierte Browserverarbeitung sich unterscheidet
- Was Entwickler jetzt tun sollten
- Quellen
Was Geschah
Am 24. Februar 2026 veröffentlichten Sicherheitsforscher CVE-2026-25755, eine hochgradige Schwachstelle (CVSS 8,8) in jsPDF, der meistgenutzten JavaScript-Bibliothek zur PDF-Erzeugung im Browser. jsPDF verzeichnet rund 1,5 Millionen npm-Downloads pro Woche und ist in Tausende von Webanwendungen, Dokumenteneditoren und Dateiexportwerkzeugen eingebettet.
Eine zweite Schwachstelle, CVE-2026-31938 (CVSS 9,6, kritisch), wurde am 18. März 2026 über einen anderen Codepfad derselben Bibliothek veröffentlicht. Beide Lücken wurden geschlossen: CVE-2026-25755 in jsPDF 4.2.0, CVE-2026-31938 in jsPDF 4.2.1.
Was die Schwachstellen Ermöglichen
CVE-2026-25755 befindet sich in der Methode addJS innerhalb von javascript.js. Die Methode fügt benutzerkontrollierte Eingaben ohne Bereinigung von Klammern direkt in einen PDF-Stream ein. Klammern sind Zeichenkettentrennzeichen in der PDF-Spezifikation. Ein Angreifer, der die Eingabe kontrolliert, kann die /JS-Zeichenkette vorzeitig schließen und beliebige PDF-Objekte oder JavaScript-Aktionen in das erzeugte Dokument einschleusen. Jeder Nutzer, der das resultierende PDF öffnet, ist exponiert.
CVE-2026-31938 betrifft das Argument options der Funktion output(). Unzureichende Bereinigung benutzerkontrollierter Daten ermöglicht Angreifern, beliebiges HTML und Skripte in den Browserkontext einzuschleusen, wenn das Opfer die Datei öffnet. Der Angriff erfordert eine Nutzerinteraktion, aber keine erhöhten Rechte.
Zusammen bedeuten beide Lücken, dass eine Webanwendung mit einer ungepatchten Version von jsPDF stillschweigend Dokumente erzeugen kann, die vom Angreifer kontrollierten Code auf dem Rechner des Lesers ausführen.
Warum JavaScript-PDF-Bibliotheken Dieses Risiko Strukturell Tragen
Das PDF-Format ist eine komplexe Spezifikation mit eingebettetem JavaScript, umfangreichen Metadaten, verschachtelten Komprimierungsschichten und mehreren Codec-Typen. Wenn eine JavaScript-Bibliothek PDF-Ausgaben durch Zusammensetzen von Zeichenketten und Streams erzeugt, ist jede Stelle, an der Nutzereingaben in diesen Prozess einfließen, ein potenzieller Injektionspunkt.
JavaScript erzwingt keine Speichersicherheit an Sprachgrenzen. Das Verketten von Zeichenketten in strukturierte Binärformate wie PDF erfordert eine explizite, umfassende Bereinigung aller Steuerzeichen, die das Format erkennt. Fehlt nur eine Trennzeichenklasse, wie im Fall der unbereinigten Klammern in jsPDFs addJS, ist die Ausnutzung möglich.
Dies ist kein einmaliger Implementierungsfehler. Es ist eine Folge der Entwicklung von PDF-Erzeugung auf Basis einer dynamisch typisierten Sprache ohne native Repräsentation strukturierter Binärformate. Die Angriffsfläche wächst mit dem Funktionsumfang der Bibliothek.
Wie Rust-basierte Browserverarbeitung Sich Unterscheidet
Rust erzwingt Speichersicherheit und Typkorrektheit zur Kompilierzeit. Eine Rust-basierte, zu WebAssembly kompilierte PDF-Bibliothek verarbeitet Datei-Bytes als typisierte Strukturen, nicht als Zeichenketten, die durch Konkatenation zusammengesetzt werden. Es gibt kein Äquivalent einer unbereinigten Klammer, die einen Injektionspfad erzeugt, da die Bibliothek PDF-Streams nie durch Zeichenketteninterpolation von Nutzereingaben konstruiert.
Darüber hinaus läuft ein in Wasm kompiliertes Rust-Tool in der isolierten Browserumgebung ohne Serverkomponente. Selbst wenn eine theoretische Ausgabefehlfunktion existieren würde, gibt es keine serverseitige Sitzung, keinen entfernten Dateispeicher und kein authentifiziertes Konto, in das eine fehlerhafte Ausgabe eingreifen könnte. Der Schadensradius ist durch die Sandbox begrenzt.
Die jsPDF-Schwachstellen sind eine Erinnerung daran, dass „browserbasiert” nicht automatisch „sicher” bedeutet. Implementierungssprache, Abhängigkeitskette und Architektur bestimmen das tatsächliche Risikoprofil gemeinsam.
Was Entwickler Jetzt Tun Sollten
Alle Anwendungen, die jsPDF verwenden, sollten sofort auf Version 4.2.1 oder höher aktualisieren. Beide CVEs sind in diesem Release behoben.
Entwickler, die PDFs aus benutzerkontrollierten Eingaben erzeugen, sollten jeden Codepfad prüfen, über den Nutzerdaten in die PDF-Stream-Konstruktion gelangen, unabhängig von der verwendeten Bibliothek. Die Eingabebereinigung für PDF unterscheidet sich von der für HTML oder SQL; die relevanten Zeichen und Strukturen sind verschieden.
Für Nutzer webbasierter Dokumentenwerkzeuge allgemein unterstreicht der jsPDF-Vorfall eine praktische Frage: Verfügt das Werkzeug, das Ihr Dokument erzeugt oder verarbeitet, über eine veröffentlichte Sicherheitshistorie? Eine in einen Online-Dokumenteditor oder eine Exportfunktion eingebettete Bibliothek trägt dieselben Risiken, unabhängig davon, ob der Nutzer sie sieht oder nicht.
Quellen
- jsPDF Vulnerability Exposes Millions of Developers to PDF Object Injection Attacks (CybersecurityNews)
- Critical Vulnerability Patched in jsPDF (SecurityWeek)
- Critical jsPDF Flaw Lets Hackers Steal Secrets via Generated PDFs (BleepingComputer)
- jsPDF addJS Vulnerability Enables PDF Object Injection (CVE-2026-25755) (VPN Central)
- jsPDF Millions of Developers Exposed (GBHackers)
- CVE-2026-25755 on NVD (National Vulnerability Database)
- GitHub Security Advisory GHSA-wfv2-pwc8-crg5 (GitHub, CVE-2026-31938)