CVE-2025-14847: MongoBleed에 대해 알아야 할 모든 것

영향을 받은 Akamai Hunt 고객은 실행 가능한 방어 절차와 함께 취약한 자산에 대한 상세 매핑을 이미 제공받았습니다.

공유

요약 보고서

  • 2025년 12월 19일, 대부분의 MongoDB 배포에 영향을 미치는 새로운 취약점이 MongoDB 인스턴스에서 공개적으로 보고되었습니다.

  • MongoBleed라고 하는 이 취약점은 MongoDB의 zlib 압축 메시지 처리 방식에 존재하며, 인증되지 않은 클라이언트가 데이터베이스에서 초기화되지 않은 힙 메모리를 유출할 수 있도록 합니다.

  • CVE의 CVSSv4 점수는 8.7입니다.

  • 2025년 12월 29일, CISA(Cybersecurity and Infrastructure Security Agency)는 알려진 악용 취약점(KEV) 카탈로그에 CVE-2025-14847을 추가하여 악용이 활발하게 이루어지고 있음을 확인했습니다. 이와 동시에 Akamai 텔레메트리는 기업 네트워크의 약 62%에서 MongoDB 통신이 이루어지고 있음을 보여줍니다.

이 블로그 게시물에서는 MongoBleed에 대한 기술적 분석, 영향을 받는 MongoDB 버전에 대한 개요(패치 분석 포함), 그리고 취약한 자산을 식별하는 데 도움이 되는 Akamai Guardicore Segmentation Insight 쿼리를 비롯한 실용적인 방어 가이드를 제공합니다.

취약점 세부 정보

MongoBleed는 MongoDB가 압축된 와이어 프로토콜 메시지를 처리하는 방식에서 시작되며, 이 기능은 기본적으로 활성화되어 있습니다.

MongoDB는 OP_MSG opcode로 플래그가 지정된 메시지를 사용해 통신합니다. 여기서 요청 페이로드는 바이너리 JSON(BSON) 형식으로 인코딩됩니다. 압축된 메시지가 전송되면 원래 OP_MSG 페이로드는 OP_COMPRESSED 구조체 내부에 래핑됩니다.

OP_COMPRESSED 메시지에는 OP_MSG 페이로드와 압축되지 않은 페이로드의 예상 크기가 포함됩니다.


struct OP_COMPRESSED {
    struct MsgHeader {
        int32  messageLength;
        int32  requestID;
        int32  responseTo;
        int32  opCode;
    };
    int32_t  originalOpcode;
    int32_t  uncompressedSize;
    uint8_t  compressorId;
    char     *compressedMessage;
};

공격자는 uncompressedSize 필드를 조작해 압축된 페이로드의 실제 크기보다 더 크게 만들 수 있습니다. 이 값은 유효성이 검사되지 않기 때문에 이러한 조작으로 인해 초기화되지 않은 힙 메모리로 채워진 과도한 크기의 버퍼가 할당됩니다.

유출된 메모리에는 이전에 힙을 점유한 항목에 따라 일반 텍스트 암호, 인증정보, API 키 또는 기타 민감한 메모리 내 데이터의 조각이 포함될 수 있습니다.

이 유출은 MongoDB의 오류 처리 로직에 의해 더욱 증폭됩니다. 전송받은 잘못된 BSON 오브젝트에 null 종료자가 포함되어 있지 않으면 서버는 종료자가 발견될 때까지 메모리를 구문 분석합니다. 구문 분석이 최종적으로 실패하면 서버는 원본 메시지, 그리고 유출된 힙의 내용이 담긴 오류 응답을 반환합니다.

본문 작성 시점에서 Shodan은 MongoDB 인스턴스 21만 3천 개 이상이 인터넷에 노출되어 있다고 보고했으며, Sensys는 8만 7천 개 이상이 취약점에 광범위하게 노출되어 있다고 강조했습니다.

악용 사례 공개

악용이 가능성이 밝혀진 지 며칠 만에 GitHub에 유효한 악용 사례가 게시되었습니다. 이 악용 사례에서는 반복적으로 잘못된 압축 요청을 전송해 공격자가 점진적으로 대량의 힙 메모리를 유출할 수 있도록 합니다.

영향을 받는 버전

MongoBleed는 다음 MongoDB 버전에 영향을 미칩니다.

  • 8.2.0–8.2.2

  • 8.0.0–8.0.16

  • 7.0.0–7.0.27

  • 6.0.0–6.0.26

  • 5.0.0–5.0.31

  • 4.4.0–4.4.29

  • 모든 v3.6, v4.0, v4.2 버전

패치 분석

한 줄짜리 패치에서는 OP_COMPRESSED BSON에 제공된 값을 신뢰하지 않고 아웃풋 크기에서 파생되는 메시지의 크기를 계산합니다. 그러면 실제 메시지 크기를 초과하는 추가 메모리가 할당되지 않습니다.

-    return {output.length()};
+    return length;

방어

패치된 버전으로 업그레이드

버전 8.2.3, 8.0.17, 7.0.28, 6.0.27, 5.0.32, 4.4.30에 패치가 도입되었습니다.
이러한 버전 중 하나로 업그레이드하면 취약점이 완전히 해결됩니다.

네트워크 세그멘테이션으로 노출 감소

패치가 적용될 때까지 세그멘테이션을 사용하면 다음과 같은 방법으로 노출을 대폭 줄일 수 있습니다.

  • 포트 TCP/27017에서 MongoDB 인스턴스에 대한 인바운드 인터넷 접속 차단

  • 명시적으로 신뢰할 수 있는 소스의 연결만 허용

Akamai Guardicore Segmentation으로 취약한 호스트 식별

