MongoBleed: il giorno in cui il database ha iniziato a “sanguinare”

La chiamata arriva in un pomeriggio d’inverno, quando il SOC sembra quasi addormentato. 
Una dashboard si accende di rosso: picchi di connessioni brevissime sulla 27017, la porta di MongoDB. Nessun utente autenticato, nessun client noto, eppure il traffico cresce come una marea. 
Qualche minuto dopo iniziano a comparire nei log messaggi strani, errori di parsing da pacchetti compressi. L’analista del Blue Team stringe la tazza di caffè: “È MongoBleed?”

Cosa succede, in parole semplici 

MongoDB supporta la compressione zlib dei messaggi di rete per risparmiare banda. L’attaccante invia un pacchetto compresso e malformato, gonfiando un numero che dice al server quanto sarà grande il messaggio una volta decompresso. MongoDB alloca un buffer troppo grande e, per come gestisce quell’errore, rimanda indietro parti di memoria non inizializzata
In quei frammenti possono comparire password in chiarotokenAPI key, pezzi di documenti o configurazioni. E il tutto avviene prima dell’autenticazione: basta raggiungere la porta del DB. 

Mini‑schema - Sequenza dell’attacco 

Mini‑schema – Sequenza dell’attacco 

Com’è possibile “leggere” la memoria 

Il problema, che in certi casi porta il server a restituire per errore frammenti della propria memoria, nasce da una gestione difettosa delle richieste compresse e delle allocazioni, con conseguenze che vanno oltre un semplice crash applicativo.

Quando il server riceve richieste compresse malformate, il processo di decompressione calcola in modo errato la dimensione dei buffer da allocare in memoria. Questo porta a un’allocazione eccessiva (oversized allocation) oppure a un uso improprio dei buffer.

Se, a seguito di questo errore, il server genera una risposta di errore, quest’ultima può includere dati residui presenti nella heap, cioè porzioni di memoria che: non appartengono alla richiesta effettuata, contengono dati di operazioni precedenti, non sono state inizializzate/ripulite correttamente. In pratica, l’attaccante non “legge” la memoria direttamente, ma spinge il server a restituirgliela involontariamente all’interno della risposta.

L’immagine sottostante rappresenta il flusso concettuale di MongoBleed: richiesta compressa → allocazione esagerata → risposta d’errore con porzioni di heap. 

Flusso concettuale di MongoBleed

Versioni colpite & fix

Alla pubblicazione del PoC (fine dicembre), il tempo tra disclosure e sfruttamento attivo è stato di pochi giorni. Le stime parlano di decine di migliaia di istanze esposte su Internet e bersagliate da scansioni automatiche. In alcuni casi, i ricercatori hanno visto trapelare password del DBchiavi cloud e dettagli di container e WiredTiger

Cosa fare subito (checklist “a caldo”) 

1) Riduci la superficie d’attacco 

  • Blocca l’esposizione a Internet: limita la 27017 a soli host applicativi; in container non pubblicare 0.0.0.0:27017. 

2) Mitiga il codice vulnerabile 

  • Aggiorna a 4.4.30 / 5.0.32 / 6.0.27 / 7.0.28 / 8.0.17 / 8.2.3
  • Se non puoi aggiornare subitodisabilita zlib (es. net.compression.compressors: snappy,zstd). Possibile lieve impatto prestazionale, ma rimuovi il percorso vulnerabile. 

3) Assumi il peggio e ruota i “secrets” 

  • Tratta password DBsegreti app e chiavi cloud come potenzialmente esposti: rotali appena chiusa la falla. È una raccomandazione esplicita in più advisory. 

4) Caccia agli indizi 

  • Centralizza i log di MongoDB e cerca picchi di connessioni effimere senza metadata/driver ed errori su messaggi compressi
  • Analizza FTDC e serverStatus.asserts (valori “user” anomali). Strumenti utili: Velociraptor artifact e MongoBleed Detector

Dopo l’emergenza: rendere il DB noioso (cioè sicuro) 

  • Autenticazione forte (SCRAM) e TLS ovunque; niente accessi anonimi o legacy. 
  • Principio del minimo privilegio per utenti/ruoli; audit degli account dormienti. 
  • Micro‑segmentazione tra tier app/DB e regole esplicite est‑ovest; monitora costantemente la 27017. 
  • Patch management con finestre brevi: MongoBleed ha mostrato quanto sia corto il tempo tra annuncio e sfruttamento. 

FAQ lampo 

  • È una RCE? No: è una information disclosure. Ma i dati rubati possono facilitare compromissioni successive. 
  • Atlas è al sicuro? I cluster Atlas sono stati patchati automaticamente; il rischio maggiore è nei self‑hosted: verifica, comunque, la versione e le impostazioni. 
  • Come riconosco uno sfruttamento? Log con errori su pacchetti compressimolte connessioni brevi senza metadata/driver, asserts anomali e (in alcuni casi) risposte insolitamente corpose. 

Conclusioni

La lezione di MongoBleed è semplice: i database non amano stare sotto i riflettori di Internet. 

Chiudi le tende (segmentazione), cura la dieta (patch), evita le cattive compagnie (compressioni vulnerabili) e, se pensi che qualcuno abbia già sbirciato, cambia le chiavi di casa

Vuoi una verifica concreta del tuo livello di esposizione? Contattaci attraverso la nostra pagina dedicata per confrontarti con il nostro team di sicurezza e capire come proteggere davvero il tuo database da vulnerabilità come MongoBleed.

Condividi su :