
دراسة حالة تعليمية ودليل تطوير استغلال لـ 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]
الجدول 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، شرحنا كيفية عمل التجاوز غير الموقع. الآن، سندرس وظيفة النواة التي تحتوي على هذه الثغرة.
اكتشف المستخدم "clubby789" ثغرة في وظيفة النواة legacy_parse_param . هذه الوظيفة مسؤولة بشكل أساسي عن تحليل المعاملات التي يتم تمريرها إلى النواة. في CVE-2022-0185، تم استدعاؤها بعد استخدام fsopen لفتح واصف ملف، متبوعًا باستخدام دالة fsconfig لتمرير أزواج المفاتيح والقيم الخاصة بالتكوين إلى النواة. يتم عرض نسخة مبسطة من legacy_parse_param في الكود التالي. [2]```c
static int legacy_parse_param(struct fs_context *fc, struct fs_parameter *param) {
struct legacy_fs_context *ctx = fc->fs_private; // [1]
unsigned int size = ctx->data_size; // [2]
size_t len = 0;
int ret;
[ ... ]
switch (param->type) {
case fs_value_is_string:
len = 1 + param->size; // [3]
case fs_value_is_flag:
len += strlen(param->key);
break;
default:
return invalf(fc, "VFS: Legacy: Parameter type for '%s' not supported", param->key);
}
if (len > PAGE_SIZE-2-size) return invalf(fc, "VFS: Legacy: Cumulative options too large"); // [4]
[ ... ]
if (!ctx->legacy_data) {
ctx->legacy_data = kmalloc(PAGE_SIZE, GFP_KERNEL); // [5]
if (!ctx->legacy_data) return -ENOMEM;
}
ctx->legacy_data[size++] = ','; // [6]
len = strlen(param->key);
memcpy(ctx->legacy_data + size, param->key, len);
size += len;
if (param->type == fs_value_is_string) {
ctx->legacy_data[size++] = '=';
memcpy(ctx->legacy_data + size, param->string, param->size);
size += param->size;
}
ctx->legacy_data[size] = '\0';
ctx->data_size = size;
ctx->param_type = LEGACY_FS_INDIVIDUAL_PARAMS;
return 0;
}
من مقتطف الشيفرة أعلاه، نرى أن السطرين [1] و [2] يحددان سياق الشيفرة، بينما يحتوي السطر [4] على العبارة التي يحدث فيها underflow غير موقع. السطر [5] يتعامل مع تخصيص slab الكومة، والسطران [6] و [7] مسؤولان عن ملء البيانات في slab المخصص. ومن الجدير بالذكر أن السطر [6] يضيف فاصلة (',') كمحدد منفصل، كما يُضاف علامة المساواة ('=')، مما يؤدي إلى بايتين إضافيتين تتجاوزان الحجم الفعلي للبيانات.
في السطر [4]، تحتوي المتغيرات داخل جملة if على `PAGE_SIZE` (ماكرو مضبوط على 4096) و`size` (رقم 64 بت غير موقع). عندما يتراكم رقم غير موقع ليصل إلى 4095، يحدث underflow، مما يتسبب في أن تكون جملة if دائمًا خاطئة. وهذا يسمح بكتابة خارج الحدود إلى slab المجاور. يحدث underflow بسبب طرح رقم غير موقع، مما ينتج 4096 - 4095، والذي يعطي رقمًا غير موقعًا قيمته 18446744073709551615.[2]
نتيجة `18446744073709551615` موضحة في النص التالي:```c
if (len > PAGE_SIZE-2-size) return invalf(fc, "VFS: Legacy: Cumulative options too large");
لاحظ أنه هنا PAGE_SIZE يساوي 4096 بايت، و 2 يساوي الحرفين , و = المضافين لفصل كل key-value زوج. المشكلة هي أن size هي قيمة غير موقعة، وبالتالي عندما تصل size إلى 4095، فإن عبارة PAGE_SIZE-2-size ستساوي قيمة موقعة: -1، ولكن بالنسبة للقيمة غير الموقعة: 18446744073709551615 بسبب مكملة الثنائي كما هو موضح في الرسم البياني التالي! [3]

