SWUFORCE/기술스터디

CVE-2025-14847(Mongobleed) 분석

S_SDY 2026. 1. 27. 21:16

https://ufo.stealien.com/2026-01-26/Mongobleed-ko

 

STEALIEN Technical Blog

CVE-2025-14847(Mongobleed) 심층 분석

ufo.stealien.com

 

 

Mongobleed란?

 

: MongoDB 서버가 네트워크 압축 알고리즘을 zlib을 사용할 때 발생하는 구현상의 허점을 악용해 초기화 되지 않은 힙 메모리 데이터가 누출될 수 있는 취약점

 

 

Mongobleed 이름의 뜻

 

: 2014년 발생한 CVE-20140160(Heartbleed)와 공격 방식이 구조적으로 유사하기 때문.

(두 취약점 모두 데이터 길이 값을 크기보다 크다고 서버를 속이고, 그로인해 의도하지 않은 의도하지 않았던 영역의 메모리의 값이 누출됨)

 

 

Mongobleed의 간단한 흐름

 

1. 인증되지 않은 사용자는 압축 메시지 안에 적혀 있는 압축 해제 크기 값을 실제 데이터 크기보다 크게 조작해서 서버에 전달

2. 서버는 압축 해제 과정에서 사용자의 말을 그대로 신뢰하여 길이 검증 로직 무력화

3. 이로인해 서버는 압축 해제 크기 + 메시지 헤더 크기(16byte)만큼의 힙 메모리를 할당하고, 이를 기반으로 잘못된 크기를 가진 Message 객체 생성

4. 이후 정상적인 BSON 파싱을 거친 후 해당 Message 객체가 응답을 전송하는 과정에서 message가 다시 압축될 때 잘못된 크기를 기준으로 초기화되지 않은 힙 메모리 데이터가 함께 포함되어 외부로 누출됨.

 

 

영향을 받는 대상

 

취약한 버전의 MongoDB 서버를 운영하는 조직. (너무 당연한거 아닌가요)

Major 버전 기준

  •  3.6(End of Life)
  • 4.0 (End of Life)
  • 4.2 (End of Life)
  • 4.4
  • 5.0
  • 6.0
  • 7.0
  • 8.0
  • 8.2

그리고 해당 취약점에 노출되어 있을 수 있는 공개된 서버를 보니 Censys Search Engine에서는 7만5천대를, Showdan Search Engine에서는 20만대가 존재하는 사실이 밝혀짐

 

 

Mongobleed의 원인 : MongoDB 네트워크 압축이란?

 

MongoDB는 클러스터 노드 간 또는 클라이언트와 서버 간의 트래픽을 효율적으로 관리하기 위해 네트워크 압축 기능을 제공

 

네트워크 압축 기능을 통해 전송되는 데이터의 크기를 줄이고, 대역폭의 소모를 최소화시켜 전반적인 통신 효율을 높일 수 있다.

 

 

취약점 분석

 

1. 배경지식 쌓기 - MongDB의 통신 프로토콜

  • MongoDB는 일반적인 HTTP 프로토콜이 아닌, TCP/IP 소켓 상에서 동작하는 자체적으로 만든 무선 프로토콜을 통해 클라이언트와 통신함.
  • 헤더의 구조는 messageLength(메시지 총 크기), requestID(메시지 고유 식별자), responseTo(, opCode로 이루어져 있음

2. MessageCompressorManager::decompressMessage()함수의 핵심

  • uncompressedSize + MsgDataHeaderSize(16byte)크기로 힙 메모리 할당
  • 실제 압축 크기보다 버퍼 크기를 신뢰
  • compressor -> decompressData()의 반환 값이 올바른 값이 아니라면 잘못된 크기의 Message 객체가 생성

3. ZlibMessageCompressor::decompressData()함수

  • output의 길이를 lenght 변수에 담음
  • zlib::uncompressed()함수 호출 때 lenght 변수 포인터 받아서 압축 해제된 데이터 길이를 length 값으로 설정
  • 이후 ZlibMessageCompressor::decompressData()함수의 반환 값으로 lengh가 아닌 조작된 길이인 output.length()를 반환
  • 잘못된 반환값을 MessageCompressorManager::decompressMessage() 함수에서 Message객체의 크기로 설정
  • 이후 BSON파싱 과정을 거친 후 MessageCompressorManager::compressMessage() 함수를 통해 조작된 크기의 Message 객체를 통해 초기화 되지 않은 힙 메모리까지 압축하고 클라이언트에게 응

 

 

취약점 영향도

 

: NIST는 해당 취약점이 인증 없이도 원격에서 악용 가능하다는 점과 후속 공격에 미치는 파급력을 고려했는지 취약점의 위험도를 높은 점수로 산정

  • CVSS v4.0: 8.7 (High)
  • CVSS v3.1: 7.5 (High)