
Preuve de concept d'exploitation pour CVE-2026-24688, une vulnérabilité de déni de service dans l'analyse des contours de pypdf. Inclut un générateur de PDF malveillant et des scripts de reproduction démontrant l'épuisement de la mémoire et le crash du système.
Ce dépôt contient le code de preuve de concept pour déclencher la CVE-2026-24688.
Vulnérabilité critique de déni de service dans la logique d'analyse des plans (signets) de pypdf. Lors du traitement d'un PDF avec des références circulaires dans le plan, l'analyseur entre dans une boucle infinie qui alloue continuellement de la mémoire, consommant des centaines de Mo de mémoire par seconde, sur ma machine (TM), et conduit à un crash complet du système.
Il s'agit d'un DoS au niveau du système, pas seulement d'un blocage de l'application.
malicious_circular_outline.pdf - PDF d'exploitation avec plan circulaire (754 octets)create_malicious_pdf.py - Script pour générer le PDF d'exploitationsimple_read_pdf.py - Script de test simple pour reproduire la vulnérabilitétest_pypdf.sh - Script de test automatisé (installe pypdf et exécute le test)README.md - Ce fichierAVERTISSEMENT : Ces tests peuvent faire planter votre système si vous ne surveillez pas la consommation mémoire et ne l'annulez pas à temps.
# Exécutez le script de test automatisé (avec protection par délai d'attente)
chmod +x test_pypdf.sh
./test_pypdf.sh
# Cela va :
# 1. Installer la version vulnérable de pypdf
# 2. Exécuter le test avec un délai d'attente de 15 secondes
# 3. Afficher le comportement de consommation mémoire
# Installez pypdf (version vulnérable 6.6.0)
pip install "pypdf==6.6.0"
# Exécutez avec un délai d'attente
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
# Installez pypdf (version vulnérable 6.6.0)
pip install "pypdf==6.6.0"
# Exécutez sans délai d'attente
python3 simple_read_pdf.py malicious_circular_outline.pdf
def _get_outline(self, node, outline=None):
while True: # ❌ Aucune détection de cycle !
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ Allocation sur le tas dans la boucle !
if "/Next" not in node:
break
node = node["/Next"] # ❌ Suit les références circulaires
Cause racine : Aucun ensemble de nœuds visités, aucune limite d'itération, allocation mémoire continue
Test en conditions réelles :
Caractéristiques de l'attaque :
Corrigé dans la version 6.6.2