نتج عن الإصلاح المتهور إصلاحًا غير كامل لثغرة Specter في نواة Linux

مطورو مشروع Grsecurity مشترك حكاية تحذيرية توضح كيف أن الإزالة غير المدروسة لتحذيرات المترجم يمكن أن تؤدي إلى ثغرات أمنية في التعليمات البرمجية. في نهاية شهر مايو، تم اقتراح إصلاح لنواة Linux لناقل جديد لاستغلال ثغرة Spectre من خلال استدعاء نظام ptrace.

أثناء اختبار التصحيح، لاحظ المطورون أنه عند البناء، يعرض المترجم تحذيرًا بشأن خلط التعليمات البرمجية والتعريفات (تم تعريف البنية بعد التعليمات البرمجية، وتعيين قيمة لمتغير موجود):

مؤشر كثافة العمليات = ن؛
إذا (n < HBP_NUM) {index = array_index_nospec(index, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

قبلت لينوس تصحيح إلى فرعك الرئيسي، بعد أن تخلصت من من التحذير عن طريق نقل تعريف المتغير إلى كتلة if:

إذا (n < HBP_NUM) { int Index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

في يوليو، تم نقل الإصلاح أيضًا إلى فروع النواة المستقرة 4.4 و4.9 و4.14 و4.19 و5.2. واجه مشرفو الفروع المستقرة أيضًا التحذير، وبدلاً من التحقق لمعرفة ما إذا كان قد تم إصلاحه بالفعل في فرع لينوس الرئيسي، قاموا بإجراء الإصلاح بأنفسهم. المشكلة هي أنه من دون التفكير حقًا في الأمر، فإنهم فقط انتقل تحديد البنية لأعلى، بحيث لم يعد يتم استخدام استدعاء array_index_nospec، الذي يوفر الحماية مباشرة ضد الثغرة الأمنية، عند تحديد البنية، وبدلاً من المتغير "index"، يتم استخدام المتغير "n" دائمًا:

مؤشر كثافة العمليات = ن؛
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
الفهرس = array_index_nospec(index, HBP_NUM);

المصدر: opennet.ru

إضافة تعليق