Mongoose هي مكتبة نمذجة بيانات الكائنات (ODM) لـ MongoDB التي تبسط تفاعلات قاعدة البيانات في تطبيقات Node.js. من خلال توفير حل قائم على المخطط، يمكّن Mongoose كائنات JavaScript من التعيين إلى مستندات MongoDB، حيث يعمل كطبقة تجريد تساعد على هيكلة البيانات لتسهيل الإدارة والتحقق من صحتها. مع ميزات مثل البرمجيات الوسيطة لتنفيذ المنطق المخصص ونظام بناء الاستعلامات البديهية، يعزز Mongoose كفاءة العمل مع MongoDB. وقد حصل Mongoose، الذي يوصف بأنه "نمذجة كائنات MongoDB الأنيقة لـ Node.js"، على 27 ألف نجمة على GitHub، مما يعكس استخدامه وتقديره على نطاق واسع بين المطورين.
برنامج زمالة OPSWAT واكتشاف الثغرات الأمنية الحرجة
يوفر برنامج زمالةOPSWAT لأمن البنية التحتية الحرجة في مجال الأمن السيبراني للخريجين في فيتنام، لطلاب الدراسات العليا خبرة عملية في تأمين البنية التحتية الحرجة. وكجزء من هذا البرنامج، تتاح للزملاء فرصة تحليل ومعالجة نقاط الضعف في الأمن السيبراني والتعاون مع خبراء OPSWAT الأمنية OPSWAT مجال الأمن السيبراني لمواجهة تحديات العالم الحقيقي في مجالات مثل اكتشاف البرمجيات الخبيثة وأمن الملفات والوقاية من التهديدات.
خلال برنامج زمالة OPSWAT يقوم المشاركون بشكل منهجي بفحص وإعادة إنتاج CVEs المعروفة عبر مختلف المنتجات والمكتبات وأنظمة التشغيل. وكجزء من هذه المبادرة، اختار دات فونغ - أحد زملائنا المتميزين - فحص برنامج Mongoose نظرًا لاعتماده على نطاق واسع في بيئات الإنتاج. في نوفمبر 2024، اكتشف ثغرة خطيرة في Mongoose أثناء إجراء تحليل متعمق للمكتبة. سمحت الثغرة للمهاجم باستغلال قيمة $where، مما قد يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد (RCE) على خادم تطبيق Node.js. بعد الإبلاغ الفوري عن المشكلة إلى شركة Mongoose، تم إصدار تصحيح كجزء من الإصدار 8.8.3، وتم الكشف عن CVE-2024-53900 في قاعدة بيانات الثغرات الوطنية (NVD).
CVE-2024-53900 و CVE-2025-23061 الجدول الزمني
- 7 نوفمبر 2024: حدد دات فونج ثغرة أمنية حرجة في Mongoose وقدم تقريرًا أمنيًا إلى Snyk.
- 26 نوفمبر 2024: أصدرت Mongoose الإصدار 8.8.3 لمعالجة هذه الثغرة وإصلاحها.
- 2 ديسمبر 2024: كشفت قاعدة البيانات الوطنية للثغرات الأمنية (NVD) عن الثغرة الأمنية CVE-2024-53900 لهذه الثغرة.
- 17 ديسمبر 2024 عند تحليل تصحيح Mongoose 8.8.3 من Mongoose، وجد Dat Phung تجاوزًا لا يزال يمكّن RCE (تنفيذ التعليمات البرمجية عن بُعد). تم إرسال تقرير أمني مفصل إلى Tidelift.
- 13 يناير 2025: أصدرت Mongoose الإصدار 8.9.5، حيث قدمت تصحيحًا محسّنًا يعالج التجاوز بشكل فعال.
- 15 يناير 2025: كشفت قاعدة بيانات الثغرات الأمنية الوطنية (NVD) رسميًا عن الثغرة الأمنية CVE-2025-23061، مؤكدةً على خطورة الثغرة المكتشفة حديثًا.
طريقة ملء () النمس في النمس
يوفر Mongoose أيضًا ميزة مفيدة تسمى ملء () التي تعزز القدرة على العمل مع العلاقات بين المستندات. بينما تحتوي إصدارات MongoDB ≥ 3.2 على عامل التجميع $ Lookup للوصلات، فإن ميزة MongoDB's populate() تقدم بديلاً أكثر قوة لاستبدال مرجع تلقائيًا بالبيانات المقابلة من المستندات ذات الصلة. يعد هذا مفيدًا بشكل خاص لإدارة العلاقات بين مجموعات MongoDB المختلفة، كما هو الحال عندما يشير مستند إلى مستند آخر بواسطة _id الخاص به. [2]



