
# Reprodução mínima para o OOM de auto-loop entre irmãos do ParagraphManager do Spring AI (correção incompleta do CVE-2026-47851)
Reprodução mínima de um loop infinito / OOM em
org.springframework.ai.reader.pdf.config.ParagraphManagerdeorg.springframework.ai:spring-ai-pdf-document-reader.Reportado como um GitHub Security Advisory privado para
spring-projects/security-advisories. Não é uma divulgação pública. Este repositório é compartilhado apenas para divulgação responsável e verificação.
ParagraphManager.generateParagraphs itera sobre irmãos do outline via
getNextSibling() sem detecção de ciclos e sem limite de iterações. Um PDF cujo
item do outline declara seu próprio ponteiro /Next (um ) faz
o loop nunca terminar; cada iteração adiciona um novo à lista
do pai, esgotando a heap da JVM com .
ParagraphchildrenOutOfMemoryErrorA verificação adicionada na correção do CVE-2026-47851 (limite de profundidade + conjunto de visitados) apenas
cobre ciclos de firstChild, não auto-loops entre irmãos: a profundidade nunca cresce além do
nível 1, e o conjunto de visitados apenas registra firstChild, então o irmão nunca
entra nele. A variante, portanto, reproduz-se também na versão mais recente
(2.0.1).
| Item | Valor |
|---|---|
| Componente afetado | org.springframework.ai:spring-ai-pdf-document-reader |
| Versões afetadas | < 2.0.2 (todas as versões conhecidas; 1.x e 2.0.0 nem sequer contêm a correção do CVE-2026-47851) |
| Classe vulnerável | org.springframework.ai.reader.pdf.config.ParagraphManager |
| Gatilho | new ParagraphPdfDocumentReader(resource) com um PDF malicioso |
| Impacto | OutOfMemoryError, término do processo — DoS |
| Severidade | 7.5 ALTA — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Relacionado | CVE-2026-47851 (correção incompleta) |
pom.xml — build Maven, depende de spring-ai-pdf-document-reader:2.0.1
src/main/java/ReleaseVerify.java — código real do usuário (chamada oficial da API)
poc/selfloop.pdf — PDF malicioso de 396 bytes (auto-loop entre irmãos)
poc/normal.pdf — PDF de controle de 384 bytes (idêntico, exceto sem autorreferência /Next)
Os dois PDFs diferem em exatamente 12 bytes — selfloop.pdf tem um
/Next 5 0 R extra no item do outline, apontando o item para si mesmo como seu próximo
irmão.
mvn -q package
Produz target/springai-release-verify-1.0.0.jar (fat jar, inclui
PDFBox 3.0.7).
# PDF malicioso — OOM em segundos
java -Xmx96m -cp target/springai-release-verify-1.0.0.jar ReleaseVerify para poc/selfloop.pdf
# PDF de controle — conclui normalmente em <100ms
java -Xmx96m -cp target/springai-release-verify-1.0.0.jar ReleaseVerify para poc/normal.pdf
O OOM ocorre dentro do construtor de ParagraphPdfDocumentReader (que
invoca new ParagraphManager(document)); get() nunca é alcançado.
Este repositório existe apenas para apoiar a verificação do advisory
reportado privadamente. Os arquivos PDF são inofensivos para o PDFBox e qualquer outro
parser de PDF conforme; eles disparam apenas um erro lógico na travessia de
ParagraphManager do Spring AI. Não use contra sistemas que você não possui.