Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/lrh2000/stackrot
تصعيد الامتيازاتتحليل الثغرات الأمنيةالاستغلالCTFاستغلال الملفات الثنائية
GitHublrh2000/stackrot

StackRot

CVE-2023-3269: ثغرة تصعيد صلاحيات في نواة لينكس

عرض المستودع
499379منذ 7 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

StackRot (CVE-2023-3269): ثغرة تصعيد الامتيازات في نواة لينكس

GitHub CI (استغلال مُتحقَّق منه عبر GitHub CI)

عرض توضيحي

تم العثور على خلل في معالجة توسعة المكدس في نواة لينكس من الإصدار 6.1 حتى 6.4، ويُعرف باسم "Stack Rot". يمكن لشجرة مابل (maple tree)، المسؤولة عن إدارة مناطق الذاكرة الافتراضية، أن تخضع لاستبدال العقد دون الحصول بشكل صحيح على قفل الكتابة MM، مما يؤدي إلى مشاكل use-after-free. يمكن لمستخدم محلي غير مميز استغلال هذا الخلل لاختراق النواة وتصعيد امتيازاته.

بما أن StackRot ثغرة في نواة لينكس توجد في النظام الفرعي لإدارة الذاكرة، فهي تؤثر على جميع تكوينات النواة تقريبًا وتتطلب حدًا أدنى من الصلاحيات لتفعيلها. ومع ذلك، تجدر الإشارة إلى أن عقد مابل يتم تحريرها باستخدام استدعاءات RCU، مما يؤخر التحرير الفعلي للذاكرة حتى ما بعد فترة سماح RCU. وبالتالي، يُعد استغلال هذه الثغرة أمرًا صعبًا.

على حد علمي، لا توجد حاليًا أي exploits متاحة للعموم تستهدف ثغرات use-after-free-by-RCU (UAFBR). تمثل هذه المرة الأولى التي يُثبت فيها أن ثغرات UAFBR قابلة للاستغلال، حتى دون وجود إعدادات CONFIG_PREEMPT أو CONFIG_SLAB_MERGE_DEFAULT. ومن الجدير بالذكر أنه تم بنجاح توضيح هذا الاستغلال في البيئة التي يوفرها Google kCTF VRP (bzImage_upstream_6.1.25, config).

كانت ثغرة StackRot موجودة في نواة لينكس منذ الإصدار 6.1 عندما تم تغيير بنية شجرة VMA من الأشجار الحمراء-السوداء إلى أشجار مابل.

الخلفية

عندما يتم استخدام استدعاء النظام mmap() لإنشاء تعيين ذاكرة، تقوم النواة بإنشاء بنية تسمى vm_area_struct لتمثيل منطقة الذاكرة الافتراضية المقابلة (VMA). تخزن هذه البنية معلومات متنوعة بما في ذلك العلامات والخصائص والتفاصيل الأخرى ذات الصلة بالتعيين.```c struct vm_area_struct { long unsigned int vm_start; /* 0 8 / long unsigned int vm_end; / 8 8 / struct mm_struct * vm_mm; / 16 8 / pgprot_t vm_page_prot; / 24 8 / long unsigned int vm_flags; / 32 8 / union { struct { struct rb_node rb attribute((aligned(8))); / 40 24 / / --- cacheline 1 boundary (64 bytes) --- / long unsigned int rb_subtree_last; / 64 8 / } attribute((aligned(8))) shared attribute((aligned(8))); / 40 32 / struct anon_vma_name * anon_name; / 40 8 / } attribute((aligned(8))); / 40 32 / / --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- / struct list_head anon_vma_chain; / 72 16 / struct anon_vma * anon_vma; / 88 8 / const struct vm_operations_struct * vm_ops; / 96 8 / long unsigned int vm_pgoff; / 104 8 / struct file * vm_file; / 112 8 / void * vm_private_data; / 120 8 / / --- cacheline 2 boundary (128 bytes) --- / atomic_long_t swap_readahead_info; / 128 8 / struct vm_userfaultfd_ctx vm_userfaultfd_ctx; / 136 0 */

    /* size: 136, cachelines: 3, members: 14 */
    /* forced alignments: 1 */
    /* last cacheline: 8 bytes */

} attribute((aligned(8)));

بعد ذلك، عندما يواجه النواة أخطاء الصفحات أو استدعاءات نظام أخرى
متعلقة بالذاكرة، فإنها تحتاج إلى بحث سريع عن VMA بناءً على العنوان فقط.
سابقًا، كانت تُدار مناطق VMA باستخدام الأشجار الحمراء-السوداء. ومع ذلك،
ابتداءً من إصدار نواة لينكس 6.1، تم الانتقال إلى أشجار القيقب. [أشجار
القيقب][mt] هي هياكل بيانات من نوع B-tree آمنة بالنسبة إلى RCU،
ومحسّنة لتخزين النطاقات غير المتداخلة. ومع ذلك، فإن طبيعتها المعقدة تضيف
تعقيدًا إلى قاعدة الشيفرة وتُدخل ثغرة StackRot.

 [mt]: https://docs.kernel.org/6.4/core-api/maple_tree.html

في جوهرها، تتكون شجرة القيقب من عُقد قيقب. وعلى الرغم من أن بنية الشجرة
قد تكون معقدة، فمن المهم ملاحظة أن هذا التعقيد لا علاقة له
بخلل StackRot. لذلك، في جميع أنحاء هذا المقال، يُفترض أن
شجرة القيقب تتكون من عقدة واحدة فقط، أي العقدة الجذرية.

يمكن أن تحتوي هذه العقدة الجذرية على ما يصل إلى 16 فترة. وقد تمثل هذه
الفترات إما فجوة أو تشير إلى VMA. وبما أن الفجوات تُعد أيضًا فترات، فإن
جميع الفترات تكون متصلة تسلسليًا، مما يؤدي إلى الحاجة إلى 15
نقطة نهاية فقط، تُعرف أيضًا باسم المحاور، داخل بنية العقدة.
لاحظ أن نقطة النهاية في أقصى اليسار ونقطة النهاية في أقصى اليمين محذوفتان،
لأنه يمكن استرجاعهما من العقدة الأم.```c
struct maple_range_64 {
        struct maple_pnode *       parent;               /*     0     8 */
        long unsigned int          pivot[15];            /*     8   120 */
        /* --- cacheline 2 boundary (128 bytes) --- */
        union {
                void *             slot[16];             /*   128   128 */
                struct {
                        void *     pad[15];              /*   128   120 */
                        /* --- cacheline 3 boundary (192 bytes) was 56 bytes ago --- */
                        struct maple_metadata meta;      /*   248     2 */
                };                                       /*   128   128 */
        };                                               /*   128   128 */