عند تعريف مخطط في Mongoose، يمكن تعيين حقل للإشارة إلى نموذج آخر باستخدام خيار المرجع. ثم تُستخدم طريقة ملء() لاستبدال الحقل المشار إليه (معرف الكائن) بالمستند الكامل من النموذج ذي الصلة. على سبيل المثال، في تطبيق متجر كتب، يشير حقل المؤلف في bookSchema إلى مستند المؤلف، ويشير حقل المراجعة إلى مستند المراجعات. يُمكِّن الأسلوب (populate()) المطورين من استبدال حقل المؤلف (وهو معرّف كائن) بمستند المؤلف الكامل عند الاستعلام عن نموذج الكتاب.
يسمح ملء () للمطورين باستبدال حقل المؤلف (وهو معرف كائن) بمستند المؤلف الكامل عند الاستعلام عن نموذج الكتاب:


علاوةً على ذلك، يدعم أسلوب Mongoose's populate() الاستعلامات المخصصة لتحديد المستندات ذات الصلة التي يتم استرجاعها وكيفية جلبها. تسمح خصائص مثل المطابقة والخيارات للمطورين بتصفية المستندات ذات الصلة وفرزها وتقييدها وتخطيها، مما يوفر إمكانيات مرنة لاسترجاع البيانات.

تحليل CVE-2024-53900
كجزءٍ من برنامج زمالة OPSWAT للدراسات العليا في مجال الأمن السيبراني، أثناء تحليل Mongoose لإعادة إنتاج نقاط الضعف المعروفة، أجرى Dat Phung مراجعة شاملة لطريقة العمل الداخلية لطريقة ملء () التي تلعب دورًا رئيسيًا في التعامل مع العلاقات بين مستندات MongoDB. تدعم طريقة ملء () وسيطات السلاسل والكائنات على حد سواء، ويمكن للمطورين استخدام خيار المطابقة لتطبيق عوامل تصفية محددة على البيانات التي يتم استرجاعها:

في المثال أعلاه، خيار المطابقة هو كائن تصفية يمكن أن يتضمن مشغّلات استعلام MongoDB، كما هو مفصّل في مشغّلات الاستعلام والإسقاط - دليل MongoDB الإصدار 8.0. أحد المشغلات البارزة هو $ حيث، والذي يتيح تنفيذ JavaScript مباشرةً على خادم MongoDB. ومع ذلك، فإن هذا التنفيذ على خادم MongoDB مقيّد، حيث يدعم العمليات والوظائف الأساسية فقط.

أجرى Dat Phung تحليلًا متعمقًا لرمز مصدر Mongoose لفهم سير عمل أسلوب ملء(). وحدد أنه بعد أن يستدعي التطبيق أسلوب populate () على النموذج، يتم تشغيل الدالة populate(). ضمن هذه الدالة، يستدعي Mongoose الدالة _execPopulateQuery() ، والتي تقوم بتنفيذ الاستعلام باستخدام عامل التشغيل $where على خادم MongoDB. بعد ذلك، يتم استرداد جميع المستندات من المجموعة الخارجية لتجميعها في الخطوات التالية.

بعد استرداد البيانات من MongoDB، يقوم Mongoose بتنفيذ دالة رد النداء _done()، والتي تستدعي _assign() لإعداد البيانات قبل "ضم" النموذجين عن طريق استدعاء دالة assignVals().

قد تنشأ الثغرة عندما تتم معالجة البيانات المسترجعة بواسطة دالة Mongoose's assignVals() . تقوم هذه الدالة بالتحقق مما إذا كان خيار المطابقة عبارة عن مصفوفة، وإذا كان الأمر كذلك، تقوم بتمرير كل عامل إلى دالة sift(). تقوم الدالة sift() ، التي يتم استيرادها من مكتبة خارجية تحمل نفس الاسم، بمعالجة هذه الاستعلامات محليًا على خادم التطبيق. تمثل هذه المعالجة المحلية خطرًا أمنيًا، خصوصًا عند معالجة المدخلات التي يتحكم بها المستخدم.

لمزيد من التحقيق في ذلك، قام دات فونج بتعديل القيم في خيار المطابقة للتأكد من استيفاء الشروط، وبالتالي استدعاء دالة sift() لإجراء تحليل إضافي لتدفق البيانات.

مع وضع الشرط في مكانه، تم تمرير عامل التشغيل $ حيث لاحقًا إلى دالة غربلة().

