此分支(2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9)包含针对 jackson-core 2.13.5 的拒绝服务(DoS)及“无限制或节流的资源分配”漏洞的全面安全修复。它引入了 StreamReadConstraints API —
与 jackson-core 2.15.0 引入的 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)修复了三个漏洞
并保存在 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 高 — 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 数据处理器使用的基本低级增量(“流式”)解析器和生成器抽象。 在 2.15.0 之前的版本中,如果用户解析一个输入文件并且该文件包含深度嵌套的数据,则当嵌套特别深时,Jackson 可能抛出
StackOverflowError。 jackson-core 2.15.0 包含一个可配置的深度限制,控制 Jackson 在输入文档中的遍历深度,默认允许深度为 1000。 当达到该限制时,jackson-core 将抛出StreamConstraintsException。jackson-databind 也受益于此更改,因为它使用 jackson-core 解析 JSON 输入。 作为临时解决方法,用户应避免解析来自不可信来源的输入文件。
临时解决方法: 在部署修复版本之前,避免解析来自不可信来源的 JSON 输入。
根本原因: 在 2.15.0 之前,JsonParser 对 JSON 文档的嵌套深度没有设置任何限制。每个数组 [ 或对象 { 令牌都会导致 JsonReadContext.createChildArrayContext() / createChildObjectContext() 在堆上分配一个新的上下文节点并递增引用链。攻击者可以构造一个包含数万层嵌套的文档,导致 Java 虚拟机耗尽线程栈或堆内存。
易受攻击的代码路径:
该缺失检查在四个解析器实现中均可到达:``` 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
所有四个 `JsonParser` 实现都存在此缺陷。攻击同样可通过其中任何一个进行利用——无论输入是通过 `InputStream`、`Reader`、`DataInput` 还是异步非阻塞的 feeder API 到达。
**攻击向量:**
| # | 策略 | 示例负载 | 深度增量 | 受影响的解析器 |
|---|------|----------|---------|----------------|
| 1 | 数组嵌套 | `[[[…]]]` — 1,001 个连续的 `[` 令牌 | 每 `[` 增加 +1 | 所有四个 |
| 2 | 对象嵌套 | `{"k":{"k":{…}}}` — 1,001 个连续的 `{` 令牌 | 每 `{` 增加 +1 | 所有四个 |
| 3 | 交替嵌套 | `[{"k":[{"k":…}]}]` — 1,001 个混合 `[`/`{` 令牌 | 每 `[` 或 `{` 增加 +1 | 所有四个 |
关键观察:
- **数组嵌套——最小开销:** 仅需要 `[` 和 `]` 令牌;无需键、值或空白。一个 2,002 字节的负载包含 1,001 对括号就足以超过默认的 1,000 限制。
- **对象嵌套——放大的堆压力:** 每个 `{` 额外在深度链节点上分配一个 `JsonReadContext` 键槽,在极端深度下加剧内存消耗。
- **交替嵌套——绕过Web应用防火墙(WAF):** 检测重复 `[[[` 或 `{{{` 序列的模式匹配防御对交替令牌嵌套无效;无论令牌类型如何,解析器的深度计数器都会相同地递增。
- **非阻塞 feeder——相同负载,不同交付面:** 所有三种嵌套策略均可通过 `NonBlockingJsonParser` 和 `ByteArrayFeeder` API 同样利用。文档可以以任意小的块交付;无论字节如何到达,`NonBlockingJsonParserBase._startArrayScope()` / `_startObjectScope()` 都会在每个打开上下文的令牌上递增深度计数器,并在多个 `feedInput()` 调用中累计深度。
所有三种嵌套策略均可通过四个 `JsonParser` 实现中的任何一个达到。
在 2.13.5 中,解析会静默成功;通过此修复,所有三个向量都会抛出 `StreamConstraintsException: Depth (1001) exceeds the maximum allowed nesting depth (1000)`。
---
### Sonatype-2022-6438 — 无界数字令牌长度
**安全详情**
| 字段 | 值 |
|------|-----|
| Sonatype ID | [sonatype-2022-6438](https://guide.sonatype.com/vulnerability/sonatype-2022-6438/security-details) |
| 描述 | jackson-core — 拒绝服务 (DoS) |
| 发布时间 | 2022-12-07 |
| 来源 | Sonatype |
| CVSS v3.1 评分 | **7.5 高** — `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H` |
| CWE | [CWE-770](https://cwe.mitre.org/data/definitions/770.html) — 无限制或节流的资源分配 |
| EPSS 评分 | 0% |
| 上游修复 PR | [jackson-core#827](https://github.com/FasterXML/jackson-core/pull/827), [jackson-core#846](https://github.com/FasterXML/jackson-core/pull/846) |
**受影响的方法(由 Sonatype 识别)**