
Detection Script for MongoBleed Exploitation
CVE-2025-14847 (MongoBleed)에 대한 오프라인 MongoDB 분석 도구
여러 탐지 모듈을 사용하여 CVE-2025-14847의 악용 가능성을 식별하는 독립형 Linux 명령줄 도구입니다.
MongoBleed(CVE-2025-14847)는 MongoDB의 zlib 압축 해제 과정에서 발생하는 메모리 노출 취약점으로, 공격자가 인증 없이 서버 메모리에서 자격 증명, 세션 토큰, 개인 식별 정보(PII) 등 민감한 데이터를 직접 추출할 수 있습니다.
이 도구는 사고 대응자가 여러 증거 소스를 사용하여 악용 시도를 탐지할 수 있도록 지원합니다:
MongoDB JSON 로그를 분석하여 악용 패턴을 탐지합니다:
| 이벤트 ID | 유형 | 설명 |
|---|---|---|
| 22943 | 연결 수락 | 클라이언트가 연결될 때 기록됨 |
| 51800 | 클라이언트 메타데이터 | 클라이언트가 드라이버/애플리케이션 정보를 보낼 때 기록됨 |
| 22944 | 연결 종료 | 클라이언트가 연결을 끊을 때 기록됨 |
핵심 통찰: 합법적인 MongoDB 드라이버는 항상 클라이언트 메타데이터를 보냅니다. MongoBleed 악용 코드는 연결하고 메모리를 추출한 후 연결을 끊지만 메타데이터는 절대 보내지 않습니다.
db.serverStatus().asserts의 스냅샷을 분석하여 asserts.user 카운터에서 비정상적인 패턴을 탐지합니다:
asserts.user를 다른 assertion 유형과 비교하여 의심스러운 패턴을 탐지합니다. 사용자 assert가 다른 유형에 비해 불균형적으로 높거나(비율 ≥250배) 다른 모든 유형이 0인 경우 MEDIUM 신뢰도로 의심스러운 것으로 플래그 지정참고: 누적 카운터는 거짓 양성을 유발할 수 있습니다. 최상의 결과를 위해 FTDC(모듈 B2)와 함께 사용하십시오.
MongoDB의 FTDC(Full-Time Diagnostic Data Capture) 파일을 분석하여 assertion 카운터에서 시간 국소화된 스파이크를 탐지합니다. FTDC는 serverStatus를 주기적으로 샘플링하므로 잠재적 공격의 정확한 타이밍을 파악할 수 있습니다.
jq - JSON 프로세서awk (gawk 권장)gzip - 압축 로그 지원용pymongo - FTDC 파일 디코딩용ssh, scp 명령어)# 셸 스크립트 종속성
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# Python 종속성 (FTDC 디코딩용)
pip install -r requirements.txt
# 저장소 클론
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# 스크립트 실행 권한 부여
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# Python 종속성 설치 (선택 사항, FTDC 지원용)
pip install -r requirements.txt
MongoDB 호스트에서 수동으로 수집한 데이터를 분석합니다.
SSH를 통해 여러 호스트에서 자동으로 데이터를 수집한 후 로컬에서 분석합니다.
MongoDB 호스트에서 데이터를 수집하여 다음 구조로 정리합니다:
./collected-data/
├── logs/ # MongoDB JSON 로그
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # serverStatus().asserts 스냅샷
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # FTDC diagnostic.data 내용
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# 원격 호스트에서 복사
scp user@mongohost:/var/log/mongodb/mongod.log* ./collected-data/logs/
MongoDB 호스트에서 다음 명령을 실행합니다(mongosh 접근 필요):
mongosh --quiet --eval 'JSON.stringify({
timestamp: new Date().toISOString(),
hostname: db.hostInfo().system.hostname,
asserts: db.serverStatus().asserts,
uptime: db.serverStatus().uptime
})' > asserts-$(date +%Y%m%d-%H%M%S).json
결과 JSON 파일을 ./collected-data/assert-counts/에 복사합니다.
팁: 기준선을 설정하고 스파이크를 탐지하려면 이 명령을 여러 번(예: 매시간) 실행하십시오.
FTDC 파일은 다음 위치에 있습니다:
<storage.dbPath>/diagnostic.data/ (일반적으로 /var/lib/mongodb/diagnostic.data/)systemLog.path에서 파생됨 (예: /var/log/mongodb/mongos.diagnostic.data/)# FTDC 파일 복사 (sudo가 필요할 수 있음)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# 자동 검색 모드 - 사용 가능한 모든 데이터 분석
./mongobleed-detector.sh --data-dir ./collected-data/
# 사용자 지정 임계값 사용
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # 24시간 조회 기간
-c 50 \ # 더 낮은 연결 임계값
--spike-threshold 50 # 더 낮은 스파이크 임계값
이전 버전과의 호환성을 위해 로그를 직접 분석할 수도 있습니다:
# 기본 경로 스캔
./mongobleed-detector.sh
# 특정 로그 파일 스캔
./mongobleed-detector.sh -p /path/to/logs/*.json
# 포렌식 모드 (여러 호스트 분석)
./mongobleed-detector.sh --forensic-dir /evidence/
여러 호스트에서 자동으로 데이터를 수집하고 분석합니다:
# 호스트 파일 생성
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# 수집 및 분석
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# 특정 SSH 키 사용
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# 병렬 실행
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10
# FTDC 수집 건너뛰기 (더 빠름)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --skip-ftdc
# 수집만 하고 나중에 분석
./mongobleed-remote.py --hosts-file hosts.txt --user admin --collect-only
# SSH 옵션 전달 (예: 점프 호스트)
./mongobleed-remote.py --hosts-file hosts.txt --user admin \
-o "ProxyJump=bastion.example.com"
# 권한이 필요한 파일 접근에 sudo 사용 (FTDC 파일은 종종 제한됨)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --sudo
# 연결 문제 해결을 위한 디버그 모드
./mongobleed-remote.py --hosts-file hosts.txt --user admin --debug
FTDC 권한 참고:
/var/lib/mongodb/diagnostic.data/의 FTDC 파일은 일반적으로mongodb사용자가 소유하며 일반 사용자가 읽을 수 없습니다. "FTDC 권한 문제" 경고가 표시되면--sudo플래그를 사용하십시오. 이를 위해서는 원격 사용자에게 암호 없는 sudo 액세스(sudoers에 NOPASSWD)가 필요합니다.
| 코드 | 의미 |
|---|---|
| 0 | HIGH 또는 MEDIUM 발견 사항 없음 |
| 1 | HIGH 또는 MEDIUM 발견 사항 감지됨 |
| 2 | 오류 (종속성 누락, 데이터 없음 등) |
도구는 사용 가능한 모든 증거를 기반으로 결합된 신뢰도 판정을 제공합니다:
로그 상관 분석(모듈 A)의 경우 개별 IP는 다음과 같이 분류됩니다:
| 위험 | 기준 |
|---|---|
| HIGH | 연결 수 ≥ 임계값, 메타데이터율 < 10%, 버스트율 ≥ 400/분 |
| MEDIUM | 연결 수 ≥ 임계값, 메타데이터율 < 10%, 버스트율 < 400/분 |
| LOW |
INFO: Auto-discovery mode: analyzing ./collected-data/
INFO: Module A: Analyzing 3 log file(s)...
INFO: Module B1: Analyzing assert-counts...
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ MongoBleed (CVE-2025-14847) Detection Results ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Module Status:
[✓] Module A (Log Correlation): 3 log file(s) found
[✓] Module B1 (Assert Counts): 4 snapshot(s) found
[−] Module B2 (FTDC Spikes): No FTDC files or decoder unavailable
Analysis Parameters:
Time Window: 4320 minutes
Connection Thresh: 100
Burst Rate Thresh: 400/min
Metadata Rate: 0.10
Spike Threshold: 100
User Ratio Thresh: 250x
Module A - Log Correlation Findings:
Risk SourceIP ConnCount MetaCount DiscCount MetaRate% BurstRate/m FirstSeen (UTC) LastSeen (UTC)
-------- ---------------------------------------- ---------- ---------- ---------- ------------ -------------- ---------------------- ----------------------
HIGH 137.137.137.137 8172 0 8172 0.00% 490.32 2025-12-27T12:55:52Z 2025-12-27T13:12:32Z
Module B1 - Assert Counts Analysis:
Analyzed 4 snapshots from 2025-01-01T10:00:00Z to 2025-01-01T11:30:00Z
asserts.user: 100 -> 860 (delta: 760)
SPIKE DETECTED: 2025-01-01T10:30:00Z to 2025-01-01T11:00:00Z
Delta: +740 user asserts (110 -> 850)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Combined Verdict:
MEDIUM CONFIDENCE - Investigation recommended
- Suspicious connection patterns but FTDC data unavailable for correlation
⚠ IMPORTANT: If exploitation is confirmed, patching alone is insufficient.
- Rotate all credentials that may have been exposed
- Review accessed data for sensitive information disclosure
- Check for lateral movement from affected systems
- Preserve logs for forensic analysis
Caveats:
- Connection metadata absence is PoC-specific and can be evaded
- Assertion counters are cumulative - false positives possible without baseline
- FTDC provides timing but not perfect attribution
- Patch + rotate secrets remains mandatory regardless of detection results
저장소에는 탐지기를 검증하기 위한 테스트 스위트가 포함되어 있습니다.
example-data/ 디렉터리에는 MongoBleed PoC를 사용하여 공격받은 MongoDB 8.0.16 인스턴스의 실제 데이터가 포함되어 있습니다:
example-data/
├── logs/ # 공격 패턴이 포함된 실제 MongoDB 로그
│ ├── mongod.log
│ └── mongod.log.1.gz
├── assert-counts/ # 공격 후 serverStatus().asserts 스냅샷
│ └── asserts-post-attack.json
└── ftdc-files/ # 실제 FTDC 진단 데이터 파일
└── metrics.*
이 데이터는 다음을 보여줍니다:
./test/generate-test-logs.sh
이 명령은 다양한 패턴의 추가 합성 테스트 데이터를 생성합니다:
./test/test-detector.sh
예상 출력:
╔════════════════════════════════════════════════════════╗
║ MongoBleed Detector Test Suite ║
╚════════════════════════════════════════════════════════╝
Module A Tests (Log Correlation):
✓ PASS: Exit code is 1 (findings detected)
✓ PASS: Detected source IP 137.137.137.137
...
Module B1 Tests (Assert Counts):
✓ PASS: Shows Module B1 status
✓ PASS: Detected assert spike
...
Auto-Discovery Mode Tests:
✓ PASS: Shows Module A status
✓ PASS: Shows combined verdict
...
Results:
Passed: 24
Failed: 0
All tests passed!
⚠️ 중요한 한계
PoC 특정 탐지: 메타데이터 부재 탐지는 알려진 MongoBleed PoC 동작을 기반으로 합니다. 정교한 공격자는 가짜 메타데이터를 보내도록 익스플로잇을 수정할 수 있지만, 이는 공격 속도를 저하시킬 수 있습니다.
누적 카운터: asserts.user는 mongod 재시작 이후 누적됩니다. 기준 스냅샷이 없으면 장기 실행 인스턴스의 높은 값이 정상일 수 있습니다. 시간에 따른 여러 스냅샷이 정확성을 크게 향상시킵니다.
FTDC 타이밍: FTDC는 타이밍 정보를 제공하지만 완벽한 귀속은 불가능합니다. 최상의 결과를 위해 로그 상관 분석과 함께 사용하십시오.
로그 보존: 존재하는 로그만 분석할 수 있습니다. 공격적인 로그 순환 또는 공격자의 로그 삭제는 증거를 파괴합니다.
JSON 로깅 필요: MongoDB 4.4+는 기본적으로 JSON 로그를 사용합니다. 레거시 텍스트 로그는 지원되지 않습니다.
FTDC 디코더: FTDC 디코딩에는 pymongo가 포함된 Python 3이 필요합니다. 없으면 모듈 B2를 사용할 수 없습니다.
mongosh 접근: Assert 카운트 수집에는 적절한 권한이 있는 mongosh가 필요합니다.
HIGH 또는 MEDIUM 발견 사항이 확인되면:
이 도구의 탐지 논리는 Eric Capuano와 Tamir Zimerman의 연구를 기반으로 합니다:
LICENSE 파일을 참조하십시오.
기여는 환영합니다! 이슈와 풀 리퀘스트를 제출해 주세요.
프로덕션 데이터에서 이 도구를 테스트하는 경우, 특히 다음에 대한 피드백을 주시면 감사하겠습니다:
| 데이터 유형 | 소스 | 대상 |
|---|
| 로그 | /var/log/mongodb/mongod.log* | <output-dir>/<hostname>/logs/ |
| Assert 카운트 | mongosh 명령어 | <output-dir>/<hostname>/assert-counts/ |
| FTDC 파일 | /var/lib/mongodb/diagnostic.data/metrics.* | <output-dir>/<hostname>/ftdc-files/ |
| 옵션 | 설명 | 기본값 |
|---|
-d, --data-dir <path> | 수집된 데이터가 있는 디렉터리 (자동 검색 모드) | - |
-p, --path <glob> | 추가 로그 경로/glob (반복 가능) | - |
-t, --time <minutes> | 조회 기간(분) | 4320 (3일) |
-c, --conn-threshold | 연결 수 임계값 | 100 |
-b, --burst-threshold | 분당 버스트율 임계값 | 400 |
-m, --metadata-rate | 메타데이터율 임계값 (0.0-1.0) | 0.10 |
--spike-threshold | Assert 스파이크 임계값 | 100 |
--user-ratio-threshold | 단일 스냅샷 탐지를 위한 사용자/기타 assert 비율 | 250 |
--no-default-paths | 기본 로그 경로 건너뛰기 | false |
--forensic-dir <path> | 하위 디렉터리를 별도 호스트로 분석 | - |
| 옵션 | 설명 | 기본값 |
|---|
-H, --host <hostname> | 스캔할 원격 호스트 (반복 가능) | - |
-f, --hosts-file <file> | 호스트명이 포함된 파일 (한 줄에 하나) | - |
-u, --user <user> | SSH 사용자 이름 | 현재 사용자 |
-k, --key <file> | SSH 개인 키 파일 | ssh-agent |
-P, --port <port> | SSH 포트 | 22 |
-o, --ssh-options <opt> | 추가 SSH 옵션 (반복 가능) | - |
--sudo | 권한이 필요한 파일 접근(FTDC)에 sudo 사용 | false |
-O, --output-dir <path> | 수집된 데이터를 저장할 디렉터리 | ./collected-data |
--log-path <path> | 수집할 원격 로그 경로 (반복 가능) | 표준 경로 |
--ftdc-path <path> | 원격 FTDC 디렉터리 경로 (반복 가능) | 표준 경로 |
--skip-logs | 로그 수집 건너뛰기 | false |
--skip-asserts | serverStatus().asserts 수집 건너뛰기 | false |
--skip-ftdc | FTDC 파일 수집 건너뛰기 | false |
--collect-only | 데이터만 수집하고 분석 실행 안 함 | false |
-j, --parallel <n> | 병렬 연결 수 | 5 |
--timeout <seconds> | SSH 명령 타임아웃 | 300 |
-d, --debug | 디버그 출력 활성화 (SSH 명령 표시) | false |
-q, --quiet | 진행 메시지 숨기기 | false |
| 신뢰도 | 기준 | 해석 |
|---|
| HIGH | FTDC 피크가 감지됨 AND 동일한 시간대에 의심스러운 로그 | 악용의 강력한 지표 |
| MEDIUM | FTDC 피크 또는 의심스러운 로그 (상관 관계 없음) | 조사 권장 |
| LOW | 스파이크 없이 누적 assert 카운트만 있음 | 이상 징후 감지, 약한 증거 |
| INFO | 유의미한 발견 사항 없음 | 정상 활동 |
| 연결 수 ≥ 임계값, 메타데이터율 ≥ 10% |
| INFO | 연결 수 < 임계값 |
| 버전 | 취약 | 수정 버전 |
|---|
| 8.2.x | 8.2.0 - 8.2.2 | 8.2.3 |
| 8.0.x | 8.0.0 - 8.0.16 | 8.0.17 |
| 7.0.x | 7.0.0 - 7.0.27 | 7.0.28 |
| 6.0.x | 6.0.0 - 6.0.26 | 6.0.27 |
| 5.0.x | 5.0.0 - 5.0.31 | 5.0.32 |
| 4.4.x | 4.4.0 - 4.4.29 | 4.4.30 |
| 4.2.x | 4.2.0+ | 수정 사항 없음 |
| 4.0.x | 4.0.0+ | 수정 사항 없음 |
| 3.6.x | 3.6.0+ | 수정 사항 없음 |