مكتبة sift هي أداة JavaScript خفيفة الوزن مصممة لتصفية مجموعات البيانات والاستعلام عنها مثل المصفوفات أو كائنات JSON باستخدام صيغة شبيهة ببنية MongoDB. وفقًا للوثائق الرسمية، "Sift هي مكتبة صغيرة لاستخدام استعلامات MongoDB في JavaScript." تقوم دالة sift() بتقييم عمليات التصفية الشبيهة ب MongoDB على خادم التطبيق بدلًا من خادم قاعدة البيانات، مما قد يعرّض النظام لمخاطر أمنية كبيرة عند معالجة مدخلات غير موثوق بها.

استمرارًا لتحليله، حدّد زميلنا مشكلة في دالة createDefaultQueryTester() الخاصة بمكتبة الغربلة. تقوم هذه الدالة بتحويل كل عملية في مصفوفة المطابقة إلى دوال JavaScript قابلة للتنفيذ، والتي تُستخدم بعد ذلك لتصفية ومعالجة بيانات مستند MongoDB محليًا. ولتحقيق ذلك، تستدعي الدالة createDefaultQueryTester() الدالة createNamedOperation() ، وتمرير عمليات مثل $where من مصفوفة المطابقة كوسائط.

لكل عملية في مصفوفة التطابق، يتحقق createNamedOperation من كل عملية في مصفوفة التطابق، ويتحقق من دعم العملية ثم يمررها إلى الدالة المقابلة.

إذا كانت العملية بـ $ حيث، يتم إنشاء دالة JavaScript باستخدام قيمة "البارامز" الخام، والتي يتم اشتقاقها من عامل $ حيث في مصفوفة المطابقة ويمكن التحكم بها من قبل المستخدم.

CVE-2024-53900 تفاصيل الاستغلال
بينما يحدّ MongoDB من تنفيذ دوال JavaScript عبر عملية $where، كما تم تحليلها سابقًا، تسمح دالة sift() بتنفيذ هذه الدوال دون مثل هذه القيود. يؤدي هذا النقص في التحقق من صحة المدخلات وتقييدها إلى ثغرة أمنية كبيرة، حيث يمكن استغلال قيمة "البارامز" - التي يتم التحكم فيها مباشرةً عن طريق إدخال المستخدم - مما قد يؤدي إلى هجمات حقن التعليمات البرمجية. لفحص هذه المشكلة بشكل أكثر شمولاً، أنشأ دات فونج الاستعلام التالي:

في البداية، فشل الاستعلام في تنفيذ عملية أخرى، مما أدى إلى حدوث الخطأ التالي:

يشير هذا الخطأ إلى أن Mongoose يحاول تنفيذ عملية $where على خادم MongoDB قبل تمرير التحكم إلى الدالة sift(). ومع ذلك، وبسبب القيود المفروضة على دوال JavaScript في شرط $where الخاص ب MongoDB، يحدث خطأ، مما يمنع تنفيذ الاستعلام. نتيجةً لذلك، يوقف Mongoose العملية قبل أن يتمكن من الوصول إلى دالة sift() .
لتجاوز هذا القيد، استفاد زميلنا من المتغير "العام" الموجود على خادم التطبيق، والذي لا يوجد على خادم MongoDB. سمحت له هذه الطريقة بتجاوز القيد على خادم MongoDB وتمكين الاستعلام من الوصول إلى دالة sift():

باستخدام هذه القيمة، عندما يقوم Mongoose بتنفيذ عملية $where على MongoDB، يؤدي عدم وجود المتغير "عالمي" إلى أن يؤدي غياب المتغير "عالمي" إلى أن يؤدي عامل التشغيل الثلاثي (typeof global != "غير معرف" ?"undefined" ?global.process.mainModule.mainModule.constructor._load("child_process").exec("calc") : 1) لإرجاع 1، مما يمنع MongoDB من إلقاء خطأ. وبالتالي، يتم تنفيذ الاستعلام على خادم MongoDB دون مشاكل.
ومع ذلك، عندما تصل القيمة نفسها إلى الدالة sift() ، التي تعمل على خادم التطبيق حيث يتوفر المتغير "العام"، فإنها تؤدي إلى إنشاء الدالة التالية:

دليل إثبات مفهوم تنفيذ التعليمات البرمجية عن بُعد (RCE)
في مثال التطبيق الوارد في بداية المدونة، إذا قام أحد المهاجمين بإرسال الطلب التالي، فيمكنه تنفيذ هجوم تنفيذ التعليمات البرمجية عن بُعد (RCE) بنجاح:


