استكشاف استخدام قيمة Sentinel لتجاوز آلية حماية Chrome V8
قيمة Sentinel هي قيمة خاصة في الخوارزميات، وتستخدم عادة كشرط لإنهاء الحلقات أو خوارزميات التكرار. توجد أنواع متعددة من قيمة Sentinel في شفرة مصدر Chrome. أظهرت الأبحاث السابقة أنه يمكن تحقيق تنفيذ رموز عشوائية داخل الصندوق الرملي لبعض CVE من خلال تسريب كائن TheHole. قام فريق Google بتحديث CVE ذات الصلة على GitHub بسرعة بعد حوالي أسبوع من نشرنا لتوضيح كيفية تجاوز هذا التخفيف.
يمكن رؤية إصلاح التخفيف من تنفيذ التعليمات البرمجية العشوائية بسبب كائن TheHole في شفرة مصدر Chrome. ولكن في الواقع، لا تزال هناك العديد من الكائنات الأصلية الأخرى في V8 لا ينبغي أن تتسرب إلى JS. ستناقش هذه المقالة كائن Uninitialized Oddball، الذي ظهرت طريقة تجاوزها لأول مرة في Issue1352549. من الجدير بالذكر أن هذه الطريقة لا تزال قابلة للاستخدام في أحدث إصدار من V8، ولم تقم Google بإصلاحها بعد.
تتميز هذه الطريقة بعمومية قوية:
Issue1216437(CVE-2021-30551) هو أول POC تم تقديمه والذي يكشف عن internal uninitialized oddball.
Issue1314616(CVE-2022-1486) في POC أيضًا كشفت مباشرة عن UninitializedOddball.
لا يمكن تجاهل تأثير Issue1352549(NoCVE).
كل هذه الأمور توضح الحاجة الملحة لإعادة تقييم البرمجيات التي قد تتأثر بـ PatchGap.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel](https://img-cdn.gateio.im/webp-social/moments-263e5651876fc00c4e0af0cfcd350210.webp019283746574839201
قيمة السنتينيل في V8
يتم تعريف معظم الكائنات الأصلية لـ V8 في ملف v8/src/roots/roots.h، وهي مرتبة بشكل متجاور في الذاكرة. بمجرد أن يتم تسريب هذه الكائنات الأصلية التي لا ينبغي تسريبها إلى JavaScript، قد يؤدي ذلك إلى تنفيذ أي كود داخل الصندوق الرمل.
للتحقق من فعالية هذه الطريقة في الإصدار الأحدث من V8، يمكننا تعديل الدالة الأصلية في V8 %TheHole)( لجعلها ترجع Uninitialized Oddball.
![كشف حصري حول كيفية تجاوز حماية Chrome v8 من خلال تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-26c26345e3ec4effeea2e3e6b7cd8772.webp(
تجاوز HardenType
تم تقديم الكود الكامل في Issue1352549، وبعد استخراجنا له وتبسيطه، لا يزال يمكن تحقيق القراءة النسبية العشوائية في V8 11.0.0.
من خلال تفكيك دالة القراءة في JavaScript المحسّنة، يمكن رؤية أنه عند فحص obj.prop، لم يتم فحص القيمة التي تحمل المفتاح obj.prop، بل تم حساب الإزاحة مباشرة وفقًا للمعنى الدلالي لـ JavaScript للحصول على قيمة المصفوفة. وهذا أدى إلى حدوث اختلاط في الأنواع أثناء الحساب، مما يحقق القراءة العشوائية.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-4c091ca0e153e953eb168e99762ff7cc.webp(
عند تمرير uninitialized_oddball، يتم حسابه انطلاقًا من obj، ويتم إكمال القراءة العشوائية في تعليمات vmovsd xmm0,[r9+r11*8+0x7]، ويتم حفظ البيانات في مسجل xmm0.
نظرًا لأن uninitialized_oddball يتم ترتيبها في ذاكرة V8 بشكل مبكر وأكثر بدائية، فإن التزوير أسهل، وهي الطريقة المفضلة للتجاوز. يمكن الرجوع إلى تحليل البناء لكتابة عشوائية في Issue1352549.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-1e3fda77c04bceafdcc40413824a5d37.webp019283746574839201
الاقتراح لإصلاح المشكلة هو إضافة فحص للـ map الخاص بالمصفوفة عند إرجاع عناصر المصفوفة من الدالة المحسّنة، لتجنب حساب الإزاحة مباشرةً لإرجاع قيم المصفوفة.
تحذير PatchGap
بعد تحليل Issue1352549، قمنا بفحص البرامج التي قد تحتوي على PatchGap، ووجدنا أن Skype لم يصلح هذه الثغرة حتى الآن. القراءة والكتابة العشوائية تحت x86 تختلف قليلاً، حيث لا توجد ضغط عناوين، بل هي مباشرة بالنسبة للعملية بأكملها.
في استخدام Skype، على الرغم من تفعيل ASLR، إلا أن حجم الملف الكبير يجعل القراصنة قادرين على القراءة والكتابة على عنوان ثابت، مما يزيد من احتمالية قراءة وكتابة محتوى ملف Skype. من خلال دمج تحليل PE وغيرها من الأفكار التقليدية، ليس من الصعب إكمال سلسلة استغلال الثغرات.
تتعلق هذه المرة PatchGap ليس فقط بـ Issue1352549، بل أدى الكشف عن طريقة التحايل الجديدة أيضًا إلى تقليل صعوبة الاستغلال بشكل كبير، مثل Issue1314616 و Issue1216437. يمكن للقراصنة تحقيق استغلال كامل لأي ثغرة سابقة تسرب uninitialized_oddball تقريبًا دون أي تكلفة بحث.
ملخص
تتناول هذه المقالة بإيجاز كيفية تحقيق القراءة العشوائية من خلال تسرب uninitialized_Oddball. هناك العديد من القيم Sentinel الأخرى في V8، ومن السهل أيضًا مواجهة أعطال غير int3 أثناء الاختبار. نظرًا لأن Uninitialized_Oddball و TheHole يمكن أن يتجاوزا حماية V8، فقد تكون هناك مشكلات مماثلة مع قيم Sentinel الأخرى.
هذا يمنحنا بعض الإلهام:
هل يمكن أيضًا تحقيق RCE لـ V8 بسهولة من خلال تسرب uninitialized_Oddball آخر.
قامت جوجل بإصلاح TheHole بسرعة، ولكن قضية استغلال جمع القمامة لتجاوز ASLR تم تركها لفترة طويلة، مما يوضح أن ما إذا كانت القضايا المماثلة تُعتبر مشكلة أمان رسمية لا يزال هناك حدود غير واضحة.
إذا اعتُبر ذلك مشكلة أمان رسمية، هل من الضروري في الفازر أخذ قيم Sentinel مثل %TheHole/uninitialized_Oddball في الاعتبار كمتغيرات لإخراج استغلالات أخرى.
بغض النظر عما إذا كانت هذه الأنواع من المشكلات تعتبر رسمياً مشكلات أمنية أم لا، فإنها ستقصر بشكل كبير من فترة استغلال القراصنة بالكامل.
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.
استكشاف ثغرة قيمة سيتينيل في محرك V8: تجاوز الحماية لتنفيذ أي كود
استكشاف استخدام قيمة Sentinel لتجاوز آلية حماية Chrome V8
قيمة Sentinel هي قيمة خاصة في الخوارزميات، وتستخدم عادة كشرط لإنهاء الحلقات أو خوارزميات التكرار. توجد أنواع متعددة من قيمة Sentinel في شفرة مصدر Chrome. أظهرت الأبحاث السابقة أنه يمكن تحقيق تنفيذ رموز عشوائية داخل الصندوق الرملي لبعض CVE من خلال تسريب كائن TheHole. قام فريق Google بتحديث CVE ذات الصلة على GitHub بسرعة بعد حوالي أسبوع من نشرنا لتوضيح كيفية تجاوز هذا التخفيف.
يمكن رؤية إصلاح التخفيف من تنفيذ التعليمات البرمجية العشوائية بسبب كائن TheHole في شفرة مصدر Chrome. ولكن في الواقع، لا تزال هناك العديد من الكائنات الأصلية الأخرى في V8 لا ينبغي أن تتسرب إلى JS. ستناقش هذه المقالة كائن Uninitialized Oddball، الذي ظهرت طريقة تجاوزها لأول مرة في Issue1352549. من الجدير بالذكر أن هذه الطريقة لا تزال قابلة للاستخدام في أحدث إصدار من V8، ولم تقم Google بإصلاحها بعد.
تتميز هذه الطريقة بعمومية قوية:
Issue1216437(CVE-2021-30551) هو أول POC تم تقديمه والذي يكشف عن internal uninitialized oddball.
Issue1314616(CVE-2022-1486) في POC أيضًا كشفت مباشرة عن UninitializedOddball.
لا يمكن تجاهل تأثير Issue1352549(NoCVE).
كل هذه الأمور توضح الحاجة الملحة لإعادة تقييم البرمجيات التي قد تتأثر بـ PatchGap.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel](https://img-cdn.gateio.im/webp-social/moments-263e5651876fc00c4e0af0cfcd350210.webp019283746574839201
قيمة السنتينيل في V8
يتم تعريف معظم الكائنات الأصلية لـ V8 في ملف v8/src/roots/roots.h، وهي مرتبة بشكل متجاور في الذاكرة. بمجرد أن يتم تسريب هذه الكائنات الأصلية التي لا ينبغي تسريبها إلى JavaScript، قد يؤدي ذلك إلى تنفيذ أي كود داخل الصندوق الرمل.
للتحقق من فعالية هذه الطريقة في الإصدار الأحدث من V8، يمكننا تعديل الدالة الأصلية في V8 %TheHole)( لجعلها ترجع Uninitialized Oddball.
![كشف حصري حول كيفية تجاوز حماية Chrome v8 من خلال تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-26c26345e3ec4effeea2e3e6b7cd8772.webp(
تجاوز HardenType
تم تقديم الكود الكامل في Issue1352549، وبعد استخراجنا له وتبسيطه، لا يزال يمكن تحقيق القراءة النسبية العشوائية في V8 11.0.0.
من خلال تفكيك دالة القراءة في JavaScript المحسّنة، يمكن رؤية أنه عند فحص obj.prop، لم يتم فحص القيمة التي تحمل المفتاح obj.prop، بل تم حساب الإزاحة مباشرة وفقًا للمعنى الدلالي لـ JavaScript للحصول على قيمة المصفوفة. وهذا أدى إلى حدوث اختلاط في الأنواع أثناء الحساب، مما يحقق القراءة العشوائية.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-4c091ca0e153e953eb168e99762ff7cc.webp(
عند تمرير uninitialized_oddball، يتم حسابه انطلاقًا من obj، ويتم إكمال القراءة العشوائية في تعليمات vmovsd xmm0,[r9+r11*8+0x7]، ويتم حفظ البيانات في مسجل xmm0.
نظرًا لأن uninitialized_oddball يتم ترتيبها في ذاكرة V8 بشكل مبكر وأكثر بدائية، فإن التزوير أسهل، وهي الطريقة المفضلة للتجاوز. يمكن الرجوع إلى تحليل البناء لكتابة عشوائية في Issue1352549.
! [الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel])https://img-cdn.gateio.im/webp-social/moments-1e3fda77c04bceafdcc40413824a5d37.webp019283746574839201
الاقتراح لإصلاح المشكلة هو إضافة فحص للـ map الخاص بالمصفوفة عند إرجاع عناصر المصفوفة من الدالة المحسّنة، لتجنب حساب الإزاحة مباشرةً لإرجاع قيم المصفوفة.
تحذير PatchGap
بعد تحليل Issue1352549، قمنا بفحص البرامج التي قد تحتوي على PatchGap، ووجدنا أن Skype لم يصلح هذه الثغرة حتى الآن. القراءة والكتابة العشوائية تحت x86 تختلف قليلاً، حيث لا توجد ضغط عناوين، بل هي مباشرة بالنسبة للعملية بأكملها.
في استخدام Skype، على الرغم من تفعيل ASLR، إلا أن حجم الملف الكبير يجعل القراصنة قادرين على القراءة والكتابة على عنوان ثابت، مما يزيد من احتمالية قراءة وكتابة محتوى ملف Skype. من خلال دمج تحليل PE وغيرها من الأفكار التقليدية، ليس من الصعب إكمال سلسلة استغلال الثغرات.
تتعلق هذه المرة PatchGap ليس فقط بـ Issue1352549، بل أدى الكشف عن طريقة التحايل الجديدة أيضًا إلى تقليل صعوبة الاستغلال بشكل كبير، مثل Issue1314616 و Issue1216437. يمكن للقراصنة تحقيق استغلال كامل لأي ثغرة سابقة تسرب uninitialized_oddball تقريبًا دون أي تكلفة بحث.
ملخص
تتناول هذه المقالة بإيجاز كيفية تحقيق القراءة العشوائية من خلال تسرب uninitialized_Oddball. هناك العديد من القيم Sentinel الأخرى في V8، ومن السهل أيضًا مواجهة أعطال غير int3 أثناء الاختبار. نظرًا لأن Uninitialized_Oddball و TheHole يمكن أن يتجاوزا حماية V8، فقد تكون هناك مشكلات مماثلة مع قيم Sentinel الأخرى.
هذا يمنحنا بعض الإلهام:
هل يمكن أيضًا تحقيق RCE لـ V8 بسهولة من خلال تسرب uninitialized_Oddball آخر.
قامت جوجل بإصلاح TheHole بسرعة، ولكن قضية استغلال جمع القمامة لتجاوز ASLR تم تركها لفترة طويلة، مما يوضح أن ما إذا كانت القضايا المماثلة تُعتبر مشكلة أمان رسمية لا يزال هناك حدود غير واضحة.
إذا اعتُبر ذلك مشكلة أمان رسمية، هل من الضروري في الفازر أخذ قيم Sentinel مثل %TheHole/uninitialized_Oddball في الاعتبار كمتغيرات لإخراج استغلالات أخرى.
بغض النظر عما إذا كانت هذه الأنواع من المشكلات تعتبر رسمياً مشكلات أمنية أم لا، فإنها ستقصر بشكل كبير من فترة استغلال القراصنة بالكامل.
! الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel
! الكشف الحصري عن تجاوز Chrome v8 HardenProtect عن طريق تسريب قيمة Sentinel