Apache DataSketches Java CVE-2026-122096 취약점이란 무엇인가?

CVE-2026-122096은 Apache DataSketches Java 9.0.0 이하 버전의 여러 역직렬화기가 직렬화된 입력이 스스로 선언한 크기와 개수를 검증하기도 전에 메모리를 확보하는 취약점입니다. 작은 조작 입력만으로 과도한 메모리 할당과 OutOfMemoryError, 끝나지 않는 역직렬화 또는 후속 갱신을 유발할 수 있습니다. 다만 CVE-2026-122096의 영향은 9.0.0 이하 버전을 사용하면서 동시에 신뢰할 수 없는 출처의 스케치를 역직렬화하는 경로를 가진 애플리케이션으로 한정되며, 취약 버전을 의존성에 포함하는 것만으로는 영향 조건에 해당하지 않습니다.

개요: 식별자와 핵심 증상

이 취약점은 CVE-2026-122096과 GHSA-jghc-rj2j-x37x 두 식별자로 공개됐습니다. 영향 버전은 Apache DataSketches Java 9.0.0까지이며, 수정 버전은 9.1.0입니다.

확인되는 증상은 두 갈래입니다. 첫째는 과도한 메모리 할당으로 인한 OutOfMemoryError이고, 둘째는 역직렬화 자체 또는 역직렬화 이후의 갱신 작업이 끝나지 않고 반복되는 현상입니다. CVE 레코드를 보면 작은 조작 입력만으로도 애플리케이션이 과도한 양의 메모리를 할당해 OutOfMemoryError에 이를 수 있고, 조작된 문자열이 FrequentLongsSketch.getInstance(String)에 전달되면 역직렬화 또는 이후 갱신이 무한히 반복될 수 있다고 적고 있습니다.

항목 내용
식별자 CVE-2026-122096, GHSA-jghc-rj2j-x37x
영향 버전 Apache DataSketches Java 9.0.0까지
수정 버전 9.1.0
핵심 증상 과도한 메모리 할당에 따른 OutOfMemoryError, 끝나지 않는 역직렬화 또는 후속 갱신
실질 영향 조건 9.0.0 이하 버전 사용 + 신뢰할 수 없는 스케치 역직렬화 경로 보유
수정 버전 런타임 요구사항 Java 25

영향 범위: 버전보다 먼저 확인할 역직렬화 경로

이 취약점의 영향을 판정할 때 라이브러리 버전보다 먼저 확인할 기준은 데이터 흐름입니다. 영향 대상은 신뢰할 수 없는 출처의 스케치를 역직렬화하는 애플리케이션으로 한정됩니다. 취약 버전을 의존성에 포함하는 것만으로는 영향 조건에 들어가지 않기 때문입니다. 실질적 영향 범위는 9.0.0 이하 버전과 신뢰할 수 없는 스케치 역직렬화 경로가 동시에 성립할 때로 좁혀집니다.

운영 환경 점검 순서는 다음과 같습니다.

  1. 의존성 트리에서 Apache DataSketches Java 버전을 확인해 9.0.0 이하인지 판별한다.
  2. 애플리케이션이 신뢰할 수 없는 출처로부터 수신한 스케치를 역직렬화하는 코드 경로를 갖고 있는지 확인한다.
  3. 두 조건이 모두 성립하면 9.1.0 업그레이드를 우선 검토하고, 역직렬화 경로가 확인되지 않더라도 업그레이드 검토 자체는 유효한 대응으로 본다.

기술적 분석: 할당보다 늦은 검증

선언값 검증보다 앞서는 메모리 확보

근본 결함은 여러 역직렬화기가 직렬화된 입력이 선언한 크기와 개수를 실제 입력과 대조해 검증하기 전에 메모리를 확보한다는 점입니다. 입력 안의 선언값이 실제 페이로드 크기와 무관하게 그대로 수용되므로, 작은 조작 입력이 실제 입력 크기와 어긋나는 대형 할당을 유도할 수 있습니다.

FrequentLongsSketch.getInstance(String)의 무한 루프

두 번째 결함 축은 FrequentLongsSketch.getInstance(String)에 있습니다. 이 메서드는 문자열의 길이 토큰과 numActive 토큰으로 해시 맵을 만들면서 두 값이 실제 맵과 맞는지 검증하지 않습니다. 그 결과 조작된 문자열이 전달되면 역직렬화 자체 또는 이후 갱신이 무한히 반복될 수 있습니다.

끝나지 않는 탐색 루프와 후속 갱신 지연

수정 PR #777에 무한 루프 축의 재현 입력과 증상이 공개돼 있습니다. 공개된 두 예시 입력은 지연 양상이 서로 다릅니다.

  1. "1,10,3,0,3,0,3,2,1,1,2,1,3,1" — 호출이 돌아오지 않는 형태
  2. "1,10,3,5,0,0,0,2" — 역직렬화는 통과하고 세 번째 별개 갱신에서 멈추는 형태

두 번째 양상은 운영 관점에서 주목할 만합니다. 조작 입력이 역직렬화 시점에는 문제를 일으키지 않다가 이후 갱신에서 증상을 낼 수 있다는 뜻인데, 이는 CVE 레코드가 역직렬화 또는 이후 갱신 가운데 어느 한 시점에서 무한 반복이 발생할 수 있다고 서술한 내용과 일치합니다. 초기 로딩이 정상적으로 끝났다고 해서 해당 스케치의 안전성이 확정되지는 않습니다.

공개 재현 입력의 입증 범위와 한계

공개된 재현 입력으로 직접 입증되는 것은 무한 루프 축에 한정됩니다. OutOfMemoryError를 유도하는 구체적 재현 입력은 확인된 자료 범위에 존재하지 않으므로, 메모리 할당 축의 증상은 CVE 레코드의 서술과 증상 정의에 근거한 것임을 구분해 이해할 필요가 있습니다.

대응 방안: 경로 확인과 9.1.0 업그레이드

업그레이드가 가져오는 동작 변화

9.1.0의 모든 역직렬화기는 메모리를 할당하거나 데이터를 읽기 전에 입력부터 검증하며, 잘못되었거나 잘린 입력을 SketchesArgumentException을 비롯한 Sketches*Exception으로 거부합니다. 수정 버전에서는 조작 입력이 자원 할당 단계에 도달하기 전에 예외로 차단됩니다.

업그레이드 전 점검 조건

9.1.0은 9.0.0과 소스·바이너리 호환을 표방하는 마이너 릴리스지만 9.0.0과 마찬가지로 Java 25를 요구하므로, 적용 전에 런타임 Java 버전을 확인해 둡니다. 릴리스 노트에 따르면 9.1.0에서는 몇몇 계열의 직렬화 이미지가 C++ 구현과 바이트 단위로 일치하도록 바뀌었으므로, 직렬화 이미지를 저장·교환하는 환경이라면 이 변화도 함께 검토 대상입니다.

한편 업그레이드가 어려운 환경을 위한 검증된 대체 완화책은 확인된 자료에 존재하지 않습니다. 신뢰할 수 없는 입력 경로 제한은 노출 조건을 줄이는 성격의 미검증 선택지라는 해석만 존재하므로, 이 점을 인식한 상태에서 적용 여부를 판단해야 합니다.

확인되지 않은 사항

수집된 근거 범위에서 다음 사항은 확인되지 않았고, 본문 서술에서도 의도적으로 배제했습니다.

  1. CVSS 점수 및 심각도 등급
  2. CVE 공시일과 공개 시점
  3. 실전 악용 사례 및 독립적 기술 검증 (확인 부재가 악용 부재를 뜻하지는 않음)
  4. OutOfMemoryError를 유도하는 구체적 재현 입력
  5. 환경별 탐지 규칙(시그니처·로그 패턴)
  6. 업그레이드가 어려운 환경을 위한 검증된 대체 완화책
  7. oss-sec 메일링 리스트 공지 여부와 Debian 등 배포판 트래커 반영 여부

Apache DataSketches Java를 사용하는 환경이라면 먼저 사용 중 버전이 9.0.0 이하인지, 신뢰할 수 없는 출처의 스케치 역직렬화 경로가 존재하는지를 확인합니다. 두 조건이 성립한다면 Java 25 요구사항을 포함해 9.1.0 업그레이드를 검토하는 것이 확인된 근거 위에서 내릴 수 있는 대응입니다.

댓글 남기기