استغلال CVE-2021-21220
من سلوك JIT غير صحيح إلى تنفيذ كود عن بُعد
نظرة عامة
يشرح هذا العرض التقديمي استغلال CVE-2021-21220، وهي ثغرة في محرك V8 JavaScript في متصفح Google Chrome ناتجة عن افتراضات غير صحيحة لمُحسِّن JIT أثناء التحسين.
يسير العرض التقديمي عبر:
- كيفية قيام V8 بالتجميع في الوقت المناسب (JIT)
- كيف يظهر خطأ الخلط بين الأنواع المُوقَّعة/غير المُوقَّعة أثناء التحسين
- كيف يؤدي الخطأ إلى أولية مصفوفة خارج الحدود (OOB)
- كيف يمكن للمهاجمين استغلال الوصول خارج الحدود لتسريب العناوين وتحقيق كتابات عشوائية في الذاكرة
- كيف يصبح WebAssembly (Wasm) هدفًا لتنفيذ كود أصلي
- الإجراءات التخفيفية الحالية ودفاعات المتصفح الحديثة
أهداف العرض التقديمي
الهدف من هذا العرض التقديمي هو توضيح كيف يمكن لخطأ تحسيني دقيق داخل محرك JavaScript حديث أن يتصاعد إلى:
- إفساد الذاكرة
- أوليات قراءة/كتابة عشوائية
- تعديل الكود الأصلي
- تنفيذ كود عن بُعد محتمل (RCE)
تسلط سلسلة الاستغلال الضوء على كيفية موازنة محركات JIT بين الأداء والأمان، وكيف يمكن أن تصبح افتراضات التحسين غير الصحيحة قابلة للاستغلال.
المواضيع المُغطاة
1. بنية V8
يقدم العرض التقديمي المكونات الرئيسية لـ V8:
مترجم Ignition
- ينفذ البايت كود الخاص بـ JavaScript
- يجمع ملاحظات وقت التشغيل
- يخزن معلومات الأنواع في متجهات الملاحظات
مُحسِّن TurboFan
- يبني رسومًا بيانية مُحسَّنة من ملاحظات وقت التشغيل
- يُدرج افتراضات تخمينية وحراس
- ينفذ تمريرات تحسينية عدوانية
الواجهة الخلفية للكود الآلي
- يُصدر تعليمات CPU أصلية
- يُنتج كودًا آليًا مُحسَّنًا للدوال “الساخنة”
يوضح الرسم البياني للبنية في العرض التقديمي كيف ينتقل JavaScript من:
Parsing → Bytecode → Optimization → Execution
2. لماذا يصعب تحسين JavaScript
JavaScript صعب للتنفيذ عالي الأداء لأن:
- المتغيرات تغير أنواعها ديناميكيًا
- المصفوفات تغير بنيتها وأنواع عناصرها
- العوامل مثل
+ يمكن أن يكون لها معانٍ متعددة
- فحوصات وقت التشغيل مكلفة
يستخدم V8 التجميع JIT لتحسين أنماط التنفيذ الشائعة عن طريق التخمين حول سلوك وقت التشغيل.
3. السبب الجذري لـ CVE-2021-21220
تنشأ الثغرة من عدم تطابق بين الأعداد المُوقَّعة وغير المُوقَّعة أثناء تحسين JIT.
المفاهيم الرئيسية الموضحة:
Uint32Array
Word32Xor
- نشر نوع غير صحيح
ChangeInt32ToInt64
- اختيار تعليمات تجميع خاطئة
يستغل الكود القيمة:
التي تُعيِّن بت الإشارة لعدد صحيح 32 بت.
4. عدم تطابق التحسين
تحدث الثغرة لأن TurboFan يُحسِّن:
بالكامل.
أثناء هذا التحسين:
- تختفي عملية XOR
- تُفقد معلومات النوع
- تُفسَّر القيم المُوقَّعة على أنها غير مُوقَّعة
- ينحرف سلوك JIT عن سلوك المترجم
يؤدي هذا إلى توليد كود آلي غير صحيح وقيم يتحكم بها المهاجم.
5. بناء أولية OOB
يحول الكود نتيجة JIT غير الصحيحة إلى تحكم في سلوك المصفوفة.
يوضح العرض التقديمي:
- قيمة عدد صحيح مُحسَّنة خاطئة
- تحويلها إلى متغير تحكم
i
- عدم تطابق بين تنفيذ الإحماء والتنفيذ المُحفِّز
- تجاوز لطول المصفوفة
Array.shift()
- إنشاء مصفوفة قادرة على OOB
مفاهيم استغلال هامة موضحة:
- تحسين الإحماء
- التحسين التخميني
- الخلط بين الأنواع
- إفساد طول المصفوفة
6. الوصول خارج الحدود
بمجرد أن يصبح طول المصفوفة -1، يحصل المهاجم على:
- قراءات خارج الحدود
- كتابات خارج الحدود
- الوصول إلى كائنات V8 المجاورة في الكومة
ثم يوضح الكود:
- تسريب المؤشرات
- اكتشاف عناوين الكائنات
- تداخل المصفوفات
- استخراج مؤشرات V8 الخام
7. إساءة استخدام WebAssembly
يشرح العرض التقديمي كيف يمكن للمهاجمين استهداف:
- صفحات كود WebAssembly المُجمَّعة
- الذاكرة القابلة للتنفيذ الأصلية التي يُنشئها V8
تدفق الهجوم:
- إنشاء دالة Wasm
- تحديد موقع الذاكرة القابلة للتنفيذ
- استبدال الكود الآلي المُجمَّع
- إعادة تنفيذ Wasm
- تحقيق تنفيذ أصلي عشوائي
يوضح هذا كيف يمكن لخلل في محرك JavaScript أن ينتقل إلى تنفيذ كود على مستوى العملية.
الدفاعات والإجراءات التخفيفية
يغطي القسم الأخير دفاعات المتصفح الحديثة:
المؤشرات المضغوطة
تُقلِّل التعرض المباشر للمؤشرات وإمكانية التنبؤ بالكومة.
عدم المباشرة في المؤشرات
تمنع الوصول المباشر إلى عناوين الذاكرة الخام.
عزل الكومة (Sandboxing)
تعزل مناطق الذاكرة وتُخفِّف تأثير الاستغلال.
W^X (Write XOR Execute)
تمنع الصفحات من أن تكون قابلة للكتابة والتنفيذ في نفس الوقت.
يتضمن العرض التقديمي أيضًا الفرق الفعلي لتصحيح V8 الذي يُظهر إصلاح مشكلة التمديد المُوقَّع.
النقاط الرئيسية
يوضح هذا العرض التقديمي كيف:
- أخطاء تحسينية صغيرة يمكن أن تصبح ثغرات خطيرة
- مُحسِّنات JIT تزيد بشكل كبير من تعقيد سطح الهجوم
- التخمين في وقت التشغيل يمكن أن يُحدث تناقضات خطيرة
- WebAssembly يغير مشهد الاستغلال
- المتصفحات الحديثة تتطلب دفاعات متعددة الطبقات
التقنيات المُناقشة
- JavaScript
- محرك Google V8
- TurboFan
- Ignition
- WebAssembly (Wasm)
- التجميع JIT
- إفساد الذاكرة
- الوصول خارج الحدود
- استغلال المتصفح
الغرض التعليمي
هذه المادة مخصصة بشكل صارم لـ:
- البحث الأمني
- العروض التعليمية
- تعلم دواخل المتصفح
- تحليل الثغرات
لا تستخدم هذه المعلومات ضد أنظمة لا تملكها أو ليس لديك إذن لاختبارها.
المراجع