
استغلال نواة لينكس
تصعيد صلاحيات في لينكس يستغل استدعاء النظام waitid. يُقدَّم لك هذا الاستغلال من قِبل @XeR_0x2A و@chaign_c من HexpressoTeam لأغراض تعليمية فقط.
أُدخلت الثغرة في 2017-05-21 وأُصلحت في 2017-10-09؛ النسخة 4.14.0-rc4+ معروفة بأنها قابلة للاستغلال.
إذا كان مستواك في كتابة الاستغلال مبتدئًا أو متوسطًا، فنحن نشجعك على استغلالها بنفسك قبل قراءة تنفيذنا. إنها تمرين جيد جدًا مع بدائية استغلال سهلة (كتابة عشوائية إلى ذاكرة نواة قابلة للكتابة).
كما نتحدى @LiveOverflow أن يجرّبها.
إليك الوصف:
oss-security:
مرحبًا،اكتشف كريس سالز أنه عندما تمت إعادة هيكلة استدعاء النظام waitid() في نواة لينكس
الإصدار v4.13، توقف عن التحقق بالصدفة من أن
الوسيط المدخل يشير إلى مساحة المستخدم. سمح هذا للمهاجمين المحليين
بالكتابة مباشرة إلى ذاكرة النواة، مما قد يؤدي إلى
تصعيد الصلاحيات.أُدخلت بهذا الالتزام:
https://git.kernel.org/linus/4c48abe91be03d191d0c20cc755877da2cb35622أُصلحت بهذا الالتزام في الشجرة الرئيسية:
https://git.kernel.org/linus/96ca579a1ecc943b75beba58bebb0356f6cc4b51من المفترض أن يتم إصلاح هذا في النسخة المستقرة -stable (القادمة v4.13.7) قريبًا:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/log/?h=linux-4.13.yشكرًا،
waitid:
waitid -- ينتظر تغيّر حالة عملية تابعة.
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
لا تتحقق النواة مما إذا كان infop مؤشرًا إلى مساحة النواة أو مساحة المستخدم، لذا يمكننا الكتابة فوق ذاكرة أي صفحة من صفحات ذاكرة النواة التي تملك صلاحيات الكتابة. الجزء الممتع هو أننا نتحكم جزئيًا فقط في ما يُكتب.
هناك أكثر من ألف طريقة لاستغلال هذا. قررنا تحويل بدائية الكتابة هذه إلى إلغاء مرجعية مؤشر فارغ. كتبنا فوق المتغير have_canfork_callback في قسم .BSS من النواة. ضبط هذا المتغير على أي قيمة أخرى غير 0 (true) سيتسبب في استدعاء رد نداء (callback) غير معيّن (null) "عند إنشاء مهمة جديدة قبل أن تصبح العملية ظاهرة".
شكرًا لكريس سالز و@kees_cook لمشاركة تفاصيل CVE.
أول استغلال "حقيقي" لنواة لينكس من
@XeR_0x2A و
@chaign_c من
HexpressoTeam.
2017-10-22