تجاوز حماية HardenProtect في Chrome V8 من خلال تسريب قيمة Sentinel
قيمة Sentinel هي قيمة خاصة في الخوارزميات، وغالبًا ما تستخدم كشرط لإنهاء الحلقات أو الخوارزميات التكرارية. يوجد العديد من قيم Sentinel في شفرة مصدر Chrome. وقد أظهرت الأبحاث السابقة كيفية استغلال كائن TheHole للتسرب لتحقيق تنفيذ أي كود داخل الصندوق الرملي. ستناقش هذه المقالة كائن V8 الأصلي الآخر - Uninitialized Oddball، والتي لا تزال هذه الطريقة قابلة للاستخدام في أحدث إصدار من V8.
هذه الطريقة لها عمومية:
تم تقديم مفهوم تسرب internal uninitialized oddball في Issue1216437.
تم تسريب UninitializedOddball مباشرة في Issue1314616، على الرغم من أن طريقة الاستغلال لم تكن واضحة في ذلك الوقت.
Issue1352549 يستحق الاهتمام بتأثيره المحتمل.
لا تزال بعض البرمجيات في الوقت الحالي لم تصلح هذه الثغرة.
تُعرَّف معظم الكائنات الأصلية في V8 في ملف v8/src/roots/roots.h، حيث تُرتب هذه الكائنات في الذاكرة بشكل متجاور. بمجرد كشف الكائنات الأصلية التي لا ينبغي تسريبها إلى JavaScript، يمكن تنفيذ أي كود داخل الصندوق الرمل.
للتحقق من هذه الطريقة، يمكن تعديل دالة V8 الأصلية لكشف Uninitialized Oddball إلى JavaScript. يمكن تعديل الإزاحة بالنسبة لـ isolate في دالة %TheHole().
الكود الأساسي لهذه الطريقة الملتفة كما يلي:
جافا سكريبت
الدالة read(obj ، prop) {
عودة obj[prop]
}
ل (let أنا = 0 ؛ أنا < 100000 ؛ i++) {
اقرأ(arr، 0);
}
دع القيمة = قراءة ( غير مهيأة_غريبة، 0)؛
console.log(val);
في V8 11.0.0، عند اختبار %TheHole() وعند إرجاع UninitializedOddball، لا يزال يمكن تحقيق قراءة نسبية عشوائية.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel](https://img-cdn.gateio.im/webp-social/moments-263e5651876fc00c4e0af0cfcd350210.webp019283746574839201
عند تمرير uninitialized_oddball، ابدأ من 0x558b20004086 كنقطة انطلاق لـ obj، وأكمل القراءة العشوائية في تعليمة vmovsd، حيث يتم تخزين البيانات في سجل xmm0.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-26c26345e3ec4effeea2e3e6b7cd8772.webp019283746574839201
الطريقة المقترحة للإصلاح هي إضافة فحص لمصفوفة map عند إرجاع عناصر المصفوفة من الدالة المحسّنة، لتجنب حساب الإزاحة مباشرةً لإرجاع قيم المصفوفة.
من الجدير بالذكر أن بعض البرمجيات لا تزال لم تصلح هذه الثغرة. طريقة الاستغلال على منصة x86 تختلف قليلاً، حيث أنه لا يوجد ضغط للعناوين، فإن القراءة والكتابة العشوائية تكون بالنسبة للعملية بأكملها. حتى مع تفعيل ASLR، لا يزال هناك احتمال كبير لقراءة وكتابة المحتوى المستهدف بسبب حجم الملف الكبير.
أسلوب التحايل الجديد هذا قد خفض بشكل كبير من صعوبة استغلال الثغرات المماثلة السابقة. يُنصح بإعادة تقييم جميع الثغرات التي تسرب uninitialized_oddball.
توجد أيضًا قيم Sentinel أخرى في V8، والتي قد تؤدي إلى مشاكل مماثلة. وهذا يقدم لنا الفهم التالي:
هل من السهل أيضًا تنفيذ V8 RCE مع تسريبات uninitialized_Oddball الأخرى.
لا يزال هناك جدل حول ما إذا كان ينبغي اعتبار هذه القضايا رسمياً كمسائل أمنية.
هل يجب إضافة قيمة Sentinel كمتغير في Fuzzer لاكتشاف أدوات الاستغلال الجديدة.
بغض النظر عن ذلك، ستؤدي هذه الأنواع من المشاكل إلى تقليص الفترة الزمنية التي يحتاجها القراصنة لتحقيق الاستغلال الكامل بشكل كبير.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel](https://img-cdn.gateio.im/webp-social/moments-0e52075003a8ee2ca492a5fc9f35c36b.webp019283746574839201
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-230537e420d579aabd89bdd168b20878.webp(
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-506159c94c9e0988552cbcbd13d971e1.webp(
![كشف حصري عن كيفية تجاوز حماية Chrome v8 من خلال تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-e9e2000fd501b69ee3ee643a459a26dd.webp(
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
كشف ثغرة أمنية جديدة في محرك Chrome V8: تسرب قيمة Sentinel يمكنه تجاوز صندوق الرمل
تجاوز حماية HardenProtect في Chrome V8 من خلال تسريب قيمة Sentinel
قيمة Sentinel هي قيمة خاصة في الخوارزميات، وغالبًا ما تستخدم كشرط لإنهاء الحلقات أو الخوارزميات التكرارية. يوجد العديد من قيم Sentinel في شفرة مصدر Chrome. وقد أظهرت الأبحاث السابقة كيفية استغلال كائن TheHole للتسرب لتحقيق تنفيذ أي كود داخل الصندوق الرملي. ستناقش هذه المقالة كائن V8 الأصلي الآخر - Uninitialized Oddball، والتي لا تزال هذه الطريقة قابلة للاستخدام في أحدث إصدار من V8.
هذه الطريقة لها عمومية:
تم تقديم مفهوم تسرب internal uninitialized oddball في Issue1216437.
تم تسريب UninitializedOddball مباشرة في Issue1314616، على الرغم من أن طريقة الاستغلال لم تكن واضحة في ذلك الوقت.
Issue1352549 يستحق الاهتمام بتأثيره المحتمل.
لا تزال بعض البرمجيات في الوقت الحالي لم تصلح هذه الثغرة.
تُعرَّف معظم الكائنات الأصلية في V8 في ملف v8/src/roots/roots.h، حيث تُرتب هذه الكائنات في الذاكرة بشكل متجاور. بمجرد كشف الكائنات الأصلية التي لا ينبغي تسريبها إلى JavaScript، يمكن تنفيذ أي كود داخل الصندوق الرمل.
للتحقق من هذه الطريقة، يمكن تعديل دالة V8 الأصلية لكشف Uninitialized Oddball إلى JavaScript. يمكن تعديل الإزاحة بالنسبة لـ isolate في دالة %TheHole().
الكود الأساسي لهذه الطريقة الملتفة كما يلي:
جافا سكريبت الدالة read(obj ، prop) { عودة obj[prop] }
دع uninitialized_oddball = ٪ TheHole() ؛ دع arr = [1.1 ، 2.2 ، 3.3] ؛
ل (let أنا = 0 ؛ أنا < 100000 ؛ i++) { اقرأ(arr، 0);
}
دع القيمة = قراءة ( غير مهيأة_غريبة، 0)؛ console.log(val);
في V8 11.0.0، عند اختبار %TheHole() وعند إرجاع UninitializedOddball، لا يزال يمكن تحقيق قراءة نسبية عشوائية.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel](https://img-cdn.gateio.im/webp-social/moments-263e5651876fc00c4e0af0cfcd350210.webp019283746574839201
التجميع الرئيسي لدالة read المحسّنة كما يلي:
0x558b20004086 MOV R11 ، RDI 0x558b20004089 movzx edi ، بايت PTR [R11 + 0xb] 0x558b2000408d CMP EDI ، 0x81 0x558b20004093 JNZ 0x558b200040d8 0x558b20004095 MOV R9 ، Qword PTR [R11 + 0xf] 0x558b20004099 اختبار esi,esi 0x558b2000409b JS 0x558b200040d8 0x558b2000409d movsxd r11 ، esi 0x558b200040a0 CMP R11 ، Qword PTR [R9 + 0xf] 0x558b200040a4 جاي 0x558b200040d8 0x558b200040a6 vmovsd xmm0 ، [R9 + R11 * 8 + 0x7]
عند تمرير uninitialized_oddball، ابدأ من 0x558b20004086 كنقطة انطلاق لـ obj، وأكمل القراءة العشوائية في تعليمة vmovsd، حيث يتم تخزين البيانات في سجل xmm0.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-26c26345e3ec4effeea2e3e6b7cd8772.webp019283746574839201
الطريقة المقترحة للإصلاح هي إضافة فحص لمصفوفة map عند إرجاع عناصر المصفوفة من الدالة المحسّنة، لتجنب حساب الإزاحة مباشرةً لإرجاع قيم المصفوفة.
من الجدير بالذكر أن بعض البرمجيات لا تزال لم تصلح هذه الثغرة. طريقة الاستغلال على منصة x86 تختلف قليلاً، حيث أنه لا يوجد ضغط للعناوين، فإن القراءة والكتابة العشوائية تكون بالنسبة للعملية بأكملها. حتى مع تفعيل ASLR، لا يزال هناك احتمال كبير لقراءة وكتابة المحتوى المستهدف بسبب حجم الملف الكبير.
أسلوب التحايل الجديد هذا قد خفض بشكل كبير من صعوبة استغلال الثغرات المماثلة السابقة. يُنصح بإعادة تقييم جميع الثغرات التي تسرب uninitialized_oddball.
توجد أيضًا قيم Sentinel أخرى في V8، والتي قد تؤدي إلى مشاكل مماثلة. وهذا يقدم لنا الفهم التالي:
هل من السهل أيضًا تنفيذ V8 RCE مع تسريبات uninitialized_Oddball الأخرى.
لا يزال هناك جدل حول ما إذا كان ينبغي اعتبار هذه القضايا رسمياً كمسائل أمنية.
هل يجب إضافة قيمة Sentinel كمتغير في Fuzzer لاكتشاف أدوات الاستغلال الجديدة.
بغض النظر عن ذلك، ستؤدي هذه الأنواع من المشاكل إلى تقليص الفترة الزمنية التي يحتاجها القراصنة لتحقيق الاستغلال الكامل بشكل كبير.
! الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel](https://img-cdn.gateio.im/webp-social/moments-0e52075003a8ee2ca492a5fc9f35c36b.webp019283746574839201
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-230537e420d579aabd89bdd168b20878.webp(
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-506159c94c9e0988552cbcbd13d971e1.webp(
![كشف حصري عن كيفية تجاوز حماية Chrome v8 من خلال تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-e9e2000fd501b69ee3ee643a459a26dd.webp(