Eine kurze Erklärung der MongoBleed-Schwachstelle
(bigdata.2minutestreaming.com)- MongoBleed (CVE-2025-14847) ist eine schwerwiegende Memory-Leak-Schwachstelle, die seit 2017 in allen MongoDB-Versionen vorhanden war und es Angreifern ermöglicht, beliebige Daten aus dem Heap-Speicher der Datenbank zu lesen
- Die Schwachstelle entsteht durch einen Bug im zlib-Komprimierungspfad und kann ohne Authentifizierung ausgenutzt werden, indem man sich einfach mit der Datenbank verbindet
- Angreifer können manipulierte komprimierte Anfragen senden, um den Server dazu zu bringen, einen Puffer mit falscher Größe zu allokieren, wodurch Speicher früherer Vorgänge (Passwörter, API-Schlüssel usw.) offengelegt werden kann
- MongoDB hat am 19. Dezember 2025 einen Patch veröffentlicht, aber EOL-Versionen (3.6, 4.0, 4.2) wurden nicht korrigiert
- Diese 8 Jahre lang vorhandene Schwachstelle betrifft mehr als 210.000 dem Internet ausgesetzte MongoDB-Instanzen und erfordert in Cloud- wie auch On-Premises-Umgebungen sofortiges Patchen oder das Deaktivieren der Komprimierung
Überblick über MongoBleed
- MongoBleed (CVE-2025-14847) ist eine Schwachstelle im zlib-1-Nachrichtenkomprimierungspfad von MongoDB, die alle Versionen seit 2017 betrifft
- Angreifer können ohne Authentifizierung allein durch eine Verbindung zur Datenbank beliebige Heap-Speicherdaten lesen
- End-of-Life-(EOL)-Versionen wie MongoDB 3.6, 4.0 und 4.2 wurden nicht behoben
- Der Bug wurde durch einen PR im Mai 2017 eingeführt und am 19. Dezember 2025 offiziell veröffentlicht
- MongoDB erklärte, den Patch auf alle Instanzen einschließlich des Atlas-Cloud-Service angewendet zu haben
Kommunikationsstruktur von MongoDB
- MongoDB verwendet statt HTTP ein eigenes TCP-Protokoll, und Nachrichten werden im BSON-Format (Binary JSON) übertragen
- Alle Anfragen bestehen aus dem Befehl OP_MSG und werden bei Komprimierung in eine OP_COMPRESSED-Nachricht verpackt
- Die Nachricht enthält Felder wie
uncompressedSize,originalOpcodeundcompressorId uncompressedSizegibt die erwartete Größe nach dem Dekomprimieren an
- Die Nachricht enthält Felder wie
Exploit-Schritt 1 — Falsche Pufferallokation
- Angreifer setzen den Wert von
uncompressedSizeauf einen übermäßig großen Wert, damit der Server einen großen Puffer allokiert- Beispiel: Eine tatsächliche 1-KB-Nachricht wird als 1 MB deklariert
- Der MongoDB-Server vertraut nach dem Dekomprimieren der vom Benutzer angegebenen Größe, ohne die tatsächliche Größe zu validieren
- Dadurch bleibt im Speicher eine Struktur der Form
[tatsächliche Daten | nicht referenzierter Heap-Müll]zurück
- Dadurch bleibt im Speicher eine Struktur der Form
- Da das auf C++ basierende MongoDB keine Speicherinitialisierung durchführt, können sich in diesem Bereich sensible Daten früherer Vorgänge befinden
- Beispiele: Passwörter, Session-Token, API-Schlüssel, Kundendaten, Systemeinstellungen usw.
Exploit-Schritt 2 — Datenabfluss
- Angreifer senden fehlerhafte BSON-Eingaben, um den Server dazu zu bringen, die Müll-Daten im Speicher als String zu parsen
- Das erste Feld in BSON ist ein String und folgt der Regel von nullterminierten Strings (null-terminated string) aus C
- Wenn Angreifer einen String ohne Nullterminator senden, liest der Server weitere Daten aus dem Speicher mit ein
- Beispiel:
[ { "a | password: 123\0 | apiKey: jA2sa | ip: 219.117.127.202 ]
- Beispiel:
- Der Server erkennt dies als ungültiges BSON-Feld und antwortet mit einer Fehlermeldung, die den betreffenden Inhalt enthält
"errmsg": "invalid BSON field name 'a | password: 123'"
- Durch Wiederholung dieses Vorgangs können Angreifer den gesamten Heap-Speicher scannen und sensible Informationen sammeln
Auswirkungen und Risiko
- Da dies in der Pre-Auth-Phase geschieht, können Angreifer ohne Anmeldung auf Daten zugreifen
- Dem Internet ausgesetzte MongoDB-Instanzen sind unmittelbar gefährdet
- Laut Shodan-Suche sind mehr als 213.000 MongoDB-Instanzen öffentlich erreichbar
- Die Schwachstelle bestand von 2017 bis 2025, also etwa 8 Jahre lang, und ist aufgrund ihrer einfachen Struktur wahrscheinlich realistisch ausnutzbar
- MongoDB erklärte, es gebe „bisher keine Hinweise auf Ausnutzung“, veröffentlichte jedoch keine offizielle Entschuldigung oder detaillierte Timeline
Gegenmaßnahmen
- Auf die neueste gepatchte Version (8.0.17 oder höher) aktualisieren
- Kurzfristig kann auch das Deaktivieren der zlib-Netzwerkkomprimierung die Gefahr mindern
- Bei Nutzern von MongoDB Atlas ist der Patch bereits eingespielt
Weitere Informationen und verwandte Diskussionen
- Der Lead des Elastic-Security-Teams gab der Schwachstelle den Namen „MongoBleed“ und veröffentlichte einen PoC (Python-Skript)
- MongoDB und Elastic stehen im Bereich Suche und Analysefunktionen in einem Wettbewerbsverhältnis
- Verwandte Ressourcen:
- Offizielle CVE-Seite: CVE-2025-14847
- PR zur Einführung des Bugs: GitHub PR #1152
- Fix-Commit: 505b660a14698bd2b5233bd94da3917b585c5728
- Erkennungstool: mongobleed-detector
Zusammenfassung
- MongoBleed ist eine Memory-Leak-Schwachstelle, die durch einen Bug in der zlib-Komprimierungsverarbeitung verursacht wird
- Angreifer können über manipulierte komprimierte Anfragen frühere Speicherdaten (Passwörter, API-Schlüssel usw.) erlangen
- Alle MongoDB-Versionen von 2017 bis 2025 sind betroffen; Patchen oder das Deaktivieren der Komprimierung ist zwingend erforderlich
- Mehr als 210.000 öffentlich erreichbare Instanzen sind potenziell betroffen
- MongoDB hat zwar einen Patch veröffentlicht, doch die fehlende Unterstützung für EOL-Versionen und die verzögerte öffentliche Reaktion werden kritisiert
1 Kommentare
Hacker-News-Kommentare
Dadurch bleiben in nicht initialisiertem Speicher keine sinnvollen Daten mehr zurück.
Ich hatte einen Performance-Einbruch erwartet, aber tatsächlich gab es überhaupt keine messbaren Auswirkungen.
Ich finde, jeder, der speicherunsichere Sprachen verwendet, sollte das so machen. Auch dieser Mongo-Bug hätte sich auf diese Weise wohl abmildern lassen.
Dadurch wird die Speicherkonpression effizienter, und im Durchschnitt verbessert sich die Performance sogar.
MALLOC_CONF=opt.junk=free, dass malloc dasselbe tut.Viele Implementierungen bieten so eine Funktion also bereits als Option an.
Wenn mehr Performance nötig ist, kann man für bestimmte Zwecke eigene Custom-Allocator schreiben.
Dann wären auch andere Optimierungen möglich, die mit dem System-Allocator nicht gehen.
0xdbund freigegebenen Speicher mit0xdf.Dadurch lassen sich Use-Before-Initialization- und Use-After-Free-Bugs schnell finden.
Das ist dort die Standardeinstellung.
init_on_free=1entspricht.Mongo entwickelt zuerst in einem internen privaten Repository und überträgt Commits dann mit Copybara ins öffentliche Repository.
Die Verwirrung um die Datumsangaben ist in diesem Prozess entstanden.
Ich werde den Artikel aktualisieren und diesen Punkt sowie die Datumsdifferenz erklären.
Unsere Atlas-Cluster waren schon einige Tage vor der Veröffentlichung der CVE aktualisiert.
Heutzutage sollten die meisten Allocator das standardmäßig tun.
Chris hat das bei Blink verbessert, und das Ergebnis hat sich dann in ganz Chromium verbreitet.
Die zugehörigen Dokumente sind ebenfalls interessant.
Chromium-Blogpost
PartitionAlloc-Dokumentation
Bei SQL ist das selten, kommt aber gelegentlich vor.
Die Philosophie ist, dass man sich um Schema, Haltbarkeit, Lesen/Schreiben, Konnektivität und nichts davon kümmern muss.
Deshalb überrascht es mich nicht, dass man sich auch nicht um Sicherheit kümmert.
Diese Haltung führt zu einem „Hauptsache jetzt bequem“-Denken und endet dann bei Sicherheitsproblemen wie öffentlich erreichbaren DB-Instanzen.
In der Praxis ist es üblich, SQL und NoSQL zusammen zu verwenden.
NoSQL hat Stärken bei Hochverfügbarkeit für große Datenmengen, SQL eignet sich für relationale Datenspeicherung.
iMessage oder auch das Matchmaking-System von EA nutzen zum Beispiel NoSQL.
Am Ende braucht man beides. Es ist kein Konkurrenz-, sondern ein Ergänzungsverhältnis.
PostgreSQL kann zum Beispiel schon mit der Standardkonfiguration Rechte über das gesamte System erlangen.
Deshalb kennen die meisten Leute die Risiken öffentlich erreichbarer SQL-Server ziemlich gut.
Ich persönlich würde es nicht verwenden, aber es gibt Fälle, in denen DynamoDB oder MongoDB technisch passend sind.
Passendes Video
Aber Buffer Overflows gibt es seit 2003 immer noch.
Solche Probleme werden sich ewig wiederholen, solange sie nicht auf Sprachebene verhindert werden.
Mein Mitgefühl an die Mongo-Entwickler.
Ich finde, man sollte lieber ToroDB oder JSONB in PostgreSQL verwenden.