
دراسة حالة تعليمية ودليل تطوير استغلال لـ CVE-2022-0185، وهو تجاوز سعة المخزن المؤقت في الكومة (heap) لنواة لينكس (Linux kernel) يتيح رفع الامتيازات المحلية. يشمل POC، وتصحيح QEMU، واستغلال Ubuntu مع تحليل فني مفصل.
دراسة الحالة هذه هي نتيجة لواجب لمقرر ECE 9069: مقدمة في القرصنة : https://whisperlab.org/introduction-to-hacking/
CVE-2022-0185 هو ثغرة من نوع تجاوز سعة المخزن المؤقت في الكومة (heap-based buffer overflow) تم العثور عليها في الطريقة التي تتحقق بها دالة legacy_parse_param في وظيفة سياق نظام الملفات (Filesystem Context) في نواة لينكس من طول المعاملات المقدمة. يمكن لمستخدم محلي غير مميز (في حالة تمكين مساحات أسماء المستخدمين غير المميزة، وإلا فإنه يحتاج إلى صلاحية CAP_SYS_ADMIN في مساحة الاسم) قادر على فتح نظام ملفات لا يدعم واجهة برمجة تطبيقات سياق نظام الملفات (وبالتالي يتراجع إلى المعالجة القديمة) استغلال هذه الثغرة لرفع صلاحياته على النظام. [1]
بعد الإبلاغ عن هذه الثغرة، تم إصدار تصحيح لإصلاح هذا الخلل:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=722d94847de2
https://ubuntu.com/security/CVE-2022-0185#impact-score
هناك شرح مفصل من المستكشف: https://www.hackthebox.com/blog/CVE-2022-0185:_A_case_study
في هذا المستودع سأشرح الخطوات الأساسية والمعلومات الخلفية ذات الصلة لإعادة إنتاج هذه الثغرة. أيضًا، إذا كان هناك أي شيء غير واضح، يمكنك إرسال بريد إلكتروني لي على: [email protected]. يسعدني جدًا الإجابة على الأسئلة.
تم نشر ثغرة CVE-2022-0185 في 11/02/2022، بدرجة أساسية CVSS 3.x تبلغ 8.4 (عالية). [1] هذه الثغرة هي تجاوز سعة المخزن المؤقت في الكومة، ناتج عن تجاوز عدد صحيح غير موقع (unsigned integer underflow).
تم إدخال الثغرة في نواة لينكس الإصدار v5.1، مما أثر على جميع توزيعات لينكس ذات إصدارات نواة أعلى من 5.1. على سبيل المثال، كان Ubuntu 20.04 LTS (focal) عرضة لهذا الخلل. ومع ذلك، تم إصدار تصحيح وهو متاح منذ الإصدار 5.4.0-96.109. [3]
يسمح استغلال هذه الثغرة لمستخدم محلي غير مميز برفع صلاحياته على النظام، مما قد يعرض النظام بأكمله للخطر. [1] [2] فيما يلي تحليل مفصل لدرجة CVSS: الدرجة الأساسية: 8.4، مما يشير إلى خطر أمني كبير يتطلب اهتمامًا فوريًا. درجة التأثير: 5.9، مما يشير إلى ضرر محتمل كبير إذا تم استغلالها. تساهم قيم السرية العالية والتكامل العالي والتوفر العالي في هذه الدرجة. درجة قابلية الاستغلال: 2.5، مما يشير إلى قابلية استغلال عالية نسبيًا. يساهم متجه الهجوم المحلي والتكامل العالي والتوفر العالي في هذه الدرجة.
يقدم الجدول 1.1 والجدول 1.2 مزيدًا من المعلومات حول هذه الدرجات ومكوناتها.
| شدة CVSS v3.1 | القيمة |
|---|---|
| الدرجة الأساسية | 8.4 عالية |
| درجة التأثير | 5.9 |
| درجة قابلية الاستغلال | 2.5 |
الجدول 1.1 درجات شدة CVSS [1]
| مقاييس CVSS v3.1 | القيمة |
|---|---|
| متجه الهجوم (AV) | محلي |
| الصلاحيات المطلوبة (PR) | لا شيء |
| تفاعل المستخدم (UI) | لا شيء |
| السرية (C) | عالية |
| التكامل (I) | عالية |
| التوفر (A) | عالية |
الجدول 1.2 متجه CVSS [1]
يوجد نوعان من الأعداد الصحيحة في أجهزة الكمبيوتر الحديثة: الموقعة وغير الموقعة. يتضمن تمثيل الأعداد الموقعة عادةً عملية تسمى المكمل الثنائي. [4] "يستخدم المكمل الثنائي الرقم الثنائي ذو القيمة المكانية الأكبر كإشارة للإشارة إلى ما إذا كان الرقم الثنائي موجبًا أم سالبًا" [4]
يؤدي إدخال المكمل الثنائي إلى تحويل عملية الطرح إلى جمع، وبالتالي تبسيط تصميم وتنفيذ وحدة المعالجة المركزية. يتضمن إنشاء المكمل الثنائي لعدد صحيح ثلاث خطوات: [4]
يوضح الشكل 2.1.1.1 عملية التحويل في رسم تخطيطي مع مثال فعلي لتحويل "-6" إلى تنسيق المكمل الثنائي الخاص به.

