
Proof-of-concept exploit per CVE-2026-24688, una vulnerabilità di denial-of-service nel parsing degli outline di pypdf. Include un generatore di PDF dannosi e script di riproduzione che dimostrano l'esaurimento della memoria e il crash del sistema.
Questo repository include il codice proof of concept per attivare la CVE-2026-24688.
Vulnerabilità critica di Denial of Service nella logica di parsing degli outline (segnalibri) di pypdf. Quando si elabora un PDF con riferimenti circolari negli outline, il parser entra in un ciclo infinito che alloca memoria in modo continuo, consumando centinaia di MB di memoria al secondo, sulla mia macchina (TM), portando al crash completo del sistema.
Si tratta di un DoS a livello di sistema, non solo di un blocco dell'applicazione.
malicious_circular_outline.pdf - PDF exploit con outline circolare (754 byte)create_malicious_pdf.py - Script per generare il PDF exploitsimple_read_pdf.py - Script di test semplice per riprodurre la vulnerabilitàtest_pypdf.sh - Script di test automatizzato (installa pypdf ed esegue il test)README.md - Questo fileAVVERTENZA: Questi test potrebbero causare il crash del sistema se non si tiene d'occhio il consumo di memoria e non si annulla in tempo.
# Esegui lo script di test automatizzato (con protezione da timeout)
chmod +x test_pypdf.sh
./test_pypdf.sh
# Questo script:
# 1. Installerà la versione vulnerabile di pypdf
# 2. Eseguirà il test con timeout di 15 secondi
# 3. Mostrerà il comportamento del consumo di memoria
# Installa pypdf (versione vulnerabile 6.6.0)
pip install "pypdf==6.6.0"
# Esegui con timeout
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
# Installa pypdf (versione vulnerabile 6.6.0)
pip install "pypdf==6.6.0"
# Esegui senza timeout
python3 simple_read_pdf.py malicious_circular_outline.pdf
Posizione: pypdf/_doc_common.py - metodo _get_outline() (righe 858-873)
def _get_outline(self, node, outline=None):
while True: # ❌ Nessun rilevamento di cicli!
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ Allocazione heap nel ciclo!
if "/Next" not in node:
break
node = node["/Next"] # ❌ Segue riferimenti circolari
Causa principale: Nessun set di nodi visitati, nessun limite di iterazioni, allocazione di memoria continua
Test nel Mondo Reale:
Caratteristiche dell'Attacco:
Corretto nella versione 6.6.2
https://github.com/py-pdf/pypdf/security/advisories/GHSA-2q4j-m29v-hq73