
このブランチ (2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9) には、jackson-core 2.13.5 を対象とした、サービス拒否 (DoS) および無制限またはスロットリングなしのリソース割り当ての脆弱性に対する包括的なセキュリティ修正が含まれています。jackson-core 2.15.0 で導入された API に合わせて設計されつつ、より広範なパーサー対応と追加の攻撃ベクトル保護を備えた StreamReadConstraints API を導入し、ネスト深度の枯渇攻撃 (CVE-2025-52999)、無制限またはスロットリングなしのリソース割り当て (SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924)、ドキュメント長制約のバイパス (SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 / GHSA-2m67-wjpj-xhg9)、数値トークン長の枯渇攻撃 (Sonatype-2022-6438) に対処しつつ、jackson-core バージョン 2.13.5 の公開 API サーフェスとの互換性を維持しています。
| ブランチ | 対処された脆弱性 |
|---|---|
2.13.5-CVE-2025-52999-sonatype-2022-6438 | CVE-2025-52999、Sonatype-2022-6438、SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924 |
2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9 | 上記すべて + GHSA-2m67-wjpj-xhg9 (ドキュメント長制約のバイパス) |
元のブランチ (2.13.5-CVE-2025-52999-sonatype-2022-6438) は 3 つの脆弱性を修正しており、sasso リモートに保存されています。このブランチは、さらに
GHSA-2m67-wjpj-xhg9
の修正を追加したもので、すべてのパーサーパスで maxDocumentLength を強制します。
| ID | 種類 | 深刻度 | CVSS | アップストリーム修正 |
|---|---|---|---|---|
| CVE-2025-52999 | サービス拒否 — 無制限のネスト深度 | 高 | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) | jackson-core 2.15.0 |
| Sonatype-2022-6438 / SNYK-JAVA-COMFASTERXMLJACKSONCORE-7569538 | サービス拒否 — 無制限の数値トークン長 | 高 | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) | jackson-core 2.15.0 |
| SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924 | 無制限またはスロットリングなしのリソース割り当て | 高 | 8.7 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) | jackson-core 2.18.6、2.21.1 以降 |
| SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 / GHSA-2m67-wjpj-xhg9 | 無制限またはスロットリングなしのリソース割り当て — ドキュメント長制約のバイパス | 高 | 8.7 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) | jackson-core 2.18.7、2.21.2 以降 |
| バージョン | CVE-2025-52999 | Sonatype-2022-6438 / SNYK-JAVA-COMFASTERXMLJACKSONCORE-7569538 | SNYK-JAVA-COMFASTERXMLJACKSONCORE-15365924 | SNYK-JAVA-COMFASTERXMLJACKSONCORE-15907551 |
|---|---|---|---|---|
| 2.13.5 | 影響あり | 影響あり | 影響あり | 影響あり |
| 2.13.5-CVE-2025-52999-sonatype-2022-6438 | 修正済み | 修正済み | 修正済み | 影響あり |
| 2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9 | 修正済み | 修正済み | 修正済み | 修正済み |
| 2.14.x | 影響あり | 影響あり | 影響あり | 影響あり |
| 2.15.x | 修正済み | 修正済み | 影響あり | 影響あり |
| 2.16.x | 修正済み | 修正済み | 影響あり | 影響あり |
| 2.17.x | 修正済み | 修正済み | 影響あり | 影響あり |
| 2.18.6+ | 修正済み | 修正済み | 修正済み | 影響あり |
| 2.18.7+ | 修正済み | 修正済み | 修正済み | 修正済み |
| 2.21.1+ | 修正済み | 修正済み | 修正済み | 影響あり |
| 2.21.2+ | 修正済み | 修正済み | 修正済み | 修正済み |
NVD エントリ
| フィールド | 値 |
|---|---|
| CVE ID | CVE-2025-52999 |
| 公開日 | 2025-06-25 |
| 最終更新日 | 2025-06-26 |
| 情報源 (CNA) | GitHub, Inc. |
| CVSS v4.0 スコア | 8.7 HIGH — CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N |
| CWE | CWE-121 — スタックベースのバッファオーバーフロー |
| GitHub アドバイザリ | GHSA-h46c-h94j-95f3 |
| アップストリーム修正 PR | jackson-core#943 |
公式 NVD 説明
jackson-core には、Jackson Data Processor が使用するコアとなる低レベルの増分 ("ストリーミング") パーサーおよびジェネレーターの抽象化が含まれています。2.15.0 より前のバージョンでは、ユーザーが入力ファイルを解析し、そのファイルに非常に深くネストされたデータが含まれている場合、深度が特に大きいと Jackson が
StackOverflowErrorをスローする可能性があります。jackson-core 2.15.0 には、Jackson が入力ドキュメント内をどれだけ深く走査するかの設定可能な制限が含まれており、デフォルトでは許容深度 1,000 に設定されています。jackson-core は、この制限に達するとStreamConstraintsExceptionをスローします。jackson-databind も、JSON 入力の解析に jackson-core を使用するため、この変更の恩恵を受けます。回避策として、ユーザーは信頼できないソースからの入力ファイルの解析を避ける必要があります。
回避策: 修正済みバージョンがデプロイされるまで、信頼できないソースからの JSON 入力の解析を避けてください。
根本原因: 2.15.0 より前のバージョンでは、JsonParser は JSON ドキュメントのネスト深度に制限を課していませんでした。配列の [ またはオブジェクトの { トークンごとに、JsonReadContext.createChildArrayContext() / createChildObjectContext() がヒープ上に新しいコンテキストノードを割り当て、参照チェーンを増加させていました。攻撃者は数万レベルのネストを含むドキュメントを細工し、Java 仮想マシンのスレッドスタックまたはヒープメモリを使い果たさせることができます。
脆弱なコードパス:
同じ欠落チェックが、4 つのパーサー実装のそれぞれを通じて到達されます。``` JsonParser.nextToken() // common entry point │ ├─ ReaderBasedJsonParser → _parsePunctuationMark() ├─ UTF8StreamJsonParser → _parsePunctuationMark() ├─ UTF8DataInputJsonParser → _parsePunctuationMark() └─ NonBlockingJsonParserBase → _startArrayScope() / _startObjectScope() │ ▼ _parsingContext.createChildArrayContext() // '[' encountered _parsingContext.createChildObjectContext() // '{' encountered ⚠ no depth check — context chain grows without bound
4つの `JsonParser` 実装はすべてこの欠陥を共有しています。攻撃は、入力が `InputStream`、`Reader`、`DataInput`、または非同期のノンブロッキングフィーダー API のいずれを介して到着する場合でも、そのすべてを通じて同様に悪用可能です。
**攻撃ベクター:**
| # | 戦略 | ペイロード例 | 深さの増分 | 影響を受けるパーサー |
|---|----------|----------------|-----------------|------------------|
| 1 | 配列のネスト | `[[[…]]]` — 1,001個の連続する `[` トークン | `[` ごとに +1 | 全4種 |
| 2 | オブジェクトのネスト | `{"k":{"k":{…}}}` — 1,001個の連続する `{` トークン | `{` ごとに +1 | 全4種 |
| 3 | 交互のネスト | `[{"k":[{"k":…}]}]` — 1,001個の `[`/`{` 混在トークン | `[` または `{` ごとに +1 | 全4種 |
主な観察点:
- **配列のネスト — 最小限のオーバーヘッド:** 必要なのは `[` と `]` トークンだけです。キー、値、空白は不要です。1,001組の角括弧からなる2,002バイトのペイロードで、デフォルトの制限である1,000を超えるのに十分です。
- **オブジェクトのネスト — ヒープ圧力の増幅:** 各 `{` は深さチェーンのノードに加えて `JsonReadContext` のキースロットを追加で割り当てるため、極端な深さではメモリ消費がさらに悪化します。
- **交互のネスト — Web Application Firewall (WAF) の回避:** 繰り返しの `[[[` や `{{{` シーケンスを検出するパターンマッチング防御は、トークンが交互に現れるネストを認識できません。パーサーの深さカウンターはトークンの種類に関係なく同じように増加します。
- **ノンブロッキングフィーダー — 同じペイロード、異なる配信面:** 3つのネスト戦略はすべて、`NonBlockingJsonParser` と `ByteArrayFeeder` API を介して同等に悪用可能です。ドキュメントは任意に小さなチャンクで配信できます。`NonBlockingJsonParserBase._startArrayScope()` / `_startObjectScope()` は、バイトの到着方法に関係なく、コンテキストを開くトークンごとに深さカウンターを増加させ、複数の `feedInput()` 呼び出しをまたいで深さを蓄積します。
3つのネスト戦略はすべて、4つの `JsonParser` 実装のいずれからも到達可能です。2.13.5では解析は静かに成功しますが、この修正により、3つのベクターすべてが `StreamConstraintsException: Depth (1001) exceeds the maximum allowed nesting depth (1000)` をスローします。
---
### Sonatype-2022-6438 — 無制限の数値トークン長
**セキュリティ詳細**