الشكل 2.1.1.1 تحويل المكمل الثنائي
يوضح الشكل 2.1.1.2 عملية إضافة المكمل الثنائي لـ '-6' إلى '+6'. يوضح هذا كيفية استخدام المكمل الثنائي للسماح باستخدام الجمع كبديل للطرح.

الشكل 2.1.1.2 الجمع باستخدام المكمل الثنائي
من القسم 2.1.1، نحن نفهم بالفعل ما هو المكمل الثنائي. الآن، دعنا نلقي نظرة على سيناريو تجاوز العدد الصحيح غير الموقع في أجهزة الكمبيوتر. في أجهزة الكمبيوتر الحديثة، عند استخدام أعداد غير موقعة، لا يتم التعامل مع البت الأكثر أهمية كبت إشارة؛ بدلاً من ذلك، هو جزء من الرقم غير الموقع نفسه. هذا الوضع يعني أنه عند إجراء عملية طرح باستخدام أعداد غير موقعة، يجب أن نكون حذرين، حيث قد يؤدي ذلك إلى حالة تعرف باسم تجاوز العدد الصحيح غير الموقع. [5]
يوضح الشكل 2.1.2.1 حالة طرح 6 من 5 لعدد غير موقع مكون من 8 بتات. النتيجة النهائية هي 255 بسبب التفاف العدد غير الموقع. عندما يحدث هذا التجاوز في عبارة شرطية، فلديه القدرة على تعطيل وظيفة العبارة.

الشكل 2.1.2.1 تجاوز العدد الصحيح غير الموقع
في نواة لينكس، يُعد مُخصص الشرائح (Slab Allocator) آلية لإدارة الذاكرة تُستخدم للتخصيص والإلغاء الفعال لقطع صغيرة من الذاكرة. يوفر أداءً من خلال الحفاظ على العديد من ذاكرات التخزين المؤقت للشرائح، يحتوي كل منها على كتل ذاكرة ذات حجم ثابت. عادةً، يخصص kmalloc-32 32 بايت من الذاكرة، وهو عبارة عن شريحة kmalloc-32، بينما يخصص kmalloc-4k 4096 بايت من الذاكرة، وهو عبارة عن شريحة kmalloc-4k. [6]
علاوة على ذلك، يتضمن تخصيص الشرائح في نواة لينكس عادةً تخصيص ذاكرة من مساحة عنوان متجاورة داخل منطقة ذاكرة الكومة الخاصة بالنواة. يتم إدارة هذا العنوان المتجاور بواسطة النواة ويستخدم لتخصيص الذاكرة لمختلف كائنات وهياكل بيانات النواة. يوضح الشكل 2.2.1.1 تخطيط الشرائح في ذاكرة نواة لينكس.

الشكل 2.2.1.1 مُخصص الشرائح في لينكس [7] (مؤلف هذا الشكل هو https://leviathan.vip/)
إذا كنت ترغب في إعادة إنتاج العملية باستخدام نواة لينكس مترجمة ذاتيًا، فيرجى قراءة ملفات markdown التالية للحصول على المعلومات الخلفية:
ملاحظة:
جميع ملفات markdown وكذلك الكود والبرامج النصية موجودة في مجلدات مختلفة من هذا المستودع، كل مجلد يأتي مع ملف markdown خاص به، اقرأه قبل محاولة فعل أي شيء!
في القسم 2.1، شرحنا كيفية عمل التجاوز غير الموقع. الآن، سندرس وظيفة النواة التي تحتوي على هذه الثغرة.