
نص برمجي للكشف عن استغلال MongoBleed
أداة تحليل MongoDB غير متصلة لـ CVE-2025-14847 (MongoBleed)
أداة سطر أوامر مستقلة لنظام لينكس تقوم بتحليل بيانات MongoDB لتحديد احتمالية استغلال CVE-2025-14847 باستخدام وحدات كشف متعددة.
MongoBleed (CVE-2025-14847) هو ثغرة كشف للذاكرة في فك ضغط zlib الخاص بـ MongoDB تسمح للمهاجمين باستخراج بيانات حساسة—بيانات الاعتماد، رموز الجلسات، المعلومات الشخصية القابلة للتحديد—مباشرة من ذاكرة الخادم دون مصادقة.
تساعد هذه الأداة مستجيبي الحوادث على كشف محاولات الاستغلال باستخدام مصادر أدلة متعددة:
تحلل سجلات MongoDB بصيغة JSON لاكتشاف أنماط الاستغلال:
| معرف الحدث | النوع | الوصف |
|---|---|---|
| 22943 | اتصال مقبول | يُسجل عندما يتصل عميل |
| 51800 | بيانات وصفية للعميل | يُسجل عندما يرسل العميل معلومات عن المشغل/التطبيق |
| 22944 | اتصال مغلق | يُسجل عندما يفصل العميل |
الرؤية الأساسية: مشغلات MongoDB الشرعية ترسل دائماً بيانات وصفية للعميل. استغلال MongoBleed يتصل، يستخرج الذاكرة، ويفصل—ولكنه لا يرسل بيانات وصفية أبداً.
تحلل لقطات من db.serverStatus().asserts لاكتشاف أنماط غير عادية في عدادات asserts.user:
asserts.user مع أنواع التأكيدات الأخرى. إذا كانت تأكيدات المستخدم مرتفعة بشكل غير متناسب (نسبة ≥250x) أو كانت جميع الأنواع الأخرى صفراً، تُصنف كمشبوهة (ثقة متوسطة)ملاحظة: العدادات التراكمية قد تؤدي إلى نتائج إيجابية خاطئة. يُفضل استخدامها مع FTDC (الوحدة B2) للحصول على أفضل النتائج.
تحلل ملفات FTDC (Full-Time Diagnostic Data Capture) الخاصة بـ MongoDB لاكتشاف قمم زمنية محددة في عدادات التأكيدات. تقوم FTDC بأخذ عينات دورية من serverStatus، مما يتيح تحديد توقيت دقيق للهجمات المحتملة.
jq - معالج JSONawk (يُفضل gawk)gzip - لدعم ملفات السجلات المضغوطةpymongo - لفك تشفير ملفات FTDCssh، scp)# تبعيات السكريبتات Shell
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# تبعيات Python (لفك تشفير FTDC)
pip install -r requirements.txt
# استنساخ المستودع
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# جعل السكريبتات قابلة للتنفيذ
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# تثبيت تبعيات Python (اختياري، لدعم FTDC)
pip install -r requirements.txt
تحليل البيانات التي تم جمعها يدوياً من مضيفي MongoDB.
جمع البيانات تلقائياً من مضيفين متعددين عبر SSH، ثم تحليلها محلياً.
اجمع البيانات من مضيفي MongoDB ونظمها في هذا الهيكل:
./collected-data/
├── logs/ # سجلات MongoDB بصيغة JSON
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # لقطات serverStatus().asserts
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # محتويات FTDC diagnostic.data
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# نسخ من المضيف البعيد
scp user@mongohost:/var/log/mongodb/mongod.log* ./collected-data/logs/
شغّل هذا الأمر على مضيف MongoDB (يتطلب وصول 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
انسخ ملف JSON الناتج إلى ./collected-data/assert-counts/.
نصيحة: شغّل هذا الأمر عدة مرات (مثال: كل ساعة) لوضع خط أساس وكشف القمم.
توجد ملفات FTDC في:
<storage.dbPath>/diagnostic.data/ (غالباً /var/lib/mongodb/diagnostic.data/)systemLog.path (مثال: /var/log/mongodb/mongos.diagnostic.data/)# نسخ ملفات FTDC (قد يتطلب صلاحيات sudo)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# وضع الاكتشاف التلقائي - يحلل جميع البيانات المتاحة
./mongobleed-detector.sh --data-dir ./collected-data/
# مع حدود مخصصة
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # نظرة رجعية لمدة 24 ساعة
-c 50 \ # حد اتصال أقل
--spike-threshold 50 # حد قمة أقل
للتوافق مع الإصدارات السابقة، يمكنك تحليل السجلات مباشرةً:
# مسح المسارات الافتراضية
./mongobleed-detector.sh
# مسح ملفات سجلات محددة
./mongobleed-detector.sh -p /path/to/logs/*.json
# وضع الطب الشرعي (تحليل مضيفين متعددين)
./mongobleed-detector.sh --forensic-dir /evidence/
جمع البيانات تلقائياً من مضيفين متعددين وتحليلها:
# إنشاء ملف المضيفين
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# الجمع والتحليل
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# استخدام مفتاح SSH محدد
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# تنفيذ متوازٍ
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10
# تخطي جمع FTDC (أسرع)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --skip-ftdc
# جمع فقط، تحليل لاحقاً
./mongobleed-remote.py --hosts-file hosts.txt --user admin --collect-only
# تمرير خيارات SSH (مثال: مضيف قفز)
./mongobleed-remote.py --hosts-file hosts.txt --user admin \
-o "ProxyJump=bastion.example.com"
# استخدام sudo للوصول إلى الملفات المميزة (ملفات FTDC غالباً مقيدة)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --sudo
# وضع التصحيح لاستكشاف مشاكل الاتصال
./mongobleed-remote.py --hosts-file hosts.txt --user admin --debug
ملاحظة حول صلاحيات FTDC: ملفات FTDC في
/var/lib/mongodb/diagnostic.data/عادةً مملوكة للمستخدمmongodbوغير قابلة للقراءة من قبل المستخدمين العاديين. إذا رأيت تحذيرات "FTDC Permission Issues"، استخدم العلم--sudo. يتطلب ذلك أن يكون لدى المستخدم البعيد صلاحية sudo بدون كلمة مرور (NOPASSWD في sudoers).
| الكود | المعنى |
|---|---|
| 0 | لا توجد نتائج عالية أو متوسطة |
| 1 | تم اكتشاف نتائج عالية أو متوسطة |
| 2 | خطأ (تبعيات مفقودة، لا توجد بيانات، إلخ) |
توفر الأداة حكماً مركباً للثقة بناءً على جميع الأدلة المتاحة:
لربط السجلات (الوحدة A)، يتم تصنيف عناوين IP الفردية:
| المخاطر | المعايير |
|---|---|
| عالية | اتصالات ≥ الحد، معدل بيانات وصفية < 10%، معدل اندفاع ≥ 400/دقيقة |
| متوسطة |
INFO: وضع الاكتشاف التلقائي: تحليل ./collected-data/
INFO: الوحدة A: تحليل 3 ملف(ات) سجل...
INFO: الوحدة B1: تحليل عدد التأكيدات...
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ نتائج كشف MongoBleed (CVE-2025-14847) ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
حالة الوحدات:
[✓] الوحدة A (ربط السجلات): تم العثور على 3 ملف(ات) سجل
[✓] الوحدة B1 (عدد التأكيدات): تم العثور على 4 لقطة(ات)
[−] الوحدة B2 (قمم FTDC): لا توجد ملفات FTDC أو مفكك التشفير غير متاح
معلمات التحليل:
نافذة الزمن: 4320 دقيقة
حد الاتصال: 100
حد معدل الاندفاع: 400/دقيقة
معدل البيانات الوصفية: 0.10
حد القمة: 100
حد نسبة المستخدم: 250x
نتائج الوحدة A - ربط السجلات:
المخاطر SourceIP ConnCount MetaCount DiscCount MetaRate% BurstRate/m FirstSeen (UTC) LastSeen (UTC)
-------- ---------------------------------------- ---------- ---------- ---------- ------------ -------------- ---------------------- ----------------------
عالية 137.137.137.137 8172 0 8172 0.00% 490.32 2025-12-27T12:55:52Z 2025-12-27T13:12:32Z
تحليل الوحدة B1 - عدد التأكيدات:
تم تحليل 4 لقطات من 2025-01-01T10:00:00Z إلى 2025-01-01T11:30:00Z
asserts.user: 100 -> 860 (الفرق: 760)
تم كشف قمة: 2025-01-01T10:30:00Z إلى 2025-01-01T11:00:00Z
الفرق: +740 تأكيد مستخدم (110 -> 850)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════
الحكم المُركب:
ثقة متوسطة - يُوصى بالتحقيق
- أنماط اتصال مشبوهة ولكن بيانات FTDC غير متاحة للربط
⚠ مهم: إذا تم تأكيد الاستغلال، فإن التصحيح وحده غير كافٍ.
- قم بتدوير جميع بيانات الاعتماد التي قد تكون مكشوفة
- راجع البيانات التي تم الوصول إليها بحثاً عن كشف معلومات حساسة
- تحقق من الحركة الجانبية من الأنظمة المتأثرة
- احتفظ بالسجلات للتحليل الجنائي
تحذيرات:
- غياب البيانات الوصفية للاتصال خاص بـ PoC ويمكن تجنبه
- عدادات التأكيدات تراكمية - نتائج إيجابية خاطئة ممكنة بدون خط أساس
- FTDC توفر توقيتاً لكن ليس إسناداً كاملاً
- التصحيح + تدوير الأسرار يظل إلزامياً بغض النظر عن نتائج الكشف
يحتوي المستودع على مجموعة اختبار للتحقق من صحة الكاشف.
يحتوي دليل example-data/ على بيانات حقيقية من مثيل MongoDB 8.0.16 تعرض لهجوم باستخدام PoC MongoBleed:
example-data/
├── logs/ # سجلات MongoDB حقيقية مع أنماط هجوم
│ ├── mongod.log
│ └── mongod.log.1.gz
├── assert-counts/ # لقطة serverStatus().asserts بعد الهجوم
│ └── asserts-post-attack.json
└── ftdc-files/ # ملفات بيانات FTDC تشخيصية حقيقية
└── metrics.*
تظهر هذه البيانات:
./test/generate-test-logs.sh
ينشئ هذا بيانات اختبار صناعية إضافية بأنماط متنوعة:
./test/test-detector.sh
المخرجات المتوقعة:
╔════════════════════════════════════════════════════════╗
║ مجموعة اختبار كاشف MongoBleed ║
╚════════════════════════════════════════════════════════╝
اختبارات الوحدة A (ربط السجلات):
✓ نجاح: كود الخروج هو 1 (تم كشف نتائج)
✓ نجاح: تم كشف IP المصدر 137.137.137.137
...
اختبارات الوحدة B1 (عدد التأكيدات):
✓ نجاح: يُظهر حالة الوحدة B1
✓ نجاح: تم كشف قمة التأكيدات
...
اختبارات وضع الاكتشاف التلقائي:
✓ نجاح: يُظهر حالة الوحدة A
✓ نجاح: يُظهر الحكم المُركب
...
النتائج:
تم النجاح: 24
فشل: 0
جميع الاختبارات نجحت!
⚠️ قيود مهمة
كشف خاص بـ PoC: يعتمد كشف غياب البيانات الوصفية على سلوك PoC MongoBleed المعروف. يمكن لمهاجم متطور تعديل الاستغلال لإرسال بيانات وصفية مزيفة، على الرغم من أن هذا يقلل من سرعة الاستغلال.
العدادات التراكمية: asserts.user تراكمي منذ إعادة تشغيل mongod. بدون لقطات خط الأساس، قد تكون القيم العالية طبيعية للمثيلات طويلة التشغيل. اللقطات المتعددة عبر الزمن تحسن الدقة بشكل كبير.
توقيت FTDC: توفر FTDC معلومات توقيتية ولكن ليس إسناداً كاملاً. استخدمها مع ربط السجلات للحصول على أفضل النتائج.
الاحتفاظ بالسجلات: يمكن تحليل السجلات الموجودة فقط. التدوير العنيف أو مسح السجلات من قبل المهاجم سيدمر الأدلة.
مطلوب تسجيل JSON: إصدارات MongoDB 4.4+ تسجل بصيغة JSON افتراضياً. السجلات النصية القديمة غير مدعومة.
مفكك FTDC: يتطلب فك تشفير FTDC Python 3 مع pymongo. بدونه، الوحدة B2 غير متاحة.
وصول mongosh: يتطلب جمع عدد التأكيدات وجود mongosh مع الصلاحيات المناسبة.
إذا تم تأكيد نتائج عالية أو متوسطة:
يعتمد منطق الكشف في هذه الأداة على أبحاث من Eric Capuano و Tamir Zimerman:
انظر ملف LICENSE.
نرحب بالمساهمات! يرجى تقديم المشكلات وطلبات السحب.
إذا اختبرت هذه الأداة على بيانات إنتاج، فسنقدر بشكل خاص التعليقات حول:
| نوع البيانات | المصدر | الوجهة |
|---|
| السجلات | /var/log/mongodb/mongod.log* | <output-dir>/<hostname>/logs/ |
| عدد التأكيدات | أمر mongosh | <output-dir>/<hostname>/assert-counts/ |
| ملفات FTDC | /var/lib/mongodb/diagnostic.data/metrics.* | <output-dir>/<hostname>/ftdc-files/ |
| الخيار | الوصف | الافتراضي |
|---|
-d, --data-dir <path> | دليل يحتوي على البيانات المجمعة (وضع الاكتشاف التلقائي) | - |
-p, --path <glob> | مسار/نمط سجل إضافي (قابل للتكرار) | - |
-t, --time <minutes> | نافذة النظرة الرجعية بالدقائق | 4320 (3 أيام) |
-c, --conn-threshold | حد عدد الاتصالات | 100 |
-b, --burst-threshold | حد معدل الاندفاع في الدقيقة | 400 |
-m, --metadata-rate | حد معدل البيانات الوصفية (0.0-1.0) | 0.10 |
--spike-threshold | حد قمة التأكيدات | 100 |
--user-ratio-threshold | نسبة تأكيدات المستخدم/الأخرى لاكتشاف اللقطة الواحدة | 250 |
--no-default-paths | تخطي مسارات السجلات الافتراضية | false |
--forensic-dir <path> | تحليل المجلدات الفرعية كمضيفين منفصلين | - |
| الخيار | الوصف | الافتراضي |
|---|
-H, --host <hostname> | مضيف بعيد للمسح (قابل للتكرار) | - |
-f, --hosts-file <file> | ملف يحتوي على أسماء المضيفين (واحد في كل سطر) | - |
-u, --user <user> | اسم مستخدم SSH | المستخدم الحالي |
-k, --key <file> | ملف المفتاح الخاص SSH | ssh-agent |
-P, --port <port> | منفذ SSH | 22 |
-o, --ssh-options <opt> | خيارات SSH إضافية (قابلة للتكرار) | - |
--sudo | استخدام sudo للوصول إلى الملفات المميزة (FTDC) | false |
-O, --output-dir <path> | دليل تخزين البيانات المجمعة | ./collected-data |
--log-path <path> | مسار السجل البعيد للجمع (قابل للتكرار) | المسارات القياسية |
--ftdc-path <path> | مسار دليل FTDC البعيد (قابل للتكرار) | المسارات القياسية |
--skip-logs | تخطي جمع السجلات | false |
--skip-asserts | تخطي جمع serverStatus().asserts | false |
--skip-ftdc | تخطي جمع ملفات FTDC | false |
--collect-only | جمع البيانات فقط، لا تشغيل تحليل | false |
-j, --parallel <n> | عدد الاتصالات المتوازية | 5 |
--timeout <seconds> | مهلة أمر SSH | 300 |
-d, --debug | تمكين مخرجات التصحيح (إظهار أوامر SSH) | false |
-q, --quiet | إخفاء رسائل التقدم | false |
| الثقة | المعايير | التفسير |
|---|
| عالية | تم اكتشاف قمم FTDC وسجلات مشبوهة في نفس النافذة الزمنية | مؤشر قوي على الاستغلال |
| متوسطة | قمم FTDC أو سجلات مشبوهة (غير مرتبطة) | يُوصى بالتحقيق |
| منخفضة | فقط عدد تأكيدات تراكمي بدون قمم | تم اكتشاف شذوذ، دليل ضعيف |
| معلوماتية | لا توجد نتائج مهمة | نشاط طبيعي |
| اتصالات ≥ الحد، معدل بيانات وصفية < 10%، معدل اندفاع < 400/دقيقة |
| منخفضة | اتصالات ≥ الحد، معدل بيانات وصفية ≥ 10% |
| معلوماتية | اتصالات < الحد |
| الإصدار | ضعيف | تم الإصلاح في |
|---|
| 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+ | لا يوجد إصلاح |
| 4.0.x | 4.0.0+ | لا يوجد إصلاح |
| 3.6.x | 3.6.0+ | لا يوجد إصلاح |