لذلك ستكون عبارة if أعلاه خاطئة دائمًا، مما يعني أن باقي البيانات سيتم نسخها إلى الكومة خارج حدود slab التي خصصناها!
بعد فهم كيفية حدوث هذا التدفق السفلي للأرقام غير الموقعة، يمكننا المتابعة لبناء كود إثبات المفهوم (POC) لتوضيح الثغرة الأمنية.
يوفر لنا المستخدم "clubby789" كود POC مفصل، كما هو موضح في مقتطف الكود التالي. الكود موجز؛ فهو يفتح أولاً واصف ملف يسمى ext4، ثم يستخدم fsconfig عدة مرات لتعبئة البيانات في النواة.
شيئان يجب ملاحظتهما هنا:
في القسم 3.1.1، ذكرنا أنه يجب ملء 4095 بايت من البيانات قبل ملاحظة الكتابة خارج الحدود. نظرًا لأن كل دورة تملأ 35 بايت فقط، يجب تنفيذ العملية 117 مرة (4095 / 35) قبل ملاحظة ذاكرة الكومة لإكمال الإثبات العملي.
### 3.1.3 الإثبات العملي مع QEMU
في هذا المستودع: GitHub - dcheng69/CVE-2022-0185-Case-Study، قدمنا نصًا برمجيًا يسمى `poc.sh` لتسهيل عملية التصحيح. يُرجى قراءة ملف Markdown في مجلد `Poc` قبل بدء الإعداد.
نظرًا لأن `legacy_parse_param` هي دالة kernel، ستحتاج إلى تصحيح دالة kernel. للقيام بذلك، تحتاج إلى تجميع شفرة مصدر kernel للحصول على الرموز والشفرة المصدرية اللازمة. لقد قدمنا أيضًا ملف Markdown مفصلاً لإرشادك خلال العملية. يُرجى الرجوع إلى مجلد `Compile_linux` لمزيد من التفاصيل.
في الشكل 3.1.3.1، أظهرنا أنه بعد ملء 4095 بايت من البيانات في كومة kernel، نجحنا في تشغيل كتابة خارج الحدود عن طريق استغلال التدفق السفلي غير الموقع. بالإضافة إلى ذلك، قمنا بملء إجمالي 4130 بايت من البيانات في شريحة kmalloc-4k، مما أدى إلى إتلاف الشريحة المجاورة بنجاح. على الرغم من أن الشريحة المجاورة في هذا المثال لا تحتوي على معلومات (كلها أصفار)، يمكننا بناء الكود الخاص بنا بعناية للاستفادة من هذه الميزة لكتابة بيانات ضارة. سنوضح كيفية تحقيق ذلك في قسم 3.2 الاستغلال.

**الشكل 3.1.3.1 الإثبات العملي مع QEMU**
لمزيد من التفاصيل، يُرجى الرجوع إلى https://github.com/dcheng69/CVE-2022-0185-Case-Study/blob/main/Poc/poc.md ضمن مجلد `Poc` في هذا المستودع!
## 3.2 الاستغلال
بعد معرفة هذه الثغرة، يمكننا الانتقال إلى استخدامها للقيام باستغلال، وتوثيق التفاصيل في مجلد `exploit-ubuntu` وأيضًا في ملف Markdown هذا: https://github.com/dcheng69/CVE-2022-0185-Case-Study/blob/main/explot-ubuntu/exploit.md
باختصار، قمنا بتجميع شفرة مصدر Ubuntu، والحصول على ملف deb، ثم اختباره على جهاز افتراضي للحصول على إصدار kernel محدد. ثم قمنا بتعديل الإزاحة في كود الاستغلال لاستهداف إصدار kernel باستخدام المعلومات التي وجدناها من ملف `System.map`. أخيرًا، قمنا بتحديث grub وإعادة التشغيل للاستغلال!
### 3.2.1 نظرة عامة على الاستغلال
قدم لنا المستخدم 'clubby789' كود استغلال مفصل. سنبدأ بنظرة عامة، متبوعة بشروحات لعدة مفاهيم رئيسية باستخدام الرسوم البيانية. وأخيرًا، سنقدم نتائج الاستغلال باستخدام Ubuntu يعمل على جهاز افتراضي (VirtualBox).
بعد إظهار الإثبات العملي لهذه الثغرة، يمكننا الآن المضي قدمًا لاستغلالها. في الشكل 3.2.1.1، تم توضيح نظرة عامة حول كيفية استغلال هذه الثغرة:
- يركز القسم الأيسر على الحصول على عنوان قاعدة Linux kernel. يتم تحقيق ذلك عن طريق استغلال التدفق السفلي غير الموقع لتجاوز حقل `m_ts` في بنية `msg_msg`، مما يسمح بقراءة خارج الحدود والوصول إلى هياكل kernel التي تم رشها مسبقًا.
- يهدف القسم الأيمن إلى الحصول على امتيازات الجذر. يتم تحقيق ذلك عن طريق استخدام التدفق السفلي غير الموقع لتجاوز المؤشر التالي لبنية `msg_msg`، وتوجيهه إلى `modprobe_path`. ثم نقوم بتشغيل خطأ صفحة يستدعي كود FUSE الذي أنشأناه، مما يتيح الكتابة التعسفية في مساحة kernel.

