
CVE-2023-6931 إثبات مفهوم ذعر النواة
إثبات اختراق لتعطل النواة (Kernel Panic) لـ CVE-2023-6931
CVE-2023-6931 هي ثغرة في perf_event تؤدي إلى تجاوز سعة مخزن مؤقت في الكومة (heap buffer overflow) ناتج عن تجاوز عدد صحيح في read_size لمجموعة.
perf_events هو إطار لمراقبة وتحليل الأداء يوفره نواة لينكس. يتيح هذا الإطار تتبع مختلف البيانات المتعلقة بالأداء الناتجة عن مكونات العتاد والبرمجيات.
perf_event_open
واجهة تسمح لمساحة المستخدم بتكوين والتحكم في أحداث الأداء داخل النواة.
يُستخدم لإنشاء أو تجميع أو التحكم أو قراءة البيانات من الأحداث./proc/sys/kernel/perf_event_paranoid 1 أو أقل.ulimit -n.CONFIG_PERF_EVENTS.تنشأ الثغرة بسبب تجاوز عدد صحيح في read_size لمجموعة. تؤدي الدالة perf_event_validate_size عملية التحقق من صحة read_size. ومع ذلك، فإن الطريقة التي يتم بها التحقق من read_size تتحقق فقط من read_size للحدث الحالي.
النقطة الأساسية هي أنه خلال كل عملية تحقق، يتم التحقق فقط من الحدث الحالي، بينما لا يتم التحقق من الأحداث السابقة. إذا تم تعيين PERF_FORMAT_GROUP لقائد المجموعة، فإن مجرد إضافة حدث حالي يمكن أن يزيد من read_size لقائد المجموعة.
يؤدي هذا في النهاية إلى حدوث مشكلة في perf_read_group. يعتمد حساب event->read_size على read_format لقائد المجموعة، مضروبًا في nr_siblings. نظرًا لأن متغير read_size هو u16 بحجم 2 بايت، فإن القيمة القصوى التي يمكنه تخزينها هي 0xffff.
لاستغلال ذلك، يقوم المهاجم أولاً بإنشاء حدث قائد مجموعة مع تعيين جميع خيارات read_format الممكنة. بعد ذلك، يتم إنشاء العديد من أحداث الأشقاء. تقوم هذه الأشقاء فقط بتعيين PERF_FORMAT_TOTAL_TIME_RUNNING في read_format لضمان عدم وجود مشكلات في التحقق في perf_event_validate_size. ونتيجة لذلك، تصبح قيمة nr_siblings كبيرة جدًا، ولكن نظرًا لأن كل حدث شقيق يجتاز التحقق بشكل فردي، فلا توجد مشكلات في هذه المرحلة.
عندما يتم استدعاء perf_read_group في هذه الحالة، يستمر read_size لقائد المجموعة في الزيادة لأنه تم تعيين PERF_FORMAT_GROUP. في النهاية، يؤدي هذا إلى تجاوز عدد صحيح، ويقوم kzalloc بتخصيص مخزن مؤقت صغير جدًا. ومع ذلك، نظرًا لأن العدد الفعلي للأحداث كبير جدًا، يحدث تجاوز سعة مخزن مؤقت في الكومة (heap buffer overflow)، مما يؤدي إلى تعطل النواة (kernel panic).