다음 Akamai Guardicore Segmentation Insight 쿼리는 취약한 MongoDB 인스턴스를 실행하는 호스트를 식별합니다.

Linux 자산

WITH LINUX AS (
  SELECT DISTINCT name, version, source
  FROM deb_packages 
  WHERE name = 'mongodb-org-server'
  UNION ALL
  SELECT DISTINCT name, version, source
  FROM rpm_packages
  WHERE name = 'mongodb-org-server'
),
PARSED AS (
  SELECT name, source, version,
    CAST(REGEX_MATCH(version, '([0-9]+)\.([0-9]+)\.([0-9]+)', 1) AS INTEGER) AS major,
    CAST(REGEX_MATCH(version, '([0-9]+)\.([0-9]+)\.([0-9]+)', 2) AS INTEGER) AS minor,
    CAST(REGEX_MATCH(version, '([0-9]+)\.([0-9]+)\.([0-9]+)', 3) AS INTEGER) AS patch
  FROM LINUX
)
SELECT name, source, version
FROM PARSED
WHERE
    (major = 8 AND minor = 2 AND patch BETWEEN 0 AND 2)
    OR
    (major = 8 AND minor = 0 AND patch BETWEEN 0 AND 16)
    OR
    (major = 7 AND minor = 0 AND patch BETWEEN 0 AND 27)
    OR
    (major = 6 AND minor = 0 AND patch BETWEEN 0 AND 26)
    OR
    (major = 5 AND minor = 0 AND patch BETWEEN 0 AND 31)
    OR
    (major = 4 AND minor = 4 AND patch BETWEEN 0 AND 29)
    OR
    (major = 3 AND minor = 6)
    OR
    (major = 4 AND minor IN (0, 2))

Windows 자산

WITH WINDOWS AS (
  WITH MONGO_PROGRAMS AS (
  SELECT DISTINCT name, version, install_source AS source, REGEX_MATCH(name, 'MongoDB [0-9].*', 0) AS mongo_match
  FROM programs
  WHERE name LIKE "MongoDB%"
  )
  SELECT DISTINCT name, version, source
  FROM MONGO_PROGRAMS
  WHERE LENGTH(mongo_match) > 0
),
PARSED AS (
  SELECT name, source, version,
    CAST(REGEX_MATCH(version, '([0-9]+)\.([0-9]+)\.([0-9]+)', 1) AS INTEGER) AS major,
    CAST(REGEX_MATCH(version, '([0-9]+)\.([0-9]+)\.([0-9]+)', 2) AS INTEGER) AS minor,
    CAST(REGEX_MATCH(version, '([0-9]+)\.([0-9]+)\.([0-9]+)', 3) AS INTEGER) AS patch
  FROM WINDOWS
)
SELECT name, source, version
FROM PARSED
WHERE
    (major = 8 AND minor = 2 AND patch BETWEEN 0 AND 2)
    OR
    (major = 8 AND minor = 0 AND patch BETWEEN 0 AND 16)
    OR
    (major = 7 AND minor = 0 AND patch BETWEEN 0 AND 27)
    OR
    (major = 6 AND minor = 0 AND patch BETWEEN 0 AND 26)
    OR
    (major = 5 AND minor = 0 AND patch BETWEEN 0 AND 31)
    OR
    (major = 4 AND minor = 4 AND patch BETWEEN 0 AND 29)
    OR
    (major = 3 AND minor = 6)
    OR
    (major = 4 AND minor IN (0, 2))

압축된 요청 비활성화(임시 방어)

인스턴스를 업그레이드하거나 세그멘테이션할 수 없는 경우 악용을 방지하기 위해 zlib 압축 요청을 비활성화할 수 있습니다. 자세한 지침은 공식 MongoDB Issue Tracker에서 확인할 수 있습니다.

요약

MongoBleed(CVE-2025-14847)는 원격으로 악용 가능한 MongoDB 취약점입니다. 이를 통해 인증되지 않은 공격자는 초기화되지 않은 힙 메모리를 유출할 수 있습니다.

공개 악용이 가능하고 인터넷에 노출된 수만 개의 인스턴스가 있기 때문에 민감한 데이터 유출 리스크가 즉각적으로 발생합니다. 영향을 받는 버전을 실행하는 기업은 패치된 릴리스로 업그레이드하거나 네트워크 세그멘테이션 룰을 적용해 노출을 최소화해야 합니다.

관심 유지

Akamai Security Intelligence Group은 고객과 보안 커뮤니티 전체를 위해 이와 같은 위협에 대한 모니터링, 보고, 방어를 계속할 것입니다. Akamai Security Intelligence Group의 최신 뉴스를 더 받으려면 리서치 홈페이지를 방문하고 소셜 미디어를 팔로우하세요.

태그

공유

관련 블로그 게시물

보안 리서치
AI 기반 재구축: 웹 애플리케이션 및 API를 위한 보안의 재정의
April 22, 2025
공격자는 이제 AI로 생성된 킬 체인을 배포해 공격의 전체 라이프사이클을 자동화하고 있습니다. 기업을 보호하는 방법을 알아보세요.
사이버 보안
수정 사항 심층 분석: CVE-2026-21513이 실제 환경에서 악용된 사례 분석
February 20, 2026
PatchDiff-AI가 활발히 악용되고 있는 MSHTML 취약점 CVE-2026-21513의 근본 원인을 어떻게 밝혀냈는지, 그리고 APT28이 이를 실제 공격에 어떻게 활용했는지 알아보세요.
보안 리서치
취약점 발견에서의 AI: 사람의 감독과 신중한 접근 필요
March 13, 2026
보안 취약점 탐지에 AI 시스템을 책임감 있게 사용하는 데 사람의 감독이 중요한 이유와 오탐을 방지하는 방법을 알아보세요.