قرصنة الذكاء الاصطناعي - كيف يستخدم القراصنة الذكاء الاصطناعي في الهجمات الإلكترونية

اقرأ الآن
نستخدمُ الذكاء الاصطناعي في ترجمات الموقع، ومع أننا نسعى جاهدين لبلوغ الدقة قد لا تكون هذه الترجمات دقيقةً بنسبة 100% دائمًا. تفهّمك لهذا الأمر هو موضع تقدير لدينا.

الاكتشاف التقني لنمس CVE-2025-23061 و CVE-2024-53900

ب OPSWAT
شارك هذا المنشور

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] 

كود JavaScript يحدد مخطط Mongoose لمؤلف مع حقول الاسم والعمر والسيرة الذاتية
مخطط المؤلفين
كود JavaScript الذي يحدد مخطط Mongoose للكتب، بما في ذلك العنوان والوصف والسعر ومراجع المؤلف
مخطط الكتب
مقتطف كود JavaScript لمسار Node.js الذي يسترجع تفاصيل الكتاب ويملأ حقول المؤلف أو المراجعة
تطبيق Nodejs

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

يسمح ملء () للمطورين باستبدال حقل المؤلف (وهو معرف كائن) بمستند المؤلف الكامل عند الاستعلام عن نموذج الكتاب:

تمثيل JSON لوثيقة MongoDB لتخزين تفاصيل الكتاب بدون معلومات المؤلف الموسعة
عدم استخدام ملء ()
تمثيل JSON لمستند MongoDB بتفاصيل موسعة للمؤلف باستخدام الدالة "ملء
استخدام ملء ()

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

كود JavaScript يوضّح استعلامًا مخصصًا باستخدام دالة Mongoose's populate لتصفية المؤلفين حسب العمر
استعلام مخصص في ملء () في النمس

تحليل CVE-2024-53900

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

كود جافا سكريبت يعرض استخدام عامل التشغيل $ حيث لتصفية المؤلفين حسب العمر في الاستعلام

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

جدول يسرد دوال JavaScript وخصائصها المتاحة لعمليات MongoDB الخرائطية للاختزال الخرائطي

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

لقطة شاشة لجلسة تصحيح أخطاء كود VS Code لتحليل تنفيذ استعلام ملء النمس

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

جلسة تصحيح الأخطاء في كود VS Code تُظهر كود JavaScript مميزًا متعلقًا باستعلام $where في Mongoose

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

جلسة تصحيح أخطاء كود VS Code تعرض تعيينات المتغيرات داخل دالة JavaScript

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

مقتطف شفرة جافا سكريبت يوضّح استعلام Mongoose مع شرط تصفية $ حيث

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

جلسة تصحيح أخطاء كود VS Code تعرض القيم التي تمت تصفيتها في دالة JavaScript

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

مقتطف JavaScript بسيط باستخدام Sift.js لتصفية مصفوفة من الكائنات بناءً على معايير العمر
مثال على كود Sift

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

جلسة تصحيح أخطاء كود VS Code التي تركز على عمليات الاستعلام وتنفيذ الدالة

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

جلسة تصحيح أخطاء جافا سكريبت تُظهر عوامل الاستعلام مثل $where و $eq و $ موجود

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

مقتطف JavaScript مميز يوضح تنفيذ الوظيفة عند تمكين CSP (سياسة أمان المحتوى)

CVE-2024-53900 تفاصيل الاستغلال

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

مقتطف جافا سكريبت يُظهر استعلام Mongoose باستخدام شرط $where مع تنفيذ دالة غير آمنة محتملة

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

سجل خطأ في MongoDB يعرض فشل تنفيذ الخادم بسبب مرجع عام غير محدد

يشير هذا الخطأ إلى أن 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) بنجاح:

شاشة بالأبيض والأسود تعرض النص "نيويورك تايمز" بخط عريض بارز بخط بارز
رسم تخطيطي يوضح التفاصيل الفنية لثغرات Mongoose CVE، ويوضح تدفق البيانات ونقاط الاختراق الأمني

يوضّح الفيديو إثبات صحة مفهوم 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 ومكتبة الغربلة بشكل كامل.

يدعم MongoDB عامل التشغيل $ أو
تدعم مكتبة "غربلة" عامل التشغيل $ أو

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

الحمولة المستخدمة لتجاوز الإصلاح في mongoose 8.8.3

إثبات مفهوم 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 لتحديد هذه الثغرات الأمنية.

ابق على اطلاع دائم OPSWAT!

اشترك اليوم لتلقي آخر تحديثات الشركة, والقصص ومعلومات عن الفعاليات والمزيد.