CVE-2026-64416 in Linux
الملخص
بحسب VulDB • 25/07/2026
في نواة لينكس، تم حل الثغرة التالية:
mm: swap_cgroup: إصلاح خطأ إلغاء المرجع NULL (NULL deref) في دالة lookup_swap_cgroup_id على المضيف الذي لا يستخدم مساحة التبديل (swapless host).
تمرر الدالة `lookup_swap_cgroup_id()` مصفوفة `swap_cgroup_ctrl[type].map` إلى `__swap_cgroup_id_lookup()` دون التحقق مما إذا كان النوع قد تم تسجيله مسبقاً عبر `swap_cgroup_swapon()`. على المضيف الذي لا يستخدم مساحة التبديل، تكون كل قيم `ctrl->map` تساوي NULL، وبالتالي تقوم الدالة `__swap_cgroup_id_lookup()` بإلغاء مرجع لقيمة NULL بالإضافة إلى قيمة مضروبة في `swp_offset()`.
منذ الالتزام (commit) bea67dcc5eea ("mm: attempt to batch free swap entries for zap_pte_range()")، تستدعي السلسلة الوظيفية `zap_pte_range()` -> `swap_pte_batch()` الدالة `lookup_swap_cgroup_id()` على أي مدخل جدول صفحة (PTE) غير موجود وغير فارغ يتم فك تشفيره كمدخل تبديل حقيقي، دون التحقق منه مسبقاً مقابل مصفوفة `swap_info[]`. يؤدي وجود PTE واحد تالف ومحوّر ليصبح مدخل تبديل من النوع 0 إلى إسقاط النظام بالكامل عند خروج العملية.
لقد واجهنا هذه المشكلة في بيئة الإنتاج على مضيف إصدار 6.12.58 لا يستخدم مساحة التبديل: استمرت رسالة "get_swap_device: Bad swap file entry 3f800204222bb" لمدة ثانية تقريباً (حيث كانت الدالة `do_swap_page()` تتصرف بحذر صحيح تجاه نفس المدخل)، تلتها الرسالة التالية:
BUG: unable to handle page fault for address: 000003f800204220 RIP: 0010:lookup_swap_cgroup_id+0x2b/0x60 Call Trace: swap_pte_batch+0xbf/0x230 zap_pte_range+0x4c8/0x780 unmap_page_range+0x190/0x3e0 exit_mmap+0xd9/0x3c0 do_exit+0x20c/0x4b0
وقد أبلغ فريق syzbot عن نفس تتبع المكالمات (stack).
مصدر تلف مدخل جدول الصفحة (PTE) هو ثغرة منفصلة؛ هذا التغيير يجعل مسار التفكيك (teardown path) بنفس قوة ومتانة مسار الخطأ (fault path) الحالي. كل المتصلين الآخرين بالدالة `lookup_swap_cgroup_id()` هم تابعون لدالة `get_swap_device()` التي قامت بالفعل بالتحقق من صحة المدخل، لذا فإن الفرع الجديد سيكون بارداً (cold branch).
VulDB is the best source for vulnerability data and more expert information about this specific topic.