        /* size: 256, cachelines: 4, members: 3 */
};

إن بنية maple_range_64، كما هو موضح أعلاه، تمثل عقدة maple. بالإضافة إلى نقاط الارتكاز، تُستخدم الخانات للإشارة إلى بنية VMA عندما تعمل العقدة كعقدة طرفية، أو إلى عقد maple أخرى عندما تعمل العقدة كعقدة داخلية. إذا كان الفاصل الزمني يقابل فجوة، فستحتوي الخانة ببساطة على قيمة NULL. ويمكن تصور ترتيب نقاط الارتكاز والخانات كما هو موضح أدناه:``` Slots -> | 0 | 1 | 2 | ... | 12 | 13 | 14 | 15 | ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ └─ Implied maximum │ │ │ │ │ │ │ └─ Pivot 14 │ │ │ │ │ │ └─ Pivot 13 │ │ │ │ │ └─ Pivot 12 │ │ │ │ └─ Pivot 11 │ │ │ └─ Pivot 2 │ │ └─ Pivot 1 │ └─ Pivot 0 └─ Implied minimum

فيما يتعلق بالتعديل المتزامن، تفرض شجرة القيقب قيدًا محددًا، وهو أنه يجب الاحتفاظ بقفل حصري من قِبل الكتّاب (*Rule W*). في حالة شجرة VMA، يتوافق القفل الحصري مع قفل الكتابة MM. أما بالنسبة للقرّاء، فهناك خياران متاحان. يتضمن الخيار الأول الاحتفاظ بقفل القراءة MM (*Rule A1*)، مما يؤدي إلى حظر الكاتب بواسطة قفل القراءة-الكتابة MM. بدلاً من ذلك، الخيار الثاني هو الدخول في القسم الحرج الخاص بـ RCU (*Rule A2*). وبذلك، لا يتم حظر الكاتب، ويمكن للقرّاء مواصلة عملياتهم نظرًا لأن شجرة القيقب آمنة مع RCU. بينما تختار معظم عمليات الوصول إلى VMA الحالية الخيار الأول (أي Rule A1)، يُستخدم Rule A2 في سيناريوهات قليلة حرجة من حيث الأداء، مثل أخطاء الصفحات بدون أقفال.

ومع ذلك، هناك جانب إضافي يتطلب اهتمامًا خاصًا، ويتعلق بتوسع المكدس. يمثل المكدس منطقة ذاكرة يتم تعيينها بعلامة MAP_GROWSDOWN، مما يشير إلى التوسع التلقائي عند الوصول إلى عنوان أسفل المنطقة. في مثل هذه الحالات، يتم تعديل عنوان البداية لـ VMA المقابل، وكذلك المدى المرتبط داخل شجرة القيقب. ومن الجدير بالذكر أن هذه التعديلات تتم دون الاحتفاظ بقفل الكتابة MM.```c
static inline
void do_user_addr_fault(struct pt_regs *regs,
                        unsigned long error_code,
                        unsigned long address)
{
	// ...
تنزيل الأداة