org.springframework.ai:spring-ai-pdf-document-readerのorg.springframework.ai.reader.pdf.config.ParagraphManagerにおける 無限ループ / OOM の最小再現コード。
spring-projects/security-advisoriesにプライベートGitHub Security Advisoryとして報告済み。公開開示ではありません。 このリポジトリは責任ある開示と検証の目的でのみ共有されています。
ParagraphManager.generateParagraphs は、getNextSibling() を使用してアウトラインの兄弟ノードを反復処理しますが、循環検出も反復回数の上限もありません。アウトライン項目が自身の /Next ポインタ(兄弟セルフループ)を宣言しているPDFの場合、ループが終了しなくなります。各反復で親の children リストに新しい Paragraph が追加され、 でJVMヒープを枯渇させます。
OutOfMemoryErrorCVE-2026-47851の修正で追加されたチェック(深さ制限 + 訪問済みセット)は firstChild の循環のみをカバーしており、兄弟セルフループには対応していません。深さはレベル1を超えて増加せず、訪問済みセットは firstChild のみを記録するため、兄弟ノードはセットに入りません。したがって、この亜種は最新リリース(2.0.1)でも再現します。
| 項目 | 値 |
|---|---|
| 影響を受けるコンポーネント | org.springframework.ai:spring-ai-pdf-document-reader |
| 影響を受けるバージョン | < 2.0.2(既知の全リリース。1.x と 2.0.0 にはCVE-2026-47851の修正すら含まれていません) |
| 脆弱なクラス | org.springframework.ai.reader.pdf.config.ParagraphManager |
| トリガー | 悪意のあるPDFを使用した new ParagraphPdfDocumentReader(resource) |
| 影響 | OutOfMemoryError、プロセス終了 — DoS |
| 深刻度 | 7.5 HIGH — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| 関連 | CVE-2026-47851(不完全な修正) |
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` 自己参照がないこと以外は同一)
2つのPDFはちょうど12バイトだけ異なります。selfloop.pdf にはアウトライン項目に /Next 5 0 R が1つ多く含まれており、項目が自身を次の兄弟として指しています。
mvn -q package
target/springai-release-verify-1.0.0.jar(fat jar、PDFBox 3.0.7 を含む)が生成されます。
# 悪意のある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 の走査における論理エラーのみを引き起こします。所有していないシステムに対して使用しないでください。