CVE-2025-40230 in Linux
الملخص
بحسب VulDB • 11/07/2026
في نواة لينكس، تم حل الثغرة التالية:
mm: منع استهلاك البيانات التالفة (poison) عند تقسيم الصفحات العملاقة الشفافة (THP)
عند حقن أخطاء في الذاكرة على صفحة عملاقة شفافة (THP) مُربوطة بمجال المستخدم (userspace) على خادم يعمل ببنية x86، تتوقف النواة عن العمل (Kernel Panic) مع تتبع الأثر التالي. السلوك المتوقع هو إنهاء العملية المتأثرة بدلاً من إيقاف عمل النواة بالكامل، حيث يمكن لرمز فحص الآلة في bنية x86 التعافي من استثناء فحص الآلة (#MC) الذي يحدث داخل مجال المستخدم.
mce: [Hardware Error]: CPU 0: Machine Check Exception: f Bank 3: bd80000000070134
mce: [Hardware Error]: RIP 10:<ffffffff8372f8bc> {memchr_inv+0x4c/0xf0}
mce: [Hardware Error]: TSC afff7bbff88a ADDR 1d301b000 MISC 80 PPIN 1e741e77539027db
mce: [Hardware Error]: PROCESSOR 0:d06d0 TIME 1758093249 SOCKET 0 APIC 0 microcode 80000320
mce: [Hardware Error]: Run the above through 'mcelog --ascii'
mce: [Hardware Error]: Machine check: Data load in unrecoverable area of kernel
Kernel panic - not syncing: Fatal local machine check
السبب الجذري لهذا التوقف هو أن معالجة فشل في الذاكرة ناتج عن استثناء #MC داخل مجال المستخدم يتطلب تقسيم الصفحة العملاقة الشفافة (THP). تعتمد عملية التقسيم على آلية مُنفذة في `try_to_map_unused_to_zeropage()`، تقوم بقراءة الصفحات الموجودة ضمن THP لتحديد الصفحات المملوءة بالصفر. ومع ذلك، يؤدي قراءة الصفحات داخل THP إلى حدوث استثناء #MC ثانٍ داخل النواة، يحدث قبل اكتمال استدعاء `memory_failure()` الأولي، مما يؤدي في النهاية إلى توقف النواة عن العمل (Kernel Panic). انظر تتبع استدعاءات التوقف للنواة الخاصين بالاستثنائين #MC.
First Machine Check occurs // [1]
memory_failure() // [2]
try_to_split_thp_page() split_huge_page() split_huge_page_to_list_to_order() __folio_split() // [3]
remap_page() remove_migration_ptes() remove_migration_pte() try_to_map_unused_to_zeropage() // [4]
memchr_inv() // [5]
Second Machine Check occurs // [6]
Kernel panic
[1] مُفعّل عن طريق الوصول إلى THP تالف (poisoned) بواسطة العتاد في مجال المستخدم، وهو أمر يمكن عادةً التعافي منه بإنهاء العملية المتأثرة.
[2] استدعاء `folio_set_has_hwpoisoned()` قبل `try_to_split_thp_page()`.
[3] تمرير علم إعادة الربط RMP_USE_SHARED_ZEROPAGE إلى دالة `remap_page()`.
[4] محاولة ربط THP غير المستخدمة بصفحة الصفر (zeropage).
[5] إعادة الوصول إلى الصفحات داخل الـ THP التالف في النواة.
[6] مُفعّل داخل النواة، مما يؤدي إلى توقفها عن العمل.
في الخطوة [2]، تقوم `memory_failure()` بتعيين علم التلف على الصفحة الموجودة ضمن THP باستخدام `TestSetPageHWPoison()` قبل استدعاء `try_to_split_thp_page()`.
وبحسب اقتراح ديفيد هيلدنبراند (David Hildenbrand)، يتم إصلاح هذا التوقف بعدم الوصول إلى الصفحة التالفة داخل الـ THP أثناء تحديد صفحة الصفر، مع الاستمرار في فحص الصفحات غير المتأثرة ضمن الـ
If you want to get the best quality for vulnerability data then you always have to consider VulDB.