
Script di rilevamento per lo sfruttamento di MongoBleed
Strumento di analisi MongoDB offline per CVE-2025-14847 (MongoBleed)
Un tool standalone da riga di comando per Linux che analizza i dati di MongoDB per identificare probabili sfruttamenti di CVE-2025-14847 utilizzando molteplici moduli di rilevamento.
MongoBleed (CVE-2025-14847) è una vulnerabilità di divulgazione della memoria nella decompressione zlib di MongoDB che consente agli aggressori di estrarre dati sensibili—credenziali, token di sessione, PII—direttamente dalla memoria del server senza autenticazione.
Questo strumento aiuta i responder agli incidenti a rilevare tentativi di sfruttamento utilizzando molteplici fonti di prova:
Analizza i log JSON di MongoDB per rilevare schemi di sfruttamento:
| ID evento | Tipo | Descrizione |
|---|---|---|
| 22943 | Connessione accettata | Registrato quando un client si connette |
| 51800 | Metadati client | Registrato quando un client invia informazioni driver/ applicazione |
Intuizione chiave: I driver MongoDB legittimi inviano sempre i metadati del client. L'exploit MongoBleed si connette, estrae memoria e si disconnette—ma non invia mai metadati.
Analizza le istantanee di db.serverStatus().asserts per rilevare schemi insoliti nei contatori asserts.user:
asserts.user con altri tipi di asserzione. Se le asserzioni utente sono sproporzionatamente alte (rapporto ≥250x) o tutti gli altri tipi sono zero, viene segnalato come sospetto (confidenza MEDIA)Nota: I contatori cumulativi possono produrre falsi positivi. Da utilizzare in combinazione con FTDC (Modulo B2) per risultati ottimali.
Analizza i file di Full-Time Diagnostic Data Capture (FTDC) di MongoDB per rilevare picchi localizzati nel tempo nei contatori di asserzioni. FTDC campiona serverStatus periodicamente, consentendo una tempistica precisa di potenziali attacchi.
jq - Processore JSONawk (gawk raccomandato)gzip - Per il supporto di log compressipymongo - Per la decodifica dei file FTDCssh, scp)# Dipendenze dello script shell
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# Dipendenze Python (per decodifica FTDC)
pip install -r requirements.txt
# Clona il repository
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# Rendi eseguibili gli script
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# Installa le dipendenze Python (opzionale, per supporto FTDC)
pip install -r requirements.txt
Analizza i dati raccolti manualmente dagli host MongoDB.
Raccoglie automaticamente dati da più host tramite SSH, poi analizza localmente.
Raccogli i dati dai tuoi host MongoDB e organizzali in questa struttura:
./collected-data/
├── logs/ # Log JSON di MongoDB
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # Istanze di serverStatus().asserts
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # Contenuti di diagnostic.data FTDC
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# Copia da host remoto
scp user@mongohost:/var/log/mongodb/mongod.log* ./collected-data/logs/
Esegui questo comando sull'host MongoDB (richiede accesso a 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
Copia il file JSON risultante in ./collected-data/assert-counts/.
Suggerimento: Esegui questo comando più volte (ad esempio, ogni ora) per stabilire una baseline e rilevare picchi.
I file FTDC si trovano in:
<storage.dbPath>/diagnostic.data/ (comunemente /var/lib/mongodb/diagnostic.data/)systemLog.path (es. /var/log/mongodb/mongos.diagnostic.data/)# Copia file FTDC (potrebbe richiedere sudo)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# Modalità auto-scoperta - analizza tutti i dati disponibili
./mongobleed-detector.sh --data-dir ./collected-data/
# Con soglie personalizzate
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # Finestra di 24 ore
-c 50 \ # Soglia connessioni più bassa
--spike-threshold 50 # Soglia picco più bassa
Per compatibilità con versioni precedenti, puoi ancora analizzare i log direttamente:
# Scansiona percorsi predefiniti
./mongobleed-detector.sh
# Scansiona file di log specifici
./mongobleed-detector.sh -p /percorso/dei/log/*.json
# Modalità forense (analizza più host)
./mongobleed-detector.sh --forensic-dir /prove/
Raccogli automaticamente dati da più host e analizza:
# Crea file hosts
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# Raccogli e analizza
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# Usa una chiave SSH specifica
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# Esecuzione parallela
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10
# Salta la raccolta FTDC (più veloce)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --skip-ftdc
# Solo raccolta, analisi successiva
./mongobleed-remote.py --hosts-file hosts.txt --user admin --collect-only
# Passa opzioni SSH (es. host di salto)
./mongobleed-remote.py --hosts-file hosts.txt --user admin \
-o "ProxyJump=bastion.example.com"
# Usa sudo per accesso a file privilegiati (i file FTDC sono spesso limitati)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --sudo
# Modalità debug per risolvere problemi di connessione
./mongobleed-remote.py --hosts-file hosts.txt --user admin --debug
Nota sui permessi FTDC: I file FTDC in
/var/lib/mongodb/diagnostic.data/sono tipicamente di proprietà dell'utentemongodbe non leggibili dagli utenti normali. Se vedi avvisi "FTDC Permission Issues", usa il flag--sudo. Ciò richiede che l'utente remoto abbia accesso sudo senza password (NOPASSWD in sudoers).
| Codice | Significato |
|---|---|
| 0 | Nessun risultato ALTO o MEDIO |
| 1 | Risultati ALTI o MEDI rilevati |
| 2 | Errore (dipendenze mancanti, nessun dato, ecc.) |
Lo strumento fornisce un verdetto combinato di confidenza basato su tutte le prove disponibili:
Per la correlazione dei log (Modulo A), i singoli IP vengono classificati:
| Rischio | Criteri |
|---|---|
| ALTO | Connessioni ≥ soglia, tasso metadati < 10%, tasso burst ≥ 400/min |
| MEDIO |
INFO: Modalità auto-scoperta: analisi di ./collected-data/
INFO: Modulo A: Analisi di 3 file di log...
INFO: Modulo B1: Analisi dei conteggi asserzioni...
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ Risultati rilevamento MongoBleed (CVE-2025-14847) ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Stato moduli:
[✓] Modulo A (Correlazione log): 3 file di log trovati
[✓] Modulo B1 (Conteggi asserzioni): 4 istantanee trovate
[−] Modulo B2 (Picchi FTDC): Nessun file FTDC o decoder non disponibile
Parametri di analisi:
Finestra temporale: 4320 minuti
Soglia connessioni: 100
Soglia tasso burst: 400/min
Tasso metadati: 0.10
Soglia picco: 100
Soglia rapporto utente: 250x
Risultati Modulo A - Correlazione log:
Rischio SourceIP ConnCount MetaCount DiscCount MetaRate% BurstRate/m FirstSeen (UTC) LastSeen (UTC)
-------- ---------------------------------------- ---------- ---------- ---------- ------------ -------------- ---------------------- ----------------------
ALTO 137.137.137.137 8172 0 8172 0.00% 490.32 2025-12-27T12:55:52Z 2025-12-27T13:12:32Z
Analisi Modulo B1 - Conteggi asserzioni:
Analizzate 4 istantanee dal 2025-01-01T10:00:00Z al 2025-01-01T11:30:00Z
asserts.user: 100 -> 860 (delta: 760)
PICCO RILEVATO: 2025-01-01T10:30:00Z al 2025-01-01T11:00:00Z
Delta: +740 asserzioni utente (110 -> 850)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Verdetto combinato:
CONFIDENZA MEDIA - Indagine raccomandata
- Schemi di connessione sospetti ma dati FTDC non disponibili per correlazione
⚠ IMPORTANTE: Se lo sfruttamento è confermato, solo la patch non è sufficiente.
- Ruota tutte le credenziali che potrebbero essere state esposte
- Esamina i dati accessati per divulgazione di informazioni sensibili
- Verifica la presenza di movimento laterale dai sistemi colpiti
- Conserva i log per analisi forense
Avvertenze:
- L'assenza di metadati di connessione è specifica del PoC e può essere elusa
- I contatori di asserzioni sono cumulativi - possibili falsi positivi senza baseline
- FTDC fornisce tempistiche ma non attribuzione perfetta
- Patch + rotazione dei segreti rimane obbligatoria indipendentemente dai risultati del rilevamento
Il repository include una suite di test per validare il detector.
La directory example-data/ contiene dati reali da un'istanza MongoDB 8.0.16 che è stata attaccata utilizzando il PoC MongoBleed:
example-data/
├── logs/ # Log MongoDB reali con schemi di attacco
│ ├── mongod.log
│ └── mongod.log.1.gz
├── assert-counts/ # Istantanea post-attacco di serverStatus().asserts
│ └── asserts-post-attack.json
└── ftdc-files/ # File dati diagnostici FTDC reali
└── metrics.*
Questi dati mostrano:
./test/generate-test-logs.sh
Questo crea ulteriori dati di test sintetici con vari schemi:
./test/test-detector.sh
Output previsto:
╔════════════════════════════════════════════════════════╗
║ Suite di test MongoBleed Detector ║
╚════════════════════════════════════════════════════════╝
Test Modulo A (Correlazione log):
✓ PASS: Codice uscita è 1 (risultati rilevati)
✓ PASS: Rilevato IP sorgente 137.137.137.137
...
Test Modulo B1 (Conteggi asserzioni):
✓ PASS: Mostra stato Modulo B1
✓ PASS: Rilevato picco di asserzioni
...
Test Modalità auto-scoperta:
✓ PASS: Mostra stato Modulo A
✓ PASS: Mostra verdetto combinato
...
Risultati:
Superati: 24
Falliti: 0
Tutti i test superati!
⚠️ Limitazioni importanti
Rilevamento specifico per PoC: L'assenza di metadati si basa sul comportamento noto del PoC MongoBleed. Un aggressore sofisticato potrebbe modificare l'exploit per inviare metadati falsi, anche se ciò ridurrebbe la velocità di sfruttamento.
Contatori cumulativi: asserts.user è cumulativo dal riavvio di mongod. Senza istantanee di baseline, valori elevati potrebbero essere normali per istanze a lunga esecuzione. Più istantanee nel tempo migliorano significativamente l'accuratezza.
Tempistica FTDC: FTDC fornisce informazioni sulla tempistica ma non attribuzione perfetta. Da utilizzare insieme alla correlazione dei log per risultati ottimali.
Conservazione dei log: Può analizzare solo i log esistenti. Una rotazione aggressiva o la cancellazione dei log da parte dell'aggressore distruggerà le prove.
Log JSON richiesti: MongoDB 4.4+ usa per impostazione predefinita log JSON. I log di testo legacy non sono supportati.
Decoder FTDC: La decodifica FTDC richiede Python 3 con pymongo. Senza di esso, il Modulo B2 non è disponibile.
Accesso mongosh: La raccolta dei conteggi di asserzioni richiede mongosh con permessi appropriati.
Se vengono confermati risultati ALTI o MEDI:
La logica di rilevamento in questo strumento si basa sulla ricerca di Eric Capuano e Tamir Zimerman:
Vedere il file LICENSE.
Contributi benvenuti! Si prega di inviare issue e pull request.
Se testate questo strumento su dati di produzione, apprezzeremmo particolarmente feedback su:
| 22944 |
| Connessione chiusa |
| Registrato quando un client si disconnette |
| Tipo di dato | Sorgente | Destinazione |
|---|
| Log | /var/log/mongodb/mongod.log* | <output-dir>/<hostname>/logs/ |
| Conteggi asserzioni | Comando mongosh | <output-dir>/<hostname>/assert-counts/ |
| File FTDC | /var/lib/mongodb/diagnostic.data/metrics.* | <output-dir>/<hostname>/ftdc-files/ |
| Opzione | Descrizione | Predefinito |
|---|
-d, --data-dir <percorso> | Directory con dati raccolti (modalità auto-scoperta) | - |
-p, --path <glob> | Percorso/glob log aggiuntivo (ripetibile) | - |
-t, --time <minuti> | Finestra di osservazione in minuti | 4320 (3 giorni) |
-c, --conn-threshold | Soglia conteggio connessioni | 100 |
-b, --burst-threshold | Soglia tasso burst al minuto | 400 |
-m, --metadata-rate | Soglia tasso metadati (0.0-1.0) | 0.10 |
--spike-threshold | Soglia picco asserzioni | 100 |
--user-ratio-threshold | Rapporto utente/altre asserzioni per rilevamento singola istantanea | 250 |
--no-default-paths | Salta i percorsi di log predefiniti | false |
--forensic-dir <percorso> | Analizza sottodirectory come host separati | - |
| Opzione | Descrizione | Predefinito |
|---|
-H, --host <hostname> | Host remoto da scansionare (ripetibile) | - |
-f, --hosts-file <file> | File contenente hostname (uno per riga) | - |
-u, --user <utente> | Nome utente SSH | Utente corrente |
-k, --key <file> | File chiave privata SSH | ssh-agent |
-P, --port <porta> | Porta SSH | 22 |
-o, --ssh-options <opzione> | Opzioni SSH aggiuntive (ripetibile) | - |
--sudo | Usa sudo per accesso a file privilegiati (FTDC) | false |
-O, --output-dir <percorso> | Directory per memorizzare i dati raccolti | ./collected-data |
--log-path <percorso> | Percorso log remoto da raccogliere (ripetibile) | Percorsi standard |
--ftdc-path <percorso> | Directory FTDC remota da raccogliere (ripetibile) | Percorsi standard |
--skip-logs | Salta raccolta log | false |
--skip-asserts | Salta raccolta serverStatus().asserts | false |
--skip-ftdc | Salta raccolta file FTDC | false |
--collect-only | Solo raccolta dati, non eseguire analisi | false |
-j, --parallel <n> | Numero di connessioni parallele | 5 |
--timeout <secondi> | Timeout comando SSH | 300 |
-d, --debug | Abilita output di debug (mostra comandi SSH) | false |
-q, --quiet | Sopprime messaggi di avanzamento | false |
| Confidenza | Criteri | Interpretazione |
|---|
| ALTA | Picchi FTDC rilevati E log sospetti nella stessa finestra temporale | Forte indicatore di sfruttamento |
| MEDIA | Picchi FTDC O log sospetti (non correlati) | Indagine raccomandata |
| BASSA | Solo conteggi asserzioni cumulativi senza picchi | Anomalia rilevata, prova debole |
| INFO | Nessun risultato significativo | Attività normale |
| Connessioni ≥ soglia, tasso metadati < 10%, tasso burst < 400/min |
| BASSO | Connessioni ≥ soglia, tasso metadati ≥ 10% |
| INFO | Connessioni < soglia |
| Versione | Vulnerabile | Corretta 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+ | Nessuna correzione |
| 4.0.x | 4.0.0+ | Nessuna correzione |
| 3.6.x | 3.6.0+ | Nessuna correzione |