
نص برمجي للكشف عن استغلال 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).