
Detection Script for MongoBleed Exploitation
Offline MongoDB-Analyse-Tool für CVE-2025-14847 (MongoBleed)
Ein eigenständiges Linux-Kommandozeilen-Tool, das MongoDB-Daten analysiert, um eine wahrscheinliche Ausnutzung von CVE-2025-14847 mithilfe mehrerer Erkennungsmodule zu identifizieren.
MongoBleed (CVE-2025-14847) ist eine Schwachstelle zur Offenlegung von Speicherinhalten in der zlib-Dekomprimierung von MongoDB, die es Angreifern ermöglicht, sensible Daten – Anmeldeinformationen, Sitzungstoken, personenbezogene Daten (PII) – direkt aus dem Serverspeicher auszulesen, ohne sich zu authentifizieren.
Dieses Tool hilft Incident-Respondern, Ausnutzungsversuche mithilfe mehrerer Beweisquellen zu erkennen:
Analysiert MongoDB-JSON-Logs, um Ausnutzungsmuster zu erkennen:
| Ereignis-ID | Typ | Beschreibung |
|---|---|---|
| 22943 | Verbindung akzeptiert | Wird protokolliert, wenn ein Client eine Verbindung herstellt |
| 51800 | Client-Metadaten | Wird protokolliert, wenn ein Client Treiber-/Anwendungsinfo sendet |
Wichtige Erkenntnis: Legitime MongoDB-Treiber senden immer Client-Metadaten. Der MongoBleed-Exploit stellt eine Verbindung her, extrahiert Speicher und trennt die Verbindung – sendet jedoch niemals Metadaten.
Analysiert Momentaufnahmen von db.serverStatus().asserts, um ungewöhnliche Muster in den asserts.user-Zählern zu erkennen:
asserts.user mit anderen Assert-Typen. Wenn Benutzer-Asserts überproportional hoch sind (Verhältnis ≥250x) oder alle anderen Typen null sind, wird dies als verdächtig eingestuft (MEDIUM-Vertrauen).Hinweis: Kumulative Zähler können falsch positive Ergebnisse liefern. Für beste Ergebnisse in Kombination mit FTDC (Modul B2) verwenden.
Analysiert die Full-Time Diagnostic Data Capture (FTDC)-Dateien von MongoDB, um zeitlich lokalisierte Spitzen in Assert-Zählern zu erkennen. FTDC testet serverStatus regelmäßig, was eine präzise zeitliche Zuordnung möglicher Angriffe ermöglicht.
jq – JSON-Prozessorawk (gawk empfohlen)gzip – Für unterstützte komprimierte Logspymongo – Für FTDC-Dateidekodierungssh, scp-Befehle)# Shell script dependencies
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# Python dependencies (for FTDC decoding)
pip install -r requirements.txt
# Clone the repository
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# Make scripts executable
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# Install Python dependencies (optional, for FTDC support)
pip install -r requirements.txt
Analysiert Daten, die manuell von MongoDB-Hosts gesammelt wurden.
Sammelt automatisch Daten von mehreren Hosts per SSH und analysiert sie dann lokal.
Sammeln Sie Daten von Ihren MongoDB-Hosts und organisieren Sie sie in dieser Struktur:
./collected-data/
├── logs/ # MongoDB-JSON-Logs
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # serverStatus().asserts-Momentaufnahmen
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # FTDC diagnostic.data-Inhalte
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# Copy from remote host
scp user@mongohost:/var/log/mongodb/mongod.log* ./collected-data/logs/
Führen Sie diesen Befehl auf dem MongoDB-Host aus (erfordert mongosh-Zugriff):
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
Kopieren Sie die resultierende JSON-Datei nach ./collected-data/assert-counts/.
Tipp: Führen Sie diesen Befehl mehrmals aus (z. B. stündlich), um eine Basislinie zu erstellen und Spitzen zu erkennen.
FTDC-Dateien befinden sich unter:
<storage.dbPath>/diagnostic.data/ (üblich /var/lib/mongodb/diagnostic.data/)systemLog.path (z. B. /var/log/mongodb/mongos.diagnostic.data/)# Copy FTDC files (may require sudo)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# Auto-discovery mode - analyzes all available data
./mongobleed-detector.sh --data-dir ./collected-data/
# With custom thresholds
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # 24-hour lookback
-c 50 \ # Lower connection threshold
--spike-threshold 50 # Lower spike threshold
Aus Gründen der Rückwärtskompatibilität können Sie Logs auch direkt analysieren:
# Scan default paths
./mongobleed-detector.sh
# Scan specific log files
./mongobleed-detector.sh -p /path/to/logs/*.json
# Forensic mode (analyze multiple hosts)
./mongobleed-detector.sh --forensic-dir /evidence/
Sammelt automatisch Daten von mehreren Hosts und analysiert sie:
# Create hosts file
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# Collect and analyze
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# Use specific SSH key
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# Parallel execution
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10
# Skip FTDC collection (faster)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --skip-ftdc
# Collect only, analyze later
./mongobleed-remote.py --hosts-file hosts.txt --user admin --collect-only
# Pass SSH options (e.g., jump host)
./mongobleed-remote.py --hosts-file hosts.txt --user admin \
-o "ProxyJump=bastion.example.com"
# Use sudo for privileged file access (FTDC files are often restricted)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --sudo
# Debug mode to troubleshoot connection issues
./mongobleed-remote.py --hosts-file hosts.txt --user admin --debug
Hinweis zu FTDC-Berechtigungen: FTDC-Dateien in
/var/lib/mongodb/diagnostic.data/gehören normalerweise dem Benutzermongodbund sind für normale Benutzer nicht lesbar. Wenn Sie Warnungen zu „FTDC Permission Issues“ sehen, verwenden Sie das Flag--sudo. Dies setzt voraus, dass der Remote-Benutzer über passwortlosen sudo-Zugriff verfügt (NOPASSWD in sudoers).
| Code | Bedeutung |
|---|---|
| 0 | Keine HIGH- oder MEDIUM-Ergebnisse |
| 1 | HIGH- oder MEDIUM-Ergebnisse erkannt |
| 2 | Fehler (fehlende Abhängigkeiten, keine Daten usw.) |
Das Tool liefert ein kombiniertes Vertrauensvotum basierend auf allen verfügbaren Beweisen:
Für die Log-Korrelation (Modul A) werden einzelne IPs wie folgt klassifiziert:
| Risiko | Kriterien |
|---|---|
| HIGH | Verbindungen ≥ Schwellenwert, Metadatenrate < 10 %, Burstrate ≥ 400/min |
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
Das Repository enthält eine Testsuite zur Validierung des Detektors.
Das Verzeichnis example-data/ enthält echte Daten einer MongoDB 8.0.16-Instanz, die mit dem MongoBleed-PoC angegriffen wurde:
example-data/
├── logs/ # Echte MongoDB-Logs mit Angriffsmustern
│ ├── mongod.log
│ └── mongod.log.1.gz
├── assert-counts/ # Post-Angriff serverStatus().asserts-Momentaufnahme
│ └── asserts-post-attack.json
└── ftdc-files/ # Echte FTDC-Diagnosedatendateien
└── metrics.*
Diese Daten zeigen:
./test/generate-test-logs.sh
Dies erstellt zusätzliche synthetische Testdaten mit verschiedenen Mustern:
./test/test-detector.sh
Erwartete Ausgabe:
╔════════════════════════════════════════════════════════╗
║ 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!
⚠️ Wichtige Einschränkungen
PoC-spezifische Erkennung: Die Erkennung fehlender Metadaten basiert auf dem bekannten Verhalten des MongoBleed-PoC. Ein ausgefeilter Angreifer könnte den Exploit modifizieren, um gefälschte Metadaten zu senden, was jedoch die Ausnutzungsgeschwindigkeit verringern würde.
Kumulative Zähler: asserts.user ist seit dem Neustart von mongod kumulativ. Ohne Basis-Momentaufnahmen können hohe Werte bei langlebigen Instanzen normal sein. Mehrere Momentaufnahmen im Zeitverlauf verbessern die Genauigkeit erheblich.
FTDC-Zeitsteuerung: FTDC liefert zeitliche Informationen, aber keine perfekte Zuordnung. Für beste Ergebnisse in Verbindung mit Log-Korrelation verwenden.
Log-Aufbewahrung: Es können nur vorhandene Logs analysiert werden. Aggressive Rotation oder das Löschen von Logs durch Angreifer zerstört Beweise.
JSON-Protokollierung erforderlich: MongoDB 4.4+ protokolliert standardmäßig im JSON-Format. Legacy-Textlogs werden nicht unterstützt.
FTDC-Decoder: Die FTDC-Dekodierung erfordert Python 3 mit pymongo. Ohne diesen ist Modul B2 nicht verfügbar.
mongosh-Zugriff: Zum Sammeln von Assert-Zählern ist mongosh mit entsprechenden Berechtigungen erforderlich.
Wenn HIGH- oder MEDIUM-Ergebnisse bestätigt werden:
Die Erkennungslogik in diesem Tool basiert auf Forschung von Eric Capuano und Tamir Zimerman:
Siehe Datei LICENSE.
Beiträge sind willkommen! Bitte reichen Sie Issues und Pull-Requests ein.
Wenn Sie dieses Tool mit Produktionsdaten testen, freuen wir uns besonders über Feedback zu:
| 22944 | Verbindung geschlossen | Wird protokolliert, wenn ein Client die Verbindung trennt |
| Datentyp | Quelle | Ziel |
|---|
| Logs | /var/log/mongodb/mongod.log* | <output-dir>/<hostname>/logs/ |
| Assert-Zähler | mongosh-Befehl | <output-dir>/<hostname>/assert-counts/ |
| FTDC-Dateien | /var/lib/mongodb/diagnostic.data/metrics.* | <output-dir>/<hostname>/ftdc-files/ |
| Option | Beschreibung | Standard |
|---|
-d, --data-dir <path> | Verzeichnis mit gesammelten Daten (Auto-Erkennungsmodus) | - |
-p, --path <glob> | Zusätzlicher Log-Pfad/Glob (wiederholbar) | - |
-t, --time <minutes> | Rückblickfenster in Minuten | 4320 (3 Tage) |
-c, --conn-threshold | Verbindungsanzahl-Schwellenwert | 100 |
-b, --burst-threshold | Burst-Rate-Schwellenwert pro Minute | 400 |
-m, --metadata-rate | Metadaten-Rate-Schwellenwert (0.0-1.0) | 0.10 |
--spike-threshold | Assert-Spike-Schwellenwert | 100 |
--user-ratio-threshold | Benutzer-/Andere-Assert-Verhältnis für Einzel-Momentaufnahmen-Erkennung | 250 |
--no-default-paths | Standard-Log-Pfade überspringen | false |
--forensic-dir <path> | Unterverzeichnisse als separate Hosts analysieren | - |
| Option | Beschreibung | Standard |
|---|
-H, --host <hostname> | Remote-Host zum Scannen (wiederholbar) | - |
-f, --hosts-file <file> | Datei mit Hostnamen (einer pro Zeile) | - |
-u, --user <user> | SSH-Benutzername | Aktueller Benutzer |
-k, --key <file> | SSH-privater Schlüssel | ssh-agent |
-P, --port <port> | SSH-Port | 22 |
-o, --ssh-options <opt> | Zusätzliche SSH-Optionen (wiederholbar) | - |
--sudo | sudo für privilegierten Dateizugriff verwenden (FTDC) | false |
-O, --output-dir <path> | Verzeichnis zum Speichern gesammelter Daten | ./collected-data |
--log-path <path> | Remote-Log-Pfad zum Sammeln (wiederholbar) | Standardpfade |
--ftdc-path <path> | Remote-FTDC-Verzeichnispfad (wiederholbar) | Standardpfade |
--skip-logs | Log-Sammlung überspringen | false |
--skip-asserts | serverStatus().asserts-Sammlung überspringen | false |
--skip-ftdc | FTDC-Datei-Sammlung überspringen | false |
--collect-only | Nur Daten sammeln, keine Analyse ausführen | false |
-j, --parallel <n> | Anzahl paralleler Verbindungen | 5 |
--timeout <seconds> | SSH-Befehlstimeout | 300 |
-d, --debug | Debug-Ausgabe aktivieren (SSH-Befehle anzeigen) | false |
-q, --quiet | Fortschrittsmeldungen unterdrücken | false |
| Vertrauen | Kriterien | Interpretation |
|---|
| HIGH | FTDC-Spitzen erkannt UND verdächtige Logs im selben Zeitfenster | Starker Hinweis auf Ausnutzung |
| MEDIUM | FTDC-Spitzen ODER verdächtige Logs (nicht korreliert) | Untersuchung empfohlen |
| LOW | Nur kumulative Assert-Zähler ohne Spitzen | Anomalie erkannt, schwache Beweise |
| INFO | Keine signifikanten Ergebnisse | Normale Aktivität |
| Verbindungen ≥ Schwellenwert, Metadatenrate < 10 %, Burstrate < 400/min |
| LOW | Verbindungen ≥ Schwellenwert, Metadatenrate ≥ 10 % |
| INFO | Verbindungen < Schwellenwert |
| Version | Betroffen | Behoben in |
|---|
| 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+ | Kein Fix |
| 4.0.x | 4.0.0+ | Kein Fix |
| 3.6.x | 3.6.0+ | Kein Fix |