ثغرة أمنية في نظام Linux kernel ورفض الخدمة في systemd

كشف باحثون أمنيون من شركة Qualys تفاصيل عن اثنتين من نقاط الضعف التي تؤثر على Linux kernel ومدير النظام systemd. تسمح الثغرة الأمنية الموجودة في النواة (CVE-2021-33909) للمستخدم المحلي بتنفيذ التعليمات البرمجية باستخدام حقوق الجذر من خلال معالجة الدلائل المتداخلة للغاية.

ويتفاقم خطر الثغرة الأمنية بسبب حقيقة أن الباحثين تمكنوا من إعداد برامج استغلال تعمل على Ubuntu 20.04/20.10/21.04 وDebian 11 وFedora 34 في التكوين الافتراضي. تجدر الإشارة إلى أن التوزيعات الأخرى لم يتم اختبارها، ولكنها من الناحية النظرية عرضة للمشكلة ويمكن مهاجمتها. تم الوعد بنشر التعليمات البرمجية الكاملة للثغرات بعد القضاء على المشكلة في كل مكان، ولكن في الوقت الحالي لا يتوفر سوى نموذج أولي ذو وظائف محدودة، مما يتسبب في تعطل النظام. المشكلة موجودة منذ يوليو 2014 وتؤثر على إصدارات النواة بدءًا من 3.16. تم تنسيق إصلاح الثغرة الأمنية مع المجتمع وتم قبوله في النواة في 19 يوليو. لقد قامت التوزيعات الرئيسية بالفعل بإنشاء تحديثات لحزم النواة الخاصة بها (Debian، وUbuntu، وFedora، وRHEL، وSUSE، وArch).

سبب الثغرة الأمنية هو الفشل في التحقق من نتيجة تحويل size_t إلى int قبل تنفيذ العمليات في كود seq_file، الذي يقوم بإنشاء ملفات من سلسلة من السجلات. قد يؤدي الفشل في التحقق إلى كتابة خارج الحدود إلى المخزن المؤقت عند إنشاء بنية دليل متداخلة للغاية وتركيبها وحذفها (حجم المسار أكبر من 1 جيجابايت). ونتيجة لذلك، يمكن للمهاجم الحصول على سلسلة من 10 بايت "//deleted" مكتوبة بإزاحة "-2 جيجا بايت - 10 بايت" تشير إلى المنطقة التي تسبق المخزن المؤقت المخصص مباشرة.

يتطلب الاستغلال المجهز 5 غيغابايت من الذاكرة ومليون رمز دخول مجاني للعمل. يعمل هذا الاستغلال عن طريق استدعاء mkdir() لإنشاء تسلسل هرمي يضم حوالي مليون دليل فرعي لتحقيق حجم مسار ملف يتجاوز 1 جيجابايت. يتم تثبيت هذا الدليل عبر bind-mount في مساحة اسم مستخدم منفصلة، ​​وبعد ذلك يتم تشغيل وظيفة rmdir() لإزالته. بالتوازي، يتم إنشاء مؤشر ترابط يقوم بتحميل برنامج eBPF صغير، والذي تم حظره في المرحلة بعد التحقق من الكود الزائف لـ eBPF، ولكن قبل تجميع JIT الخاص به.

في مساحة اسم معرف المستخدم غير المميز، يتم فتح الملف /proc/self/mountinfo وتتم قراءة اسم المسار الطويل للدليل المثبت على الربط، مما يؤدي إلى كتابة السلسلة "//deleted" في المنطقة قبل بدء المخزن المؤقت. يتم اختيار موضع كتابة السطر بحيث يحل محل التعليمات الموجودة في برنامج eBPF الذي تم اختباره بالفعل ولكن لم يتم تجميعه بعد.

بعد ذلك، على مستوى برنامج eBPF، يتم تحويل الكتابة غير المنضبطة خارج المخزن المؤقت إلى قدرة خاضعة للرقابة على القراءة والكتابة إلى بنيات kernel الأخرى من خلال معالجة بنيات btf وmap_push_elem. ونتيجة لذلك، تحدد الثغرة موقع المخزن المؤقت modprobe_path[] في ذاكرة kernel وتستبدل المسار "/sbin/modprobe" فيه، مما يسمح لك ببدء تشغيل أي ملف قابل للتنفيذ بحقوق الجذر في حالة وجود استدعاء request_module()، الذي يتم تنفيذه، على سبيل المثال، عند إنشاء مقبس netlink.

يقدم الباحثون العديد من الحلول التي تكون فعالة فقط لاستغلال معين، ولكنها لا تقضي على المشكلة نفسها. يوصى بتعيين "/proc/sys/kernel/unprivileged_userns_clone" على 0 لتعطيل أدلة التثبيت في مساحة اسم معرف مستخدم منفصلة، ​​و"/proc/sys/kernel/unprivileged_bpf_disabled" على 1 لتعطيل تحميل برامج eBPF في kernel.

من الجدير بالذكر أنه أثناء تحليل هجوم بديل يتضمن استخدام آلية FUSE بدلاً من bind-mound لتركيب دليل كبير، واجه الباحثون ثغرة أمنية أخرى (CVE-2021-33910) تؤثر على مدير نظام systemd. اتضح أنه عند محاولة تحميل دليل بحجم مسار يتجاوز 8 ميجابايت عبر FUSE، تنفد ذاكرة المكدس من عملية تهيئة التحكم (PID1) وتتعطل، مما يضع النظام في حالة "ذعر".

المشكلة هي أن systemd يتتبع ويوزع محتويات /proc/self/mountinfo، ويعالج كل نقطة تحميل في وظيفة Unit_name_path_escape()، التي تنفذ عملية strdupa() التي تضع البيانات على المكدس بدلاً من الذاكرة المخصصة ديناميكيًا . نظرًا لأن الحد الأقصى لحجم المكدس محدود عبر RLIMIT_STACK، فإن معالجة مسار كبير جدًا إلى نقطة التثبيت يؤدي إلى تعطل عملية PID1 وإيقاف النظام. بالنسبة للهجوم، يمكنك استخدام أبسط وحدة FUSE مع استخدام دليل متداخل للغاية كنقطة تحميل، يتجاوز حجم مسارها 8 ميجابايت.

ظهرت المشكلة منذ إصدار systemd 220 (أبريل 2015)، وتم حلها بالفعل في مستودع systemd الرئيسي وتم إصلاحها في التوزيعات (Debian، وUbuntu، وFedora، وRHEL، وSUSE، وArch). والجدير بالذكر أنه في الإصدار 248 من نظام systemd، لا يعمل الاستغلال بسبب خطأ في كود النظام الذي يتسبب في فشل معالجة /proc/self/mountinfo. ومن المثير للاهتمام أيضًا أنه في عام 2018، ظهر موقف مماثل، وعند محاولة كتابة استغلال للثغرة الأمنية CVE-2018-14634 في Linux kernel، صادف باحثو Qualys ثلاث ثغرات حرجة في systemd.

المصدر: opennet.ru

إضافة تعليق