استغلال المراجع الفارغة في نواة لينكس
أُعلن مؤخرًا أن باحثين من فريق مشروع جوجل زيرو قد طوروا طريقة لاستغلال الثغرات الأمنية في نواة لينكس الناتجة عن إلغاء مرجعية المؤشر الفارغ.
حتى الآن، لم تحظ مشاكل النواة المتعلقة بإلغاء مرجعية المؤشر الفارغ بالاهتمام الكافي ، حيث كان يعتبر من غير الواقعي تحويل هذه المشاكل إلى هجمات تؤدي إلى تصعيد الامتيازات أو تنفيذ التعليمات البرمجية الخاصة (يحظر تعيين العمليات غير المميزة إلى المنطقة الأدنى من مساحة العناوين).
كقاعدة عامة، تؤدي هذه الأخطاء إلى توليد تحذيرات oops بواسطة النواة، وبعد ذلك يتم إكمال المهام الإشكالية واستعادة الحالة دون الحاجة إلى إيقاف النظام.
تعتمد طريقة الهجوم الجديدة على معالجة حالات "oops" ، والتي يمكن أن تؤدي إلى زيادة في قيمة عداد المرجع (refcount)، مما قد يتسبب بدوره في تجاوز العداد وتحرير الذاكرة المرتبطة بـ refcount.
في هذه الحالة ، يتم تقليل الاستغلال إلى عمليات التلاعب النموذجية للهجمات الخالية من الاستخدام (تنشأ حالة يصبح فيها العدد المرجعي للكائن صفراً ، ويتم تحرير الذاكرة ، ولكن في الواقع توجد روابط عمل تشير إلى الذاكرة المحررة).
حالياً، عندما يتسبب نظام لينكس في حدوث خطأ في الوصول إلى قيمة فارغة من داخل سياق عملية ما، فإنه يُولّد خطأً من نوع oops ، وهو يختلف عن حالة الذعر التي تحدث عندما يُدرك النظام أنه لا توجد طريقة آمنة لمواصلة التنفيذ، وبالتالي يجب عليه إيقاف جميع العمليات. أما في حالة oops، فلا يُوقف النظام جميع العمليات؛ بل يُحاول استعادة الوضع بأفضل ما يُمكنه، ثم يُواصل التنفيذ.
يتم استخدام إلغاء الإشارة إلى مؤشر NULL هنا كطريقة لإنشاء حالة "oops" بطريقة مضبوطة. تكمن المشكلة في أن الأمر يتطلب 232 مكالمة حالة "عفوًا" للوصول إلى تجاوز refcount 32 بت.
من الناحية العملية، يتطلب تنفيذ هجوم باستخدام الثغرة المقترحة حوالي ثمانية أيام من التوليد المستمر لحالات خارجة عن مكانها (OOP). وفي حال نجاح الهجوم، تسمح لك الثغرة بتنفيذ التعليمات البرمجية على مستوى نواة النظام.
تم إصلاح إشارة مرجعية مؤشر NULL المستخدمة في الاستغلال في أكتوبر ، ولكن نظرًا لأن المشكلات المماثلة ليست شائعة وتم التعامل معها سابقًا على أنها أخطاء وليست ثغرات أمنية ، سيضيف المطورون حماية عامة إلى Linux kernel لمنع الهجمات التي تتلاعب بتوليد "oops . "
في حالة المهمة ، هذا يعني تجاهل مكدس النواة الحالي والانتقال مباشرة إلى make_task_dead الذي يستدعي do_exit. ستنشر kernel أيضًا إلى dmesg سجل "تعطل" وتتبع kernel يوضح الحالة التي كانت فيها النواة عند حدوث الخطأ. قد يبدو هذا اختيارًا غريبًا عند حدوث تلف في الذاكرة بشكل واضح ؛ ومع ذلك ، فإن الهدف هو تسهيل اكتشاف أخطاء kernel وتسجيلها وفقًا لفلسفة أن نظام التشغيل أسهل بكثير في تصحيح الأخطاء من النظام السفلي.
يتضمن إصدار النواة 6.2 على وجه الخصوص تغييرات للحد من الحد الأقصى لعدد الأخطاء (oops) . بعد الوصول إلى الحد الأقصى، والذي يبلغ 10 خطأ افتراضيًا (يمكنك تغييره باستخدام المعامل oops_limit إذا رغبت في ذلك)، ستبدأ النواة بالانتقال إلى حالة "الذعر"، متبوعة بإعادة تشغيل، مما لن يسمح بعدد التكرارات المطلوبة لإعادة ضبط عداد المراجع إلى الصفر.
من المخطط أيضًا نقل التقييد إلى فروع kernel التي تم إصدارها مسبقًا ، ولكنها لا تزال مدعومة ، بالإضافة إلى حزم kernel للتوزيعات الشائعة.
وأخيرًا، إذا كنت مهتمًا بمعرفة المزيد عن هذا الموضوع ، يمكنك العثور على التفاصيل في الرابط التالي.