حول CVE-2024-0517
الثغرة CVE-2024-0517 هي ثغرة أمنية في الكتابة خارج الحدود في محرك V8 JavaScript في Google Chrome قبل الإصدار 120.0.6099.224، والتي تسمح للمهاجمين عن بُعد باستغلال تلف الكومة عبر صفحة HTML مصممة خصيصًا. تم الإبلاغ عن الثغرة لأول مرة من قبل توان (سوتو) فام من شركة Qrious Secure.
تنشأ هذه الثغرة من الخلط في النوع، والذي يحدث عندما يقوم أحد التطبيقات بتخصيص أو تهيئة مورد مثل مؤشر أو كائن أو متغير باستخدام نوع واحد، ولكن في وقت لاحق يصل إلى هذا المورد باستخدام نوع غير متوافق مع النوع الأصلي (CWE-843). في حالة مكافحة التطرف العنيف هذه، يحدث الخلط بين النوعين أثناء عملية تخصيص الذاكرة التي تسمى التخصيص المطوي، والتي يتم استخدامها لتحسين الذاكرة بواسطة Maglev، وهو محول برمجي محسن لمحرك V8 JavaScript.
من خلال استغلال الخلط في النوع وكتابة رموز shellcodes عشوائية بواسطة WebAssembly، يمكن للمهاجم تنفيذ أوامر على جهاز الضحية.
مراحل الهجوم
يمكن للمهاجمين استضافة موقع إلكتروني يحتوي على صفحة HTML مصممة وخداع المستخدمين للوصول إليه من خلال رسائل البريد الإلكتروني التصيدية أو شبكات التواصل الاجتماعي. عندما يزور المستخدمون الموقع باستخدام إصدار ضعيف من Google Chrome، فإن التعليمات البرمجية الخبيثة المضمنة ستنفذ أوامر عشوائية.
محرك جافا سكريبت V8
يمكن للمهاجمين استضافة موقع إلكتروني يحتوي على صفحة HTML مصممة وخداع المستخدمين للوصول إليه من خلال رسائل البريد الإلكتروني التصيدية أو شبكات التواصل الاجتماعي. عندما يزور المستخدمون الموقع باستخدام إصدار ضعيف من Google Chrome، فإن التعليمات البرمجية الخبيثة المضمنة ستنفذ أوامر عشوائية.
ماجليف والتخصيص المطوي
يعمل Maglev، وهو محول برمجي محسن في V8، على تحسين تنفيذ التعليمات البرمجية وتخصيص الذاكرة. يعمل Maglev فقط عندما يتم تنفيذ الشيفرة البرمجية بشكل متكرر ويتم تمييزها على أنها "ساخنة"، مما يشير إلى الحاجة إلى تنفيذ أسرع من خلال التحويل البرمجي بدلاً من التفسير الأبطأ سطراً بسطر.
عادةً ما تحدث عمليات التخصيص في مناطق ذاكرة غير متجاورة، مما يؤدي إلى استخدام متناثر وغير فعال للذاكرة. ولمعالجة ذلك، يستخدم V8 تقنية تسمى التخصيص المطوي، والتي تقوم بتخصيص متغيرات متعددة بشكل مستمر ومتزامن. يقوم Maglev أيضًا بتحسين عمليات التخصيص باستخدام التخصيص المطوي في تقدمه.
جمع القمامة من الأجيال
لتنظيف مناطق الذاكرة غير المستخدمة، يستخدم V8 تقنية تجميع القمامة للأجيال (GC)، حيث يقسم الذاكرة إلى مساحتين: الجيل الصغير والجيل القديم. بالإضافة إلى ذلك، هناك نوعان من جامعي القمامة: جامع القمامة الصغير، وهو المسؤول عن تنظيف المساحة الصغيرة، وجامع القمامة الرئيسي، الذي يتولى تنظيف المساحة القديمة. الجيل الصغير هو منطقة الذاكرة حيث يتم تخصيص الكائنات المنشأة حديثًا في البداية والجيل القديم هو منطقة الذاكرة حيث يتم تخزين الكائنات التي تعيش لفترة طويلة. يتم في النهاية ترقية الكائنات التي نجت من عدة دورات GC ثانوية في الجيل الصغير إلى الجيل القديم.
تحليل نقاط الضعف
نظرة عامة
تنشأ الثغرة عندما يتم إنشاء كائن من صنف موروث من صنف أساسي بدون مُنشئ محدد بشكل صريح (مُنشئ افتراضي أساسي)، ويتم إنشاء كائن آخر لاحقًا. بسبب التخصيص المطوي، قد يتبع تخصيص الكائن الأول تخصيص الكائن الثاني. إذا وقع حدث مثل جمع القمامة بين هاتين التخصيصين، فقد تنشأ ثغرة في الخلط بين النوعين.
تحليل الأسباب الجذرية
أجرى الزملاء الخريجون من OPSWAT تحليلاً مفصلاً لسير عمل V8 أثناء عملية التخصيص، وحددوا أن الوظائف التالية يتم استدعاؤها أثناء هذه العملية
ضمن هذه العملية، تم تحديد مشكلة في دالة TryBuildFindNonDefaultConstructorOrConstruct: تقوم الدالة BuildAllocateFastObject بتوسيع Current_raw_allocation_ (مؤشر إلى منطقة الذاكرة المخصصة لمتغيرات متعددة في وقت واحد) لإنشاء مثيل الفئة التابعة، ولكنها تفشل في مسحها عن طريق تعيينها إلى لا شيء.
نتيجةً لذلك، يتم دائمًا تخصيص الكائن التالي الذي تم إنشاؤه مباشرةً بعد الذاكرة التي يشير إليها current_raw_allocation_، بغض النظر عن أي أحداث قبل التخصيص الثاني.
إذا تم استدعاء GC، يمكن تعيين منطقة الذاكرة المجاورة للذاكرة المجاورة لـ current_raw_allocation_ إلى كائنات أخرى. يمكن أن يؤدي هذا إلى موقف حيث، بعد تشغيل GC وإنشاء كائن آخر، يشير مؤشرين إلى نفس منطقة الذاكرة ولكن لهما أنواع بيانات مختلفة، مما يؤدي إلى ثغرة في الخلط بين النوعين.
الاستغلال
ولاستغلال هذه الثغرة، أنشأ زملاء OPSWAT الخريجون من OPSWAT مثيلات WebAssembly تحتوي على رمز shellcode وحاولوا إحداث ارتباك في النوع من خلال GC للتحكم في الذاكرة وتنفيذ رمز shellcode:
ارتباك في نوع المشغل
أثناء التهيئة، نحدد أولًا مصفوفة (_arrayObject) تحتوي على كائنات فارغة. بعد ذلك، نُنشئ نسخة من الصنف التابع بالإضافة إلى مُجمّع نفايات مُشغّل. أخيرًا، نعرّف مصفوفة أخرى تحتوي على رقم ذي فاصلة عائمة، باسم _arrayDouble.
يجب أن تتكرر هذه الإنشاءات بحيث يتم تنفيذ الشيفرة البرمجية عدة مرات، مما يجعل V8 يضع علامة "ساخن" عليها ويحفز محول ماغليف. نحقق ذلك عن طريق استدعاء مُنشئ الصنف التابع داخل حلقة على النحو التالي:
سيحدث ارتباك في النوع بعد تهيئة هذه الكائنات بشكل متكرر في حلقة.
إنشاء أوليات القراءة والكتابة
بعد النجاح في تشغيل الارتباك في النوع، يتطلب تنفيذ رمز الصدفة قراءة الذاكرة والكتابة فوق الذاكرة في عنوان متحكم به. للقيام بذلك، أنشأنا أوليات القراءة والكتابة. ستستفيد أوّليات الاستغلال من البيانات الوصفية في الكائنات لمنحنا مناطق ذاكرة للقراءة/الكتابة العشوائية واستخدامها لتشغيل شيفرة عشوائية.
ستمكننا أساسيات القراءة والكتابة في هذه الخطوة من التحكم في مؤشر جدول القفز لمثيل WebAssembly في الخطوة التالية.
إنشاء مثيلات WebAssembly
بعد ذلك، أنشأنا نسختين من WebAssembly: واحدة لتخزين رمز الصدفة والأخرى لتشغيله. لتجنب كتابة الرمز الصوري مباشرةً في ذاكرة مثيل WebAssembly عبر أساسيات القراءة والكتابة، قمنا بتعريف بعض القيم الثابتة ذات الفاصلة العائمة داخل مثيل WebAssembly.
مؤشر جدول قفزة التحكم في التحكم في مثيل WebAssembly
باستخدام أساسيات القراءة والكتابة؛ نقوم بتعديل مؤشر جدول القفز في مثيل WebAssembly الثاني لتخطي بعض البايتات من الشيفرة المترجمة للثوابت في مثيل WebAssembly الأول بحيث يتم تفسير ثوابت الفاصلة العائمة على أنها رمز الصدفة المقصود:
قم بتشغيل مثيل WebAssembly لتنفيذ الرمز البرمجي للرمز الصدفي
أخيرًا، بعد تشغيل الخلط بين الأنواع واستخدام أساسيات القراءة/الكتابة للتحكم في مؤشرات جدول القفز لمثيلات WebAssembly، قمنا باستدعاء الدالة المصدرة لمثيل WebAssembly الثاني، مما يؤدي إلى تنفيذ رمز الصدفة في مثيل WebAssembly الأول.
صُمم رمز الصدفة الذي نستخدمه لإنهاء جميع العمليات على جهاز لينكس، كما في الأمر التالي:
سيكون كود التجميع لتنفيذ هذا الأمر، المحول من أرقام الفاصلة العائمة، على النحو التالي:
محاكاة الثغرة الأمنية
لمحاكاة هذا الاستغلال في سيناريو واقعي، أنشأ الزملاء الخريجون في OPSWAT صفحة HTML خبيثة تم إعدادها بشكل خبيث.
يتم إرسال رسالة بريد إلكتروني للتصيد الاحتيالي مضمنة برابط إلى النطاق الذي يستضيف صفحة HTML المصممة إلى الضحية.
في حال وصول الضحية إلى الرابط باستخدام الإصدار الضعيف من Google Chrome، يتم تنفيذ الرمز البرمجي shellcode، مما يؤدي إلى إنهاء جميع العمليات. ونتيجة لذلك، يتم تسجيل خروج المستخدم، كما هو موضح أدناه:
الاصلاح
استُخدم حل MetaDefender Endpoint™ للتخفيف من حدة مشكلة مكافحة التطرف العنيف هذه بشكل استباقي من خلال الاستفادة من إمكانية "التطبيقات الضعيفة". ويحدد الحل بشكل فعال جميع نقاط الضعف المرتبطة بتطبيقات Google Chrome داخل بيئة نقطة النهاية ويعرضها. لتحييد التهديد، يمكن للمستخدمين إلغاء تثبيت Chrome على الفور أو تطبيق أحدث تصحيح أمني. ومن خلال تنفيذ أي من الإجراءين المضادين، يتم احتواء مكافحة التطرف العنيف بالكامل، مما يقلل بشكل كبير من خطر حدوث هجوم إلكتروني ناجح على نقطة النهاية.
أمان Endpoint من المستوى التالي
اكتشف لماذا تثق المنظمات والمؤسسات والكيانات في جميع أنحاء العالم في برنامج MetaDefender Endpoint لحماية نقاط النهاية المهمة. تحدّث إلى أحد الخبراء اليوم لمعرفة المزيد من المعلومات وشاهد بنفسك من خلال عرض تجريبي مجاني.
مراجع
https://nvd.nist.gov/vuln/detail/CVE-2024-0517
https://cwe.mitre.org/data/definitions/843.html
https://blog.exodusintel.com/2024/01/19/google-chrome-v8-cve-2024-0517-out-of-bounds-write-code-execution/
https://jhalon.github.io/chrome-browser-exploitation-1/
https://whenderson.dev/blog/webgl-garbage-collection/
https://v8.dev/
https://github.com/Uniguri/CVE-nday/tree/master/Chrome/V8/CVE-2024-0517