## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-TANGYAOFQ-SPRING-AI-SIBLING-LOOP-POC
# Spring AI PDF Reader — 同级自环 PoC(CVE-2026-47851 的不完整修复)
> 针对 `org.springframework.ai:spring-ai-pdf-document-reader` 中 `org.springframework.ai.reader.pdf.config.ParagraphManager` 的无限循环 / OOM 最小复现。
>
> 已作为私有 GitHub 安全公告提交至 `spring-projects/security-advisories`。**非公开披露。** 本仓库仅用于**负责任披露与验证** 。
* * *
## 漏洞
`ParagraphManager.generateParagraphs` 通过 `getNextSibling()` 遍历大纲同级节点,但既无循环检测也无迭代上限。若 PDF 的大纲项将自身的 `/Next` 指针指向自己(即 _同级自环_ ),则循环永不终止;每次迭代都会向父节点的 `children` 列表追加一个新的 `Paragraph`,最终以 `OutOfMemoryError` 耗尽 JVM 堆内存。
CVE-2026-47851 修复中新增的检查(深度限制 + 已访问集合)仅覆盖 `firstChild` 循环,并未覆盖同级自环:深度永远不会超过第 1 层,且已访问集合仅记录 `firstChild`,因此同级节点永远不会进入该集合。因此,该变体在最新版本(`2.0.1`)上同样可以复现。
* * *
## 文件
root@kitploit:~
pom.xml — Maven 构建,依赖 spring-ai-pdf-document-reader:2.0.1
src/main/java/ReleaseVerify.java — 真实用户代码(官方 API 调用)
poc/selfloop.pdf — 396 字节恶意 PDF(同级自环)
poc/normal.pdf — 384 字节对照 PDF(除无 /Next 自引用外完全相同)
两个 PDF 仅相差**12 字节** — `selfloop.pdf` 在大纲项中多了一个 `/Next 5 0 R`,将该条目指向自身作为其下一个同级节点。
* * *
## 构建
root@kitploit:~
mvn -q package
生成 `target/springai-release-verify-1.0.0.jar`(fat jar,包含 PDFBox 3.0.7)。
## 复现
root@kitploit:~
# 恶意 PDF — 数秒内 OOM
java -Xmx96m -cp target/springai-release-verify-1.0.0.jar ReleaseVerify para poc/selfloop.pdf
# 对照 PDF — 在 <100ms 内正常完成
java -Xmx96m -cp target/springai-release-verify-1.0.0.jar ReleaseVerify para poc/normal.pdf
OOM 发生在 `ParagraphPdfDocumentReader` 构造函数内部(该构造函数调用 `new ParagraphManager(document)`);`get()` 永远不会被调用。
* * *
## 本仓库的范围
本仓库**仅** 用于支持对私有报告公告的验证。这些 PDF 文件对 PDFBox 及任何其他合规的 PDF 解析器均无害;它们只会触发 Spring AI 的 `ParagraphManager` 遍历中的逻辑错误。请勿将其用于不属于您自己的系统。