**الشكل 3.2.1.1 نظرة عامة على الاستغلال**
### 3.2.2 الحصول على عنوان قاعدة Linux kernel
كما حللنا سابقًا، سنستغل التدفق السفلي غير الموقع في هذا الجزء لتجاوز حقل `m_ts` لبنية `msg_msg`، مما يتيح قراءة خارج الحدود. من خلال رش الكومة بهياكل تحتوي على مؤشرات kernel، يمكننا على أمل الحصول على تسرب للذاكرة.
`struct msg_msg` هي بنية بيانات في Linux kernel تُستخدم لتنفيذ قوائم انتظار رسائل System V. في هذا القسم، نركز على الهيكل الداخلي لـ `struct msg_msg` ومنطق الوظائف المتعلقة بإرسال واستقبال وتخصيص الرسائل. كما هو موضح في الشكل 3.2.2.1، هذه هي الوظائف التي نحتاج إلى فهمها.
`struct msg_msg` هي بنية بيانات في Linux kernel تُستخدم لتنفيذ قوائم انتظار رسائل System V.[8] في هذه المناقشة، نركز على الهيكل الداخلي لـ `struct msg_msg`، بالإضافة إلى منطق الوظائف المتعلقة بإرسال واستقبال وتخصيص الرسائل. كما هو موضح في الشكل 3.2.2.1، هذه هي الوظائف التي نحتاج إلى فهمها.
يقع تنفيذ إرسال الرسائل في ملف `msg.c`، الذي يحدد الحد الأقصى لطول الرسالة بـ 8192 بايت. في وظيفة `alloc_msg`، يتم تقسيم الرسائل إلى أجزاء بناءً على طولها. إذا تجاوز طول الرسالة، بالإضافة إلى رأس الرسالة، صفحة واحدة (4096 بايت)، فسيتم تخزين الرسالة في عدة أجزاء مرتبطة ببعضها البعض بواسطة مؤشرات.

**الشكل 3.2.2.1 `struct msg_msg` إرسال واستقبال**
في الشكل 3.2.2.2، يمكننا رؤية أن `struct msg_msg` يعمل كرأس رسالة، حيث يشغل 0x30 بايت من الذاكرة. إذا كانت هناك بيانات متبقية في الرسالة، فسيتم تخزينها في أجزاء الرسالة وربطها بـ `struct msg_msgseg`. لذلك، إذا كان kernel يسمح برسائل يصل طولها الأقصى إلى 8192 بايت، فسيتم تخزين البيانات في ثلاثة أجزاء رسالة كحد أقصى.

**الشكل 3.2.2.2 `struct msg_msg`**
في الشكل 3.2.2.3، نوضح هيكل `struct msg_msg`. من الكود، نعلم أن حقل `m_ts` هو الحقل الذي نحتاج إلى تجاوزه لقراءة خارج الحدود. (يمكنك العثور على ملف draw.io المصدر ضمن مجلد `res` إذا كنت بحاجة!)

