
# Reproduction minimale pour la boucle auto-référentielle OOM de Spring AI ParagraphManager (correctif incomplet de CVE-2026-47851)
Reproduction minimale d'une boucle infinie / OOM dans
org.springframework.ai.reader.pdf.config.ParagraphManagerdeorg.springframework.ai:spring-ai-pdf-document-reader.Signalé comme avis de sécurité GitHub privé à
spring-projects/security-advisories. Pas une divulgation publique. Ce dépôt est partagé uniquement pour divulgation responsable et vérification.
ParagraphManager.generateParagraphs itère sur les frères du plan via
getNextSibling() sans détection de cycle ni limite d'itération. Un PDF dont
l'élément du plan déclare son propre pointeur /Next (une ) provoque
une boucle qui ne se termine jamais ; chaque itération ajoute un nouveau à la liste
du parent, épuisant le tas de la JVM avec une .
ParagraphchildrenOutOfMemoryErrorLa vérification ajoutée dans la correction de CVE-2026-47851 (limite de profondeur + ensemble visité) ne
couvre que les cycles firstChild, pas les boucles auto-référentielles entre frères : la profondeur ne dépasse jamais
le niveau 1, et l'ensemble visité n'enregistre que firstChild, donc le frère n'y entre jamais.
La variante se reproduit donc également sur la dernière version
(2.0.1).
| Élément | Valeur |
|---|---|
| Composant affecté | org.springframework.ai:spring-ai-pdf-document-reader |
| Versions affectées | < 2.0.2 (toutes les versions connues ; 1.x et 2.0.0 ne contiennent même pas la correction de CVE-2026-47851) |
| Classe vulnérable | org.springframework.ai.reader.pdf.config.ParagraphManager |
| Déclencheur | new ParagraphPdfDocumentReader(resource) avec un PDF malveillant |
| Impact | OutOfMemoryError, terminaison du processus — DoS |
| Sévérité | 7.5 ÉLEVÉE — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Lié à | CVE-2026-47851 (correction incomplète) |
pom.xml — Build Maven, dépend de spring-ai-pdf-document-reader:2.0.1
src/main/java/ReleaseVerify.java — code utilisateur réel (appel API officiel)
poc/selfloop.pdf — PDF malveillant de 396 octets (boucle auto-référentielle entre frères)
poc/normal.pdf — PDF témoin de 384 octets (identique sauf absence de référence auto `/Next`)
Les deux PDF diffèrent d'exactement 12 octets — selfloop.pdf contient un
/Next 5 0 R supplémentaire dans l'élément du plan, pointant l'élément vers lui-même comme
frère suivant.
mvn -q package
Produit target/springai-release-verify-1.0.0.jar (fat jar, inclut
PDFBox 3.0.7).
# PDF malveillant — OOM en quelques secondes
java -Xmx96m -cp target/springai-release-verify-1.0.0.jar ReleaseVerify para poc/selfloop.pdf
# PDF témoin — se termine normalement en <100ms
java -Xmx96m -cp target/springai-release-verify-1.0.0.jar ReleaseVerify para poc/normal.pdf
L'OOM se produit à l'intérieur du constructeur ParagraphPdfDocumentReader (qui
invoque new ParagraphManager(document)); get() n'est jamais atteint.
Ce dépôt existe uniquement pour appuyer la vérification de l'avis
signalé en privé. Les fichiers PDF sont inoffensifs pour PDFBox et tout autre
analyseur PDF conforme ; ils ne déclenchent qu'une erreur logique dans la traversée de
ParagraphManager de Spring AI. Ne pas utiliser contre des systèmes dont vous n'êtes pas propriétaire.