CVE-2026-18401 in jackson-core
요약
\~에 의해 VulDB • 2026. 08. 04.
jackson-core의 비동기(JSON) 파서는 StreamReadConstraints에서 정의된 maxNumberLength 제약 조건(기본값: 1,000자)을 적용하지 않습니다. 비동기 파서 API를 사용하는 애플리케이션에 JSON을 제출할 수 있는 공격자는 임의 길이의 숫자 토큰을 제공할 수 있으며, 이는 과도한 메모리 할당과 잠재적인 CPU 고갈로 이어져 서비스 거부(Denial of Service)를 초래합니다.
동기식 파서는 이 제한을 올바르게 적용하므로, 애플리케이션이 사용하는 파싱 API에 따라 제약 조건 적용이 불일치합니다.
근본 원인: NonBlockingUtf8JsonParserBase 및 관련 클래스의 비동기 파싱 경로는 숫자 길이 검증 메서드를 호출하지 않습니다. _finishNumberIntegralPart()와 같은 숫자 파싱 메서드는 TextBuffer로 자릿수를 축적할 때 길이 검사를 수행하지 않으며, 토큰을 최종화하기 위해 _valueComplete()를 호출합니다. _valueComplete()는 validateIntegerLength() 및 validateFPLength()가 수행되는 ParserBase의 resetInt() 또는 resetFloat() 메서드를 호출하지 않습니다. 해당 검증 단계가 건너뛰어지므로 비동기 코드 경로에서는 maxNumberLength가 적용되지 않습니다.
영향: 비동기 파서를 사용하는 애플리케이션(예: Spring WebFlux 또는 기타 반응형 애플리케이션)에 임의 길이의 숫자를 포함하는 JSON 문서를 전송한 공격자는 TextBuffer에서 무제한 할당과 OutOfMemoryError를 유발할 수 있습니다. 이후 애플리케이션이 getBigIntegerValue() 또는 getDecimalValue()를 호출하면 JVM은 O(n^2) BigInteger 파싱 작업으로 인해 추가로 묶여 CPU 기반 서비스 거부가 발생할 수 있습니다.
파싱을 위해 데이터를 제출하는 능력 외에 추가적인 권한이나 사용자 상호 작용은 필요하지 않습니다.
본 이슈는 버전 2.15.0부터 2.18.5까지, 그리고 2.19.0부터 2.21.0까지의 com.fasterxml.jackson.core:jackson-core와 버전 3.0.0부터 3.0.x까지의 tools.jackson.core:jackson-core에 영향을 미칩니다.
maxNumberLength 설정을 정의하는 StreamReadConstraints는 jackson-core 2.15.0에서 처음 도입되었으므로, 그 이전 버전에는 우회할 수 있는 해당 제약 조건이 존재하지 않아 영향을 받지 않습니다. 참고로 GHSA-72hv-8253-57qq에서는 영향 받는 2.x 범위의 하한선을 2.0.0으로 기록하고 있습니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.