CVE-2024-50066 in Linuxالمعلومات

الملخص

بحسب VulDB • 21/05/2026

في نواة لينكس، تم حل الثغرة التالية:

mm/mremap: إصلاح سباق (race) بين دالتي move_normal_pmd و retract_page_tables

في دالة mremap()، تفحص دالة move_page_tables() نوع مدخل PMD ونطاق العنوان المحدد لتحديد الطريقة التي ينبغي بها نقل كتلة الإدخالات التالية لجداول الصفحات.

في تلك المرحلة، يكون قفل mmap_lock مُمسَكًا في وضع الكتابة، لكن لم يتم بعد أخذ أي من أقفال rmap. بالنسبة لمدخلات PMD التي تشير إلى جداول الصفحات وتكون مغطاة بالكامل بواسطة نطاق العنوان المصدر، يتم استدعاء move_pgt_entry(NORMAL_PMD, ...)، والتي تأخذ أولاً أقفال rmap، ثم تقوم باستدعاء move_normal_pmd(). تأخذ دالة move_normal_pmd() أقفال جداول الصفحات اللازمة في المصدر والوجهة، ثم تنقل جدول الصفحات بأكمله من المصدر إلى الوجهة.

المشكلة هي: أن أقفال rmap، التي تحمي من إزالة جداول الصفحات المتزامنة بواسطة دالة retract_page_tables() في كود THP، لا يتم أخذها إلا بعد قراءة مدخل PMD واتخاذ القرار بشأن كيفية نقله. لذا، يمكن أن يحدث سباق (race) كما يلي (مع عمليتين لهما تعيينات لنفس ملف tmpfs المخزن على نقطة تحميل tmpfs مع خيار huge=advise); لاحظ أن العملية A تصل إلى جداول الصفحات عبر MM بينما تفعل العملية B ذلك عبر ملف rmap:

العملية A العملية B ========= ========= mremap mremap_to move_vma move_page_tables get_old_pmd alloc_new_pmd *** PREEMPTION *** madvise(MADV_COLLAPSE) do_madvise madvise_walk_vmas madvise_vma_behavior madvise_collapse hpage_collapse_scan_file collapse_file retract_page_tables i_mmap_lock_read(mapping) pmdp_collapse_flush i_mmap_unlock_read(mapping) move_pgt_entry(NORMAL_PMD, ...) take_rmap_locks move_normal_pmd drop_rmap_locks

عند حدوث ذلك، قد تنتهي دالة move_normal_pmd() بإنشاء مدخلات PMD زائفة في السطر `pmd_populate(mm, new_pmd, pmd_pgtable(pmd))`. يعتمد التأثير على تفاصيل خاصة بالبنية المعمارية (arch-specific) وخصوصية الجهاز؛ على معالجات x86، يمكن أن ينتهي الأمر بربط الصفحة الفيزيائية 0 كجدول صفحات، وهو ما قد يكون قابلاً للاستغلال لرفع الامتيازات من المستخدم إلى النواة (user->kernel privilege escalation).

إصلاح السباق: يتم ذلك عن طريق السماح للعملية B بإعادة التحقق من أن مدخل PMD لا يزال يشير إلى جدول صفحات بعد أخذ أقفال rmap. وإلا، فإننا نتراجع ونترك الدالة المتصلة تعود إلى مسار نسخ مستوى PTE، والذي سيتراجع فورًا عند فحص pmd_none().

قابلية الوصول للخطأ: للوصول إلى هذا الخطأ، يتطلب الأمر القدرة على إنشاء تعيينات THP لـ shmem/ملف؛ حيث يستخدم THP المجهول (anonymous) كودًا مختلفًا لا يقوم بمسح البيانات تحت أقفال rmap. يتم تقييد THP الخاص بالملفات بواسطة خيار تكوين تجريبي (CONFIG_READ_ONLY_THP_FOR_FS)، لذا فإنك في نوى التوزيعات العادية تحتاج إلى شmem THP لضرب هذا الخطأ. بقدر ما أعلم، يتطلب الحصول على شmem THP عادةً أن تتمكن من تحميل نقطة تحميل tmpfs خاصة بك مع خيارات التحميل الصحيحة، وهو ما يتطلب إنشاء مساحة اسم مستخدم+تحميل خاصة بك؛ رغم أنني لا أعرف ما إذا كانت بعض التوزيعات تمكّن شmem THP افتراضيًا أو شيء من هذا القبيل.

تأثير الخطأ: يمكن على الأرجح استخدام هذه المشكلة لرفع الامتيازات من المستخدم إلى النواة (user->kernel privilege escalation) عندما تكون قابلة للوصول.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

مسؤول

Linux

حجز

21/10/2024

إفشاء

23/10/2024

الاعتدال

تمت الموافقة

إدخال

VDB-281550

استغلال

تحميل

EPSS

0.00198

KEV

لا

النشاطات

منخفض جدًا

المصادر

Want to know what is going to be exploited?

We predict KEV entries!