
이 저장소는 jackson‑core 2.13.5와의 완전한 호환성을 유지하면서 CVE-2025-52999, GHSA-2m67-wjpj-xhg9 및 sonatype-2022-6438에서 보고된 서비스 거부(denial-of-service) 및 제한이나 스로틀링 없는 리소스 할당 보안 취약점에 대한 포괄적인 보안 수정을 제공합니다.
이 브랜치(2.13.5-CVE-2025-52999-sonatype-2022-6438-GHSA-2m67-wjpj-xhg9)는 jackson-core 2.13.5를 대상으로 하는 서비스 거부(DoS) 및 제한 없이 또는 스로틀링 없이 리소스를 할당하는 취약점(Allocation of Resources Without Limits or Throttling)에 대한 포괄적인 보안 수정을 포함합니다. 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)는 세 가지 취약점을 수정하며 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이 입력 문서에서 탐색할 수 있는 깊이에 대한 구성 가능한 제한이 포함되어 있으며, 기본 허용 깊이는 1,000입니다. jackson-core는 한도에 도달하면StreamConstraintsException을 발생시킵니다. jackson-databind도 JSON 입력을 구문 분석하기 위해 jackson-core를 사용하므로 이 변경의 혜택을 받습니다. 해결 방법으로, 사용자는 신뢰할 수 없는 소스의 입력 파일 구문 분석을 피해야 합니다.
해결 방법: 수정 버전이 배포될 때까지 신뢰할 수 없는 소스의 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
All four `JsonParser` implementations share this flaw. The attack is equally exploitable through
any of them — whether input arrives via `InputStream`, `Reader`, `DataInput`, or the async
non-blocking feeder 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` 키 슬롯을 추가로 할당하여, 극단적인 깊이에서 메모리 소비를 가중시킵니다.
- **교차 중첩 — 웹 애플리케이션 방화벽(WAF) 우회:** 반복되는 `[[[` 또는 `{{{` 시퀀스를 탐지하는 패턴 매칭 방어는 교차 토큰 중첩을 인식하지 못합니다. 파서의 깊이 카운터는 토큰 유형과 관계없이 동일하게 증가합니다.
- **비차단 피더 — 동일한 페이로드, 다른 전달 표면:** 세 가지 중첩 전략 모두 `NonBlockingJsonParser` 및 `ByteArrayFeeder` API를 통해 동일하게 악용할 수 있습니다. 문서는 임의로 작은 청크로 전달될 수 있습니다. `NonBlockingJsonParserBase._startArrayScope()` / `_startObjectScope()`는 바이트가 도착하는 방식과 관계없이 모든 컨텍스트 시작 토큰에서 깊이 카운터를 증가시키므로, 여러 `feedInput()` 호출에 걸쳐 깊이가 누적됩니다.
세 가지 중첩 전략 모두 네 가지 `JsonParser` 구현 중 어느 것을 통해서도 도달할 수 있습니다. 2.13.5에서는 파싱이 조용히 성공합니다. 이 수정 사항이 적용되면 세 가지 벡터 모두 `StreamConstraintsException: Depth (1001) exceeds the maximum allowed nesting depth (1000)` 예외를 던집니다.
---
### Sonatype-2022-6438 — 무제한 숫자 토큰 길이
**보안 세부 정보**