يوضّح الفيديو إثبات صحة مفهوم CVE-2024-53900 الذي يؤثر على إصدارات Mongoose قبل الإصدار 8.8.3، والذي يفتقر إلى التحقق من صحة الإدخال المناسب لمنع إساءة استخدام عامل التشغيل $where إلى جانب مكتبة الغربلة.
إصلاح غير مكتمل و CVE-2025-23061
استنادًا إلى تقرير دات فونغ الأمني، قدمت شركة Mongoose تصحيحًا يهدف إلى حل الثغرة الأمنية التي تم تحديدها مسبقًا (CVE-2024-53900) قبل الكشف عنها علنًا. أضاف التصحيح ذو الصلة(Automattic/mongoose@33679bc) فحصًا لعدم السماح باستخدام $where ضمن خاصية المطابقة التي تم تمريرها إلى ملء ().

يتحقق هذا المقتطف مما إذا كانت خاصية المطابقة التي تم تمريرها إلى ملء () هي مصفوفة. إذا كانت كذلك، تقوم الشيفرة بتكرار كل كائن في المصفوفة لمعرفة ما إذا كان يحتوي على عامل التشغيل $where. إذا تم الكشف عن $where، يُرفع خطأ، مما يمنع الحمولة الخبيثة من الانتشار إلى دالة sift() الخطرة.
ونتيجةً لذلك، تفشل الحمولة التي تستغل CVE-2024-53900 في هذا الفحص لأن كائنًا في مصفوفة المطابقة يحتوي على $where، مما يمنعه فعليًا من الوصول إلى أداة الغربلة ().

بينما يحظر هذا التحديث بشكل صحيح الاستخدام المباشر لـ $where داخل مستوى تداخل واحد، إلا أنه يفشل في اكتشاف $where عند تضمينه داخل عامل تشغيل $ or - وهي بنية يدعمها كل من MongoDB ومكتبة الغربلة بشكل كامل.


ونتيجةً لذلك، يمكن للمهاجم تداخل $حيث تحت $أو للتهرب من فحص التصحيح أحادي المستوى. نظرًا لأن Mongoose لا يفحص سوى خصائص المستوى الأعلى لكل كائن في مصفوفة المطابقة، فإن حمولة التجاوز تبقى غير مكتشفة وتصل في النهاية إلى مكتبة الغربلة، مما يتيح تنفيذ عملية الإنفاذ الضار RCE.

إثبات مفهوم CVE-2025-23061
لتوضيح الطبيعة غير المكتملة للإصلاح، أعاد Dat Phung بناء التطبيق النموذجي باستخدام إصدار من Mongoose 8.9.4 (أحدث من 8.8.3). من خلال تداخل $ حيثداخل شرط $ أو $، يمكن للمهاجم تجاوز الفحص بنجاح وتحقيق RCE.
يوضح استغلال إثبات المفهوم كيف يمكن تشغيل CVE-2025-23061 في إصدارات Mongoose قبل الإصدار 8.9.5، مما يسمح للمهاجم بتنفيذ تعليمات برمجية عشوائية على الخادم:
التخفيف والتوجيه
للتخفيف من الثغرات الأمنية التي ناقشناها أعلاه، يرجى التأكد من تحديث نظامك إلى أحدث إصدار من Mongoose.
MetaDefender Core باستخدام محرك SBOM يمكنه اكتشاف هذه الثغرة الأمنية
OPSWAT MetaDefender Coreالمجهز بإمكانيات SBOMSoftware فاتورة الموادSoftware ) المتقدمة، يمكّن المؤسسات من اتباع نهج استباقي في معالجة المخاطر الأمنية. ومن خلال فحص تطبيقات البرمجيات وتوابعها، يحدد MetaDefender Core الثغرات الأمنية المعروفة، مثل CVE-2024-53900 و CVE-2025-23061، ضمن المكونات المدرجة. وهذا يمكّن فرق التطوير والأمان من تحديد أولويات جهود التصحيح، مما يخفف من المخاطر الأمنية المحتملة قبل أن تستغلها الجهات الخبيثة.
فيما يلي لقطة شاشة لصورتي CVE-2024-53900 و CVE-2025-23061، اللتين اكتشفهما MetaDefender Core باستخدام SBOM:

بالإضافة إلى ذلك، يمكن أيضًا اكتشاف CVEs عن طريق MetaDefender Software Supply Chainالتي تستفيد من MetaDefender Core مع SBOM لتحديد هذه الثغرات الأمنية.