**الشكل 3.2.2.2 هيكل `struct msg_msg`**
الآن وقد فهمنا هيكل `struct msg_msg`، نحتاج إلى تعلم كيفية الحصول على تسرب kernel. يحتوي Linux kernel على ميزة توزيع عشوائي لمساحة عنوان kernel (KASLR)، مما يعني أن كود kernel يتم تحميله في عنوان عشوائي يتم تحديده أثناء مرحلة التمهيد. ومع ذلك، يظل الإزاحة من نقطة بدء kernel إلى أي عنوان دالة ثابتًا، مما يسمح لنا بتنفيذ عمليات محددة لملء مساحة الكومة بهياكل تحتوي على وظائف kernel معينة. من خلال تقليل الإزاحة، يمكننا العثور على عنوان بداية kernel.
لحسن الحظ، يمكننا بسهولة رش الكومة بهياكل `seq_operations` عن طريق فتح `/proc/self/stat`، والتي توجد في شرائح kmalloc-32. يظهر تعريف `seq_operations` في الشكل 3.2.2.3.

**الشكل 3.2.2.3 هياكل لتسرب kernel**
أخيرًا، تظهر العملية الشاملة في الشكل 3.2.2.4. نبدأ بملء `legacy_data` بـ 4095 بايت من البيانات للتحضير للتجاوز. ثم نقوم ببناء رسائل باستخدام `struct msg_msg`. نظرًا لأن ذاكرة الكومة يتم تخصيصها بشكل مستمر، فمن المحتمل أن تكون الرسائل المنشأة مجاورة لشريحة kmalloc-4k المجاورة. نقوم بتجاوز حقل `m_ts` عن طريق التحكم في البيانات التي نكتبها إلى `legacy_data`.
بعد ذلك، نقوم برش الكومة بهياكل `seq_operations` متعددة بحجم kmalloc-32. ثم نستقبل البيانات من قائمة انتظار الرسائل، مما يؤدي إلى تشغيل قراءة خارج الحدود. من خلال ضبط الإزاحة من دالة kernel، يمكننا الحصول على عنوان قاعدة kernel.

**الشكل 3.2.2.3 نظرة عامة على القراءة خارج الحدود**
### 3.2.3 الحصول على امتيازات الجذر
على غرار تحليلنا السابق، في هذا الجزء، نحتاج إلى إعداد نظام ملفات FUSE، والذي يسمح لكود مساحة المستخدم لدينا بمعالجة أخطاء الصفحة من مساحة kernel. في نفس الوقت، سنقوم بتجاوز المؤشر `msg_msgseg *next` للإشارة إلى `modprobe_path`، مما يتيح الكتابة التعسفية في مساحة kernel.
دعنا أولاً نفحص سلسلة استدعاء FUSE الموضحة في الشكل 3.2.3.1. بشكل عام، يسمح لنا FUSE بتنفيذ نظام ملفات في مساحة المستخدم. عندما تكون هناك عملية جديدة، سيقوم النظام باستدعاء الكود الذي حددناه لـ FUSE!

**الشكل 3.2.3.1 نظرة عامة على FUSE**
دعنا نحلل كيفية استخدام FUSE لتحقيق الكتابة التعسفية في مساحة kernel. أولاً، دعنا نفكر في عملية إرسال الرسالة لـ `struct msg_msg`. تتضمن هذه العملية كتابة بيانات إلى مساحة kernel. إذا قمنا ببناء الرسالة بحيث تحتوي على جزأين، يمكننا تجاوز المؤشر والكتابة إلى أي عنوان kernel. يتم توضيح هذا المفهوم في الشكل 3.2.3.2.
بالإضافة إلى ذلك، بعد فحص منطق إرسال الرسائل إلى قائمة الانتظار، نعلم أن العملية تتضمن نسخ مخزن مؤقت من مساحة المستخدم إلى مساحة kernel. إذا كانت الرسائل طويلة بما فيه الكفاية، فسيتم نسخها جزءًا تلو الآخر. إذا تمكنا من تشغيل خطأ صفحة أثناء هذه العملية، يمكننا تحقيق السيناريو الموضح في الشكل 3.2.3.2.
لحسن الحظ، يوفر FUSE الوظيفة اللازمة. يمكننا تعيين صفحة إلى FUSE، وعند تشغيل خطأ صفحة، سيقوم النظام باستدعاء دالة قراءة FUSE الخاصة بنا لمعالجة خطأ الصفحة. من خلال إيقاف عملية القراءة مؤقتًا حتى يقوم التدفق السفلي غير الموقع بتجاوز المؤشر `msg_msg_seg *next` ثم استئناف عملية إرسال الرسالة، يمكننا تحقيق الكتابة التعسفية. يتم توضيح العملية بأكملها في الشكل 3.2.3.3.

