
jackson-databind + jackson-core 26개 보안 공지 자체 점검: 좌표별로 하나씩 교집합을 구해 실제로 안전한 버전을 제시(2.18.11/2.21.7/2.22.3/3.1.7/3.2.3, 2.21.6은 더 이상 충분하지 않음); 소스 코드를 스캔해 노이즈를 줄여 실제로 몇 개나 해당되는지 알려줌; GitHub 전역 라이브러리에 등재되지 않았고 Dependabot이 보고하지 않는 1건 포함(jackson-core 건으로, databind를 올려도 그대로 해당됨) CVE-2026-54515 / CVE-2026-54512
jackson-databind + jackson-core 총 26건의 보안 공지 자체 점검 도구. 의존성 없는 단일 jar, 네트워크 연결 없음.
Dependabot이 답할 수 없는 세 가지 질문에 답합니다:
jackson-core의 CVE-2026-68498 한 건만 남아 있습니다(「v0.3.0」 섹션 참조).@JsonView / 다형 타입 / 대소문자 구분 없는 매칭……)을 찾아, 「영향받는 버전이 설치됨」을 「실제로 그 기능을 사용함」으로 노이즈를 줄입니다.java -jar jackson-check.jar ./target ./src
09-30과 10-01에 FasterXML이 또 4건의 high를 발표했다(모두 7.5, 모두 서비스 거부):
| 번호 | 좌표 | 주제 | 트리거 조건 |
|---|---|---|---|
| CVE-2026-91776 | jackson-databind | 알 수 없는 type id마다 프로세스 수명 주기 동안 캐시에 한 항목씩 남아 메모리가 늘기만 하고 줄지 않음 | @JsonTypeInfo(use = Id.NAME, defaultImpl = …) + 공격자가 type id를 제어 가능 + mapper를 장기간 재사용 |
| CVE-2026-91777 | jackson-databind | 전방 참조를 역순으로 정의 보충할 때 비교 횟수가 약 N²/2(N=2000 → 2,003,000회) | 신뢰할 수 없는 JSON을 @JsonIdentityInfo가 붙은 컬렉션이나 Map으로 역직렬화 |
| CVE-2026-89425 | jackson-core | 기형 token이 통째로 예외 메시지에 이어 붙여지며 maxErrorTokenLength 제한을 받지 않음 | createParser(DataInput) 경로만 해당; 공지에 완화 가능한 설정이 없다고 명시됨 |
| CVE-2026-89407 | jackson-core | NumberInput.looksLikeValidNumber() 정규식의 이차 백트래킹(16만 문자 실측 74.4초) | JSON의 문자열을 숫자 필드에 바인딩할 때(databind 기본 동작); 이 경로는 maxNumberLength(기본 1000)가 아니라 maxStringLength(기본 2000만)의 제약을 받음 |
두 좌표의 수정 버전은 동일 번호다: 2.18.11 / 2.21.7 / 2.22.3 / 3.1.7 / 3.2.3(Central에서 모두 다운로드 가능; 89407은 3.2 계열에서 3.2.2에서 수정, 89425는 3.2.3이 필요하므로 큰 쪽을 택함).
따라서 v0.2.0 / v0.3.0이 출력하던 2.18.10 / 2.21.6 / 2.22.2 / 3.1.6 / 3.2.2는 09-30부터 부족하다. 구버전 jar는 이 사실을 알지 못한다 —— v0.4.0으로 다시 스캔하라.
⚠️ 이 네 건은 Dependabot 사각지대가 아니다: 공개 당일 GitHub 전역 취약점 DB에 등재되었고, Dependabot이 정상적으로 경고한다. v0.4.0이 이들을 병합한 것은 "어느 버전으로 올려야 하는가"라는 답을 올바르게 유지하기 위해서일 뿐이다.
🔴 동시에 v0.2.0의 한 주장을 정정한다: 아래 "v0.2.0" 절에 쓰인 "그 4건은 GitHub 전역 취약점 DB에 수록되지 않아 Dependabot이 보고하지 않는다"는 09-14 기준으로는 성립했으나 2026-09-28부터 성립하지 않는다 —— 네 건 모두 전역 DB에 수록되었다 (
gen_rules.py의 ASSERT2를 10-05에 재실행: databind 측 사각지대 4 → 0). 현재 유일하게 여전히 조회되지 않는 것은jackson-core의CVE-2026-68498이다.
jackson-core는 또 다른 좌표이며, databind를 스캔해도 찾을 수 없다v0.2.x의 판정표 전체에는 artifactId가 jackson-databind 하나뿐이었다. 그래서 FasterXML이
jackson-core 저장소에서 발표한 7건의 공지를 이 도구는 하나도 스캔해내지 못한다 ——
그렇다고 해서 오류를 보고하지도 않고, 그저 모든 jackson-core-*.jar를 조용히 건너뛴다.
"스캔되지 않음"과 "당신은 안전함"은 보고서에서 똑같이 보인다.
v0.3.0은 판정 단위를 advisory × groupId × 구간에서 **advisory × groupId × artifactId × 구간**으로 바꾸어,
판정, 교집합 계산, "이 좌표를 스캔하지 못함" 모두 완전한 좌표를 키로 삼는다.
가장 주의해야 할 항목 —— CVE-2026-68498(high 7.5, 2026-09-12):
StreamReadConstraints.maxNameLength(기본 5만 문자)가 문자 입력 경로에서 적용되지 않았다.
ReaderBasedJsonParser가 속성명을 누적할 때 호출하는 것은 문자열 길이 상한(기본 1억, 약 2000배)이며,
실제 name 검증은 전체 key를 다 스캔한 뒤에야 실행된다 —— 그때는 이미 약 200MB가 할당된 상태다.
초장문 JSON key 하나만으로도, 기본 설정에서 그대로 걸린다.
>= 2.16.0, <= 2.18.9 → 2.18.10 · >= 2.19.0, <= 2.21.5 → 2.21.6 ·
>= 2.22.0, <= 2.22.1 → 2.22.2 · 3.x(tools.jackson.core) <= 3.1.5 → 3.1.6 · <= 3.2.1 → 3.2.2UTF8StreamJsonParser는 버퍼를 확장할 때마다 재검증한다.
byte[] / InputStream에서 파싱하는 경우는 영향받지 않고, String / Reader / char[]에서 파싱하는 경우만 걸린다.validateNameLength 호출은 수정 버전의 ReaderBasedJsonParser에만 존재하며,
취약 버전에는 없다(2.18.9→2.18.10 · 2.21.5→2.21.6 · 3.1.5→3.1.6 세 계열 모두 재현).⚠️ 도구 능력의 경계, 오해를 피하기 위해 여기에 적어 둡니다: 이 도구는 jar 버전은 판별할 수 있지만, 당신의 호출 방식은 판별할 수 없습니다 ——
readValue(someStringVariable, …)같은 가장 흔한 작성 방식에서, 텍스트 스캔으로는 그 변수가String인지byte[]인지 알 수 없습니다. 따라서 「트리거 조건을 찾지 못함」은 당신이 영향을 받지 않는다는 뜻이 아닙니다. 보고서에도 그렇게 인쇄됩니다.
🔴 「Dependabot이 jackson-core에 전혀 눈이 멀었다」로 읽지 마세요:
jackson-core의 7건 중CVE-2026-68498단 한 건만 GitHub 전역 취약점 데이터베이스에서 조회되지 않으며, 나머지 6건은 모두 등재되어 Dependabot이 정상적으로 경고합니다. 이 한 건은gen_rules.py의ASSERT-C2가 매번 재실행 시 재검증하며, 숫자가 바뀌면 생성을 거부합니다.
🔴 이 절은 09-14의 기록이며, 두 곳이 이미 지났습니다(위의 「v0.4.0」 참조): ① 이 4건은 2026-09-28에 전역 데이터베이스에 등재되어, Dependabot이 이제 보고합니다. ② 「한 번에 수정」하는 버전은 더 이상 2.18.10 / 2.21.6 / 3.1.6이 아닙니다. 원문은 보존하며, 삭제하지 않습니다.
FasterXML이 자사 저장소의 Security 페이지에 4건을 새로 발표했습니다:
| 번호 | 등급 | 주제 | 수정 버전 |
|---|---|---|---|
| CVE-2026-68497 | high 7.5 | 문자열을 javax.xml.datatype.Duration / XMLGregorianCalendar에 바인딩할 때 숫자 길이에 상한이 없음 → CPU DoS(기본 mapper로도 가능) | 2.18.10 / 2.21.6 / 2.22.2 / 3.1.6 / 3.2.2 |
| CVE-2026-19032 | medium 5.3 | java.nio.file.Path 역직렬화 시 URI scheme을 제한하지 않아 임의의 등록된 FileSystemProvider를 구동할 수 있음 | 상동 |
| CVE-2026-83557 | medium 5.6 | 기본 PolymorphicTypeValidator의 거부 목록에서 Comparable이 누락됨 | 상동 |
| CVE-2026-77310 | medium 5.3 | CVE-2026-54514 수정이 불완전함: InetAddress 분기가 여전히 즉시 DNS 조회를 수행함 | 2.18.9 / 2.21.5 / 2.22.1 / 3.1.5 / 3.2.1 |
항목별 실측:
jackson-databind:2.21.5 조회는 빈 결과를 반환.2.21.1로 적었으나(구간은 >= 2.22.0, < 2.22.1), 본 도구는 구간에 따라 2.22.1로 정정하고 생성 시 출력합니다.# 照 v0.1 的建议已经升到 2.21.5 的项目
java -jar jackson-check.jar ./lib ./src
# 你的版本落在受影响区间内的:3 条
# 其中 Dependabot 会报的:0 条
# 🔴 其中 Dependabot 看不见的:3 条(GitHub 全局漏洞库还没收录,按 GHSA 号查 404)
# 现在 2.21.5 → 升到 2.21.6
트리거 조건 스캔 두 항목 추가:
META-INF/services/java.nio.file.spi.FileSystemProvider를 스캔하여 서드파티 provider를 나열한다(실측으로 jimfs를 인식함);
소스에 java.nio.file.Path가 있고 의존성에 서드파티 provider가 있어야만 「모두 성립」으로 판정한다.javax.xml.datatype.Duration / XMLGregorianCalendar만 인식하고, java.time.Duration은 인식하지 않는다(그것은 어디에나 있어서 인식하면 노이즈 감소가 없는 것과 같다).2026년 이 11개 중 8개가 수정 버전을 2.21.4 / 2.18.8 / 3.1.4라고 적고 있다. 그대로 올린 사람들은 다 고쳤다고 생각했다.
실제로 항목별로 교집합을 구한 답은:
| 유지보수 브랜치 | advisory상 가장 흔한 버전 | 실제로 완전한 버전 |
|---|---|---|
| 2.18.x | 2.18.8 | 2.18.9 |
| 2.21.x | 2.21.4 | 2.21.5 |
| 2.22.x | — | 2.22.1 |
| 3.1.x | 3.1.4 | 3.1.5 |
| 3.2.x | — | 3.2.1 |
목표를 가장 높이는 것은 이 세 가지다:
CVE-2026-54515 —— 대소문자 비구분 역직렬화 우회로 속성별 @JsonIgnoreProperties 무력화
CVE-2026-59889 —— @JsonView가 @JsonUnwrapped 컨테이너 속성에 대해 무효화됨
🔴 GHSA-mhm7-754m-9p8w —— CVE 번호 없음, advisory 원문에 직접 적혀 있기를:
해당 수정 사항은 2.21 또는 2.18로 백포트되지 않았습니다 … 공개된 권고에 따라 업그레이드한 2.21.4 및 2.18.8 사용자는 여전히 취약합니다
이것은 패치 공백이다: 3.x 라인은 수정했지만 2.18 / 2.21 라인의 백포트가 누락되었다. CVE 번호가 없기 때문에 CVE 번호로는 검색할 수 없다.
한 번 실행하면 볼 수 있다:
# 已经升到 2.21.4 的项目
java -jar jackson-check.jar ./lib ./src
# Dependabot 会报给你:3 条
# 🔥 注意:如果你照着 advisory 里出现最多的那个修复版升,以下 3 条仍然中
| 좌표 | Maven Central에 실제로 게시된 적 있음 |
|---|---|
com.fasterxml.jackson.core:jackson-databind | 2.x만 |
tools.jackson.core:jackson-databind | 3.x만 |
그리고 advisory의 구조화된 필드에는:
com.fasterxml.jackson.core에 3.x 구간 6건이 걸려 있고, 수정 버전 3.1.4 → 해당 좌표에서 HTTP 404tools.jackson.core에 2.x 구간 1건이 걸려 있고, 수정 버전 2.21.4 → 마찬가지로 HTTP 404advisory를 그대로 베끼는 도구는 존재하지 않는 것을 설치하라고 하게 된다. 이 도구는 판정표를 생성할 때 하나하나 HEAD 요청으로 실제 가져올 수 있는지 측정하고, 가져올 수 없는 것은 보고서에 표시하며 업그레이드 권고로 인쇄하지 않는다.
两个坐标的 artifactId 和 jar 文件名一模一样,只有 META-INF 里分得清 —— 所以本工具按坐标判定,不按文件名。