ثغرة في كيرنل لينكس 2.6.30 تعطي المستخدم صلاحيّات جذر
انتشر كود يستغل ثغرة في كيرنل لينكس 2.6.30 تسمح للمستخدم بتخطي الصلاحيات المحددة له والحصول على صلاحيّات جذر حتى في حال وجود SELinux , LSM , AppArmor. المثير في هذه الثغرة أنّ الكود لا يظهر أي خطأ ولا يمكن اكتشافها إلّا بعد عمل تجميع (Compile) للكود المصدري لكيرنل لينكس!
الكود الذي يحتوي الثغرة موجود في تطبيق /dev/net/tun.
struct sock *sk = tun->sk; // initialize sk with tun->sk…
if (!tun)
return POLLERR; // if tun is NULL return error
المطور في الكود أعلاه قام بتهيئة المتغير sk لقيمة يمكن أن تكون NULL. ثم يقوم بفحص القيمة بعد ذلك بعدّة أسطر فإذا كانت 0 (NULL) سوف يقوم بإرجاع خطأ.
هذا الكود سوف يظهر صحيح… ولكن حين يبدأ المجمع بالعمل سيرى أن المتغير قد تمّ تهيئته وبالتالي فهو لا يقرأ الجملة الشرطيّة بل سيزيلها من الكود الناتج. بعبارة أخرى المجمع هو من يقوم بخلق هذه الثغرة والتي ليس لها وجود في كود المصدر. هذا سيجعل الكيرنل تقوم بمحاولة قراءة/كنابة من 0x00000000 والذي من خلاله يمكن للمهاجم نقله لأرضية المستخدم ومن ثمّ السيطرة على النّظام.
فيديو يوضّح تنفيذ الثغرة:
{flv}Linux_2.6.30_Local_Kernel_Exploit_0day_disabling_SELinux_AppArmor_LSM{/flv}
الحل لهذه الثغرة سهل نسبيّاً حيث يمكن تعديل الكود و وضع الجملة الشرطية قبل اعطاء القيمة لـ sk.
للاطلاع على ترقيع الثغرة: Kernel patchwork
لمزيد من المعلومات والاطلاع على الاستغلال: Milw0rm-9191
عن الكاتب:
باحث عن المعرفة, طالب ماجستير باحث في أمن المعلومات و مدوّن يهتم في العديد من الجالات المتعلّقة بالشبكات, الحماية والأنظمة المفتوحة المصدر.
شكرا على الشرح أخي
لكن الثغرة ليست في نواة لينوكس بل يسببها تحسين (optimization) في المصنف gcc أثناء بناء النواة، حيث أن بعض التوزيعات لم تصب بالثغرة
بالتوفيق