**الشكل 3.2.3.2 استخدام إرسال الرسالة**

**الشكل 3.2.3.3 FUSE وإرسال الرسالة**
### 3.2.4 الاستغلال باستخدام Virtual Box
باتباع ملف Markdown: https://github.com/dcheng69/CVE-2022-0185-Case-Study/blob/main/explot-ubuntu/exploit.md
بمجرد اكتمال التجميع، يمكنك ملاحظة نتائج الاستغلال في الشكل 3.2.4.1.

**الشكل 3.2.4.1 الاستغلال باستخدام Virtual Box**
# 4. تخفيف الثغرة
## 4.1 التصحيحات الرسمية
بعد الإبلاغ عن هذه الثغرة، قام Linux والعديد من توزيعاته بدمج تصحيحات لإصلاح هذا الخلل.[9] [10] [11]
في لقطة الشاشة التالية، نعرض التصحيح الذي تم دمجه بواسطة Linus Torvalds. تخفيف مشكلة التدفق السفلي هذه هو ببساطة تحويل عملية الطرح إلى عملية جمع.

# 5. التأثير في العالم الحقيقي
في هذا التقرير، نوضح كيف يمكن استغلال هذه الثغرة لاختراق نظام Ubuntu. بالإضافة إلى ذلك، يمكن أن تستهدف الأنظمة القديمة التي تفتقر إلى التحديثات الأمنية المنتظمة.
فيما يتعلق بـ Kubernetes، يمكن أن تؤدي هذه الثغرة إلى تصعيد الامتيازات، أو الهروب من الحاوية، أو هجمات رفض الخدمة.
على الرغم من عدم وجود خسائر مبلغ عنها بسبب هذه الثغرة في الأخبار، إلا أنها تؤكد على أهمية تطبيق التحديثات الأمنية الحيوية باستمرار. الباحث الذي أبلغ عن هذه الثغرة يجسد ممارسات الاختراق الأخلاقي التي يجب أن نسعى جميعًا للالتزام بها.[12]
# المراجع
[1] https://nvd.nist.gov/vuln/detail/CVE-2022-0185
[2] https://www.hackthebox.com/blog/CVE-2022-0185:_A_case_study
[3] https://ubuntu.com/security/CVE-2022-0185#impact-score
[4] [https://en.wikipedia.org/wiki/Two%27s_complement](https://en.wikipedia.org/wiki/Two's_complement)
[5]https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Unsigned-Overflow.html
[6] https://www.kernel.org/doc/gorman/html/understand/understand011.html
[7] https://leviathan.vip/
[8] https://www.willsroot.io/2021/08/corctf-2021-fire-of-salvation-writeup.html
[9] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=722d94847de2
[10] https://ubuntu.com/security/CVE-2022-0185
[11] https://access.redhat.com/security/cve/CVE-2022-0185
[12]https://jfrog.com/blog/the-impact-of-cve-2022-0185-linux-kernel-vulnerability-on-popular-kubernetes-engines/
[14] https://github.com/chenaotian/CVE-2022-0185?tab=readme-ov-file
[15] https://www.tutorialspoint.com/two-s-complement
| مقاييس CVSS v3.1 | القيمة |
|---|
| متجه الهجوم (AV) | محلي |
| الصلاحيات المطلوبة (PR) | لا شيء |
| تفاعل المستخدم (UI) | لا شيء |
| السرية (C) | عالية |
| التكامل (I) | عالية |
| التوفر (A) | عالية |