MongoBleed भेद्यता का सरल विवरण
(bigdata.2minutestreaming.com)- MongoBleed(CVE-2025-14847) 2017 के बाद से सभी MongoDB versions में मौजूद एक गंभीर memory leak भेद्यता है, जिससे हमलावर database की heap memory के arbitrary data को पढ़ सकते हैं
- यह भेद्यता zlib compression path के bug के कारण होती है, और बिना authentication के सिर्फ database से connect करके इसका दुरुपयोग किया जा सकता है
- हमलावर manipulated compressed request भेजकर server को गलत आकार का buffer allocate करने के लिए मजबूर कर सकता है, और उसके भीतर की पिछले कार्यों की memory (password, API key आदि) को उजागर कर सकता है
- MongoDB ने 19 दिसंबर 2025 को patch जारी किया, लेकिन EOL versions (3.6, 4.0, 4.2) को ठीक नहीं किया गया
- 8 वर्षों से मौजूद यह भेद्यता इंटरनेट पर एक्सपोज़ 2.1 लाख से अधिक MongoDB instances को प्रभावित करती है, और cloud व on-premise दोनों environments में तुरंत patch या compression disable करना ज़रूरी है
MongoBleed का अवलोकन
- MongoBleed(CVE-2025-14847) MongoDB के zlib 1 message compression path में पाई गई भेद्यता है, जो 2017 के बाद के सभी versions को प्रभावित करती है
- हमलावर बिना authentication के केवल database से connect करके arbitrary heap memory data पढ़ सकता है
- MongoDB 3.6, 4.0, 4.2 जैसे end-of-life (EOL) versions को ठीक नहीं किया गया
- यह bug मई 2017 के PR में introduce किया गया था, और 19 दिसंबर 2025 को आधिकारिक रूप से सार्वजनिक किया गया
- MongoDB ने घोषणा की कि Atlas cloud service सहित सभी instances पर patch लागू कर दिया गया है
MongoDB communication structure
- MongoDB HTTP के बजाय अपना TCP protocol इस्तेमाल करता है, और messages BSON(Binary JSON) फ़ॉर्मेट में भेजे जाते हैं
- सभी requests OP_MSG command से बनी होती हैं, और compression के समय उन्हें OP_COMPRESSED message में wrap किया जाता है
- message में
uncompressedSize,originalOpcode,compressorIdजैसे fields शामिल होते हैं uncompressedSizedecompression के बाद अपेक्षित आकार को दिखाता है
- message में
Exploit चरण 1 — गलत buffer allocation
- हमलावर
uncompressedSizevalue को वास्तविक आकार से काफी बड़ा सेट करके server से बड़ा buffer allocate करवाता है- उदाहरण: वास्तविक 1KB message को 1MB घोषित करना
- MongoDB server decompression के बाद वास्तविक आकार को verify किए बिना user द्वारा दिए गए आकार पर भरोसा करता है
- नतीजतन memory में
[वास्तविक data | unreferenced heap garbage]जैसी संरचना बची रहती है
- नतीजतन memory में
- C++-आधारित MongoDB memory initialization नहीं करता, इसलिए इस क्षेत्र में पिछले कार्यों का sensitive data मौजूद हो सकता है
- उदाहरण: password, session token, API key, customer data, system settings आदि
Exploit चरण 2 — data leak
- हमलावर गलत BSON input भेजकर server को memory के garbage data को string की तरह parse करने के लिए प्रेरित करता है
- BSON का पहला field string होता है, और C language के null-terminated string नियम का पालन करता है
- अगर हमलावर null terminator के बिना string भेजता है, तो server memory में मौजूद अन्य data भी पढ़ लेता है
- उदाहरण:
[ { "a | password: 123\0 | apiKey: jA2sa | ip: 219.117.127.202 ]
- उदाहरण:
- server इसे गलत BSON field मानकर error message में वही सामग्री शामिल करके response देता है
"errmsg": "invalid BSON field name 'a | password: 123'"
- इस प्रक्रिया को दोहराकर हमलावर पूरी heap memory को scan करते हुए sensitive information इकट्ठा कर सकता है
प्रभाव और जोखिम
- यह pre-auth चरण में होता है, इसलिए हमलावर बिना login के data तक पहुँच सकता है
- इंटरनेट पर एक्सपोज़ MongoDB instances तुरंत जोखिम में हैं
- Shodan search के अनुसार 213,000 से अधिक MongoDB instances सार्वजनिक रूप से उपलब्ध हैं
- 2017 से 2025 तक लगभग 8 साल तक मौजूद इस भेद्यता के वास्तविक exploit होने की संभावना इसकी सरल संरचना के कारण अधिक है
- MongoDB ने कहा कि “अब तक exploit का कोई प्रमाण नहीं है”, लेकिन औपचारिक माफ़ी या विस्तृत timeline सार्वजनिक नहीं की गई
Mitigation तरीके
- नवीनतम patched version (8.0.17 या उससे ऊपर) में update करें
- अल्पकालिक उपाय के रूप में zlib network compression disable करके भी जोखिम कम किया जा सकता है
- MongoDB Atlas users पर patch पहले ही लागू किया जा चुका है
अतिरिक्त जानकारी और संबंधित चर्चा
- Elastic security team lead ने इसका नाम ‘MongoBleed’ रखा और PoC(Python script) प्रकाशित किया
- MongoDB और Elastic search और analytics functionality के क्षेत्र में प्रतिस्पर्धी हैं
- संबंधित resources:
- CVE आधिकारिक पेज: CVE-2025-14847
- bug introduce करने वाला PR: GitHub PR #1152
- fix commit: 505b660a14698bd2b5233bd94da3917b585c5728
- detection tool: mongobleed-detector
सारांश
- MongoBleed, zlib compression handling bug के कारण पैदा हुई एक memory leak भेद्यता है
- हमलावर manipulated compressed request के जरिए पिछली memory का data (password, API key आदि) हासिल कर सकता है
- 2017~2025 के सभी MongoDB versions प्रभावित हैं, और patch या compression disable करना अनिवार्य है
- इंटरनेट पर एक्सपोज़ 2.1 लाख से अधिक instances संभावित प्रभावित लक्ष्य हैं
- MongoDB ने patch जारी किया है, लेकिन EOL versions के लिए support न होना और सार्वजनिक प्रतिक्रिया में देरी पर सवाल उठे हैं
1 टिप्पणियां
Hacker News की राय
इसकी वजह से uninitialized memory में कोई अर्थपूर्ण data नहीं बचता था
performance hit की उम्मीद थी, लेकिन वास्तव में कोई measurable impact नहीं था
मेरा मानना है कि memory-safe नहीं होने वाली language इस्तेमाल करने वाले सभी लोगों को ऐसा करना चाहिए। Mongo का यह bug भी शायद इस तरीके से mitigate किया जा सकता था
इससे memory compression efficiency बढ़ती है, और औसतन performance भी बेहतर हो जाती है
MALLOC_CONF=opt.junk=freeenvironment variable सेट करने पर malloc यही behavior करता हैयानी कई implementations पहले से यह feature option के रूप में देती हैं
अगर ज्यादा performance चाहिए, तो specific use case के लिए custom allocator लिखा जा सकता है
इससे ऐसे दूसरे optimizations भी संभव होंगे जो system allocator में नहीं किए जा सकते
0xdbऔर freed memory को0xdfसे भरता हैइससे use-before-initialization और use-after-free bugs जल्दी पकड़ में आते हैं
यह default setting है
init_on_free=1option को on करने जैसा ही behavior है?Mongo पहले internal private repository में develop करता है, फिर Copybara के जरिए commits को public repository में ले जाता है
तारीखों को लेकर जो confusion है, वह इसी process से आया है
मैं post update करके इस बात और तारीखों के अंतर को explain करूँगा
हमारे Atlas clusters CVE घोषित होने से कुछ दिन पहले ही upgrade हो चुके थे
आजकल तो ज़्यादातर allocators को default रूप से ऐसा करना चाहिए
Blink में Chris ने इस हिस्से को improve किया था, और उसका असर पूरे Chromium में फैल गया
इससे जुड़ी documentation भी दिलचस्प है
Chromium blog post
PartitionAlloc documentation
SQL की दुनिया में यह दुर्लभ है, लेकिन कभी-कभी होता है
इसकी philosophy है कि schema, durability, reads/writes, connectivity वगैरह किसी चीज़ की चिंता न करनी पड़े
इसलिए security की भी चिंता न की जाए, यह चौंकाने वाली बात नहीं है
ऐसा रवैया “अभी के लिए आसानी” वाली सोच पैदा करता है, और आखिरकार public DB instances जैसी security समस्याओं तक ले जाता है
व्यवहार में SQL और NoSQL को साथ में इस्तेमाल करना आम है
NoSQL बड़े पैमाने के data में high availability के लिए अच्छा है, और SQL relational data storage के लिए उपयुक्त है
उदाहरण के लिए iMessage और EA की matchmaking systems भी NoSQL इस्तेमाल करती हैं
आखिरकार दोनों की ज़रूरत होती है। ये प्रतिद्वंद्वी नहीं, बल्कि पूरक हैं
उदाहरण के लिए PostgreSQL default settings के साथ ही पूरे system पर अधिकार पा सकता है
इसलिए ज़्यादातर लोग public SQL servers के जोखिम को अच्छी तरह जानते हैं
मैं खुद इसे पसंद नहीं करता, लेकिन कुछ मामलों में DynamoDB या MongoDB तकनीकी रूप से सही विकल्प हो सकते हैं
संबंधित वीडियो
लेकिन buffer overflow 2003 से अब तक मौजूद है
जब तक ऐसी चीज़ों को language level पर नहीं रोका जाएगा, ये समस्याएँ हमेशा दोहराई जाएँगी
Mongo developers के लिए संवेदना है
मुझे लगता है ToroDB या PostgreSQL का JSONB इस्तेमाल करना बेहतर होगा