Micrometer 메모리 누수(CVE-2026-59295)|영향 범위와 대응
MicrometerHttpClientInterceptor가 응답 전 전송 실패에서 추적 상태를 남겨 JVM 힙 누수와 서비스 중단으로 이어지는 조건, 수정판, 대체 계측 경로를 다룹니다.

응답을 받기 전에 실패할 때 남은 추적 상태
CVE-2026-59295는 Micrometer가 Apache HttpAsyncClient 4.x 또는 5.x의 요청을 계측할 때, 응답 메시지를 받기 전 전송 오류가 발생하면 추적 상태를 제거하지 못해 JVM 힙이 계속 늘어나는 서비스 거부 취약점입니다. Spring 공식 권고는 취약한 micrometer-core, MicrometerHttpClientInterceptor 사용, 신뢰하기 어렵거나 불안정한 원격 엔드포인트 또는 응답 전 전송 실패라는 세 조건이 함께 있을 때 영향을 받는다고 설명합니다.
정상 요청은 응답이나 종료 신호를 통해 계측 상태를 다룹니다. 연결 재설정, 연결 시간 초과, 소켓 오류처럼 응답 메시지가 오기 전에 실패하면 인터셉터가 만든 추적 항목이 남습니다. 이런 실패가 반복되면 요청 자체는 끝났는데도 상태가 힙에 누적되고, 장시간에는 OutOfMemoryError와 애플리케이션 중단으로 이어질 수 있습니다. 외부 API를 호출하는 서비스, 사용자 제공 URL을 가져오는 서비스, 불안정한 네트워크 구간과 통신하는 백엔드는 이 조건을 우선 확인해야 합니다.
영향을 받은 구성
- io.micrometer:micrometer-core의 영향 버전을 사용합니다.
- Apache HttpAsyncClient 4.x 또는 5.x를 MicrometerHttpClientInterceptor로 계측합니다.
- 외부 요청이 응답 메시지 전에 연결 재설정·시간 초과·소켓 오류로 끝날 수 있습니다.
- 실패한 요청이 반복되거나 재시도 정책이 같은 경로의 요청 수를 늘립니다.
Micrometer를 사용한다는 사실만으로 모든 서비스가 같은 영향을 받은 것은 아닙니다. 다른 HTTP 클라이언트를 쓰거나, HttpAsyncClient를 계측하지 않거나, 5.x 환경에서 ObservationExecChainHandler 같은 대체 경로를 사용하는 서비스는 권고가 설명한 취약 조합과 다릅니다. 자산 조사에서는 프레임워크 BOM의 Micrometer 버전뿐 아니라 실제 Bean 구성과 계측 인터셉터 등록 방식을 함께 봐야 합니다.
공식 영향 버전
- Micrometer 1.17.0
- Micrometer 1.16.0부터 1.16.6
- Micrometer 1.15.0부터 1.15.12
- Micrometer 1.14.0부터 1.14.16
- Micrometer 1.9.18 이하
버전 범위가 여러 유지보수 계열로 나뉘므로 ‘최신 1.x인지’만 비교해서는 판정하기 어렵습니다. Spring Boot나 다른 플랫폼 BOM이 micrometer-core 버전을 관리한다면 직접 의존성 선언보다 해석된 의존성 트리와 실제 배포 JAR을 기준으로 확인합니다. 상용 지원 전용 수정판과 OSS 수정판의 제공 범위도 다르므로 조직의 지원 계약과 현재 계열을 함께 대조해야 합니다.

수정 버전과 대체 계측
Spring 권고가 제시한 OSS 수정판은 Micrometer 1.17.1과 1.16.7입니다. 1.17.0.1과 1.16.6.1은 Enterprise Support Only이며, 1.15.13, 1.14.17, 1.9.19도 권고 표에서 Enterprise Support Only로 안내됩니다. 현재 계열을 유지해야 하는 조직은 해당 수정판의 접근 권한을 확인하고, OSS 사용자는 지원되는 상위 계열로 이동할 수 있는지 검토해야 합니다.
Apache HTTP Client 5.6.x 이상에서는 httpclient5-observation 모듈이 Micrometer의 기존 계측을 대체하며 이 문제의 영향을 받지 않은 경로로 안내됩니다. Apache HTTP Client 5.x와 Micrometer 1.12.0 이상을 쓰는 경우에는 MicrometerHttpClientInterceptor 대신 종료 상태를 처리하도록 설계된 ObservationExecChainHandler로 이전할 수 있습니다. 대체 계측으로 바꿀 때는 지표 이름·태그·대시보드·경보 쿼리가 달라지는지 운영 관점의 호환성도 확인해야 합니다.
운영자 확인 순서
- SBOM과 의존성 트리에서 micrometer-core의 실제 해석 버전을 확인합니다.
- Apache HttpAsyncClient 4.x·5.x 사용 여부와 MicrometerHttpClientInterceptor 등록 지점을 찾습니다.
- 응답 전 연결 실패가 가능한 외부 호출, 사용자 지정 URL, 프록시, 재시도 큐를 식별합니다.
- 현재 유지보수 계열에 맞은 공식 수정판으로 업데이트하거나 권고된 대체 계측 경로로 전환합니다.
- 스테이징에서 연결 재설정·시간 초과·소켓 실패를 발생시킨 뒤 추적 상태와 힙이 안정적으로 회수되는지 확인합니다.
- 배포 후 JVM 힙 사용량, Old Gen 증가율, GC 정지 시간, OutOfMemoryError, 재시작 횟수를 별도 관찰합니다.
재시도와 회로 차단기의 역할
외부 호출 실패에 자동 재시도를 적용하면 취약한 경로의 요청 수가 늘어날 수 있습니다. 업데이트 전에는 재시도 횟수와 지수 백오프, 동시 요청 상한, 회로 차단기, 요청 시간 제한을 점검해 반복 실패가 힙 누적 속도를 키우지 않도록 해야 합니다. 이 설정은 인터셉터의 상태 정리 오류를 고치는 조치가 아니지만, 장애 확대 속도와 서비스 전체의 자원 경쟁을 줄이는 보조 통제입니다.
메모리 경보도 단순 사용률 임계치 하나보다 요청 실패율과 함께 봐야 합니다. 응답 전 전송 오류가 늘어난 뒤 Old Gen이 계속 우상향하고 정상 트래픽이 줄어도 회복되지 않는다면 계측 상태 잔류를 의심할 수 있습니다. 힙 덤프를 다룰 때는 애플리케이션 데이터가 포함될 수 있으므로 접근 권한과 보관 기간을 제한하고, 운영 서비스에서 무리한 전체 덤프를 반복하지 않은 절차가 필요합니다.
업데이트 검증
업데이트 뒤에는 정상 응답, 연결 재설정, 연결 시간 초과, 소켓 오류를 각각 시험하고 요청 종료 뒤 추적 상태가 회수되는지 확인합니다. 계측을 대체한 경우에는 요청 수·지연·오류 지표가 기존 관측 체계에 계속 들어오는지, 태그 폭증이나 지표 누락이 없는지 확인해야 합니다. 메모리 안정성과 관측 연속성을 함께 통과해야 배포 완료로 볼 수 있습니다.
여러 서비스가 공통 BOM을 쓰더라도 실제 계측 구성은 다를 수 있습니다. 중앙 BOM을 올린 뒤 서비스별 재빌드가 이뤄졌는지, 캐시된 이미지가 남지 않았는지, 독립 배포 작업이 같은 수정판을 사용했는지 확인합니다. 대체 모듈로 전환한 서비스와 기존 인터셉터를 유지한 서비스를 자산 목록에서 구분하면 후속 점검이 쉬워집니다.
프레임워크 BOM과 실제 배포본
Spring Boot BOM이나 사내 플랫폼 BOM이 Micrometer 버전을 관리하면 build.gradle 또는 pom.xml의 직접 선언만으로는 실제 버전을 판단하기 어렵습니다. dependencyInsight·dependency:tree 같은 읽기 전용 결과와 실행 JAR의 라이브러리 목록을 비교하고, 컨테이너 이미지가 새 빌드 산출물을 포함하는지 digest로 확인합니다. 여러 서비스가 같은 BOM을 참조해도 재빌드 시점과 캐시 상태가 다르면 일부 서비스만 취약 버전에 남을 수 있습니다.
상용 지원 전용 수정판을 사용하는 경우에는 저장소 접근, 라이선스, 배포 승인 절차가 OSS 계열과 다릅니다. 현재 유지보수 계열을 유지할지 1.16.7 또는 1.17.1 OSS 계열로 이동할지 변경 범위와 지원 수명으로 판단합니다. 버전 강제 지정으로 BOM을 일시 우회한다면 다른 Micrometer 모듈과의 정합성도 시험해야 합니다.
관측 공백 방지
ObservationExecChainHandler나 httpclient5-observation으로 옮기면 메모리 안전성뿐 아니라 기존 메트릭의 이름, 태그 키, URI 템플릿 처리, 타이머 분포가 바뀔 수 있습니다. 배포 전후 대시보드를 나란히 비교하고 오류율·지연·요청 수 경보가 계속 동작하는지 확인합니다. 관측 경로를 바꾸면서 보안 취약점은 해결했지만 운영 경보가 사라지는 상황을 피해야 합니다.
힙 안정성 시험은 일정한 실패율을 유지한 상태에서 시간에 따른 retained state와 Old Gen을 보는 방식이 적합합니다. 새 계측 경로에서 요청 종료 이벤트가 한 번만 처리되는지, 취소·시간 초과·연결 재설정이 모두 종료 상태로 수렴하는지, 재시도 라이브러리가 새로운 추적 항목을 과도하게 생성하지 않는지도 함께 확인합니다.
정보 확인 기준
2026년 8월 25일 14:00 KST 회차 기준으로 Spring 공식 CVE-2026-59295 권고를 확인했습니다. 영향 조합, 수정 버전, 대체 계측 경로는 해당 공식 권고를 따릅니다.
확인한 출처
사실관계와 수치는 연결된 자료에서 다시 확인할 수 있습니다.
의견을 남겨주세요
아직 등록된 댓글이 없습니다.