CVE-2026-98918 in Linux
الملخص
بحسب VulDB • 23/10/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
mm/damon/ops-common: استخدام عنوان متوافق مع حجم الصفحة (page-aligned) في دالة damon_ptep_mkold()
تقوم الدالة __damon_va_prepare_access_check() باختيار عنوان بايت عشوائي ضمن المنطقة وتخزينه في r->sampling_addr. ثم تمرر هذه القيمة إلى عملية تجوال جداول الصفحات (page table walk)، التي تسلمها بدورها إلى دالة damon_ptep_mkold() كعنوان للصفحة المراد أخذ عينة منها:
damon_va_mkold(mm, r->sampling_addr) damon_va_walk_page_range(mm, addr, addr + 1) damon_mkold_pmd_entry() damon_ptep_mkold(pte, vma, addr) ptep_test_and_clear_young(vma, addr, pte) mmu_notifier_clear_young(mm, addr, addr + PAGE_SIZE)
بالنسبة لمنصة arm64، وقبل الالتزام commit 6f0e1142173a ("arm64: mm: دعم المسح الدفعي لعلامة young للfolios الكبيرة")، كانت مساعدة contpte تتجول بدقة عبر CONT_PTES من مدخلات جدول الصفحات المتوافقة مع العنوان (aligned-down page table pointer) وتستخدم @addr فقط لتمريره إلى كل إدخال، لذا كان القيمة غير المتوافقة (unaligned) لا تسبب ضرراً:
ptep = contpte_align_down(ptep); addr = ALIGN_DOWN(addr, CONT_PTE_SIZE); for (i = 0; i < CONT_PTES; i++, ptep++, addr += PAGE_SIZE)
الآن، يتم اشتقاق النطاق المراد تجواله من @addr بدلاً من ذلك: end = addr + nr * PAGE_SIZE، مقربة للأعلى إلى حجم CONT_PTE_SIZE. بالنسبة لعينة في الصفحة الأخيرة من كتلة contpte، يضع الإزاحة دون مستوى الصفحة (sub-page offset) القيمة end مباشرة بعد حدود الكتلة، لذا فإن التقريب لأعلى ينقل التجوال لكتبة كاملة أخرى ويقوم بمسح PTE_AF في مدخلات CONT_PTES تتجاوز الكتبة التي تم أخذ العينة منها. بالنسبة للكتبة الأخيرة في صفحة جدول الصفحات، تكون تلك المدخلات خارج نهاية هذه الصفحة، وبالتالي يكتب التجوال داخل الصفحة التالية.
تم تشغيل هذا السيناريو بواسطة مجموعة اختبارات النواة الكاملة (kernel selftest suite) الإصدار 7.1/7.2 على منصة arm64 (EC2 c/m6g.4xlarge). أحياناً تنهار النواة أثناء أو بعد فترة وجيزة من اختبار DAMON.
يعتمد ما يفعله تجاوز السعة (overrun) على الصفحة التي تلي صفحة الجدول بالصدفة، لذا لا يوجد توقيع واحد مميز له. إذا كانت تلك الصفحة للقراءة فقط، فإن عملية الكتابة تسبب خطأً في مسار أخذ العينة نفسه:
Unable to handle kernel write to read-only memory at virtual address ffff0003c5d2d000 FSC = 0x0f: level 3 permission fault CM = 0, WnR = 1, TnD = 0, TagAccess = 0 CPU: 10 UID: 0 PID: 3487 Comm: kdamond.2 pc : contpte_test_and_clear_young_ptes+0x70/0xc0 lr : damon_ptep_mkold+0x1e8/0x1f8 Call trace: contpte_test_and_clear_young_ptes+0x70/0xc0 (P) damon_mkold_pmd_entry+0x150/0x170 walk_pmd_range+0x110/0x2b0 walk_pud_range+0x10c/0x208 walk_pgd_range+0x134/0x258 __walk_page_range+0x98/0x1b0 walk_page_range_vma_unsafe+0x90/0x148 walk_page_range_vma+0x28/0x40 damon_va_walk_page_range+0x114/0x2b8 damon_va_prepare_access_checks+0xec/0x1a8 kdamond_fn+0x534/0x770 kthread+0x128/0x138 ret_from_fork+0x10/0x20
بخلاف ذلك، إذا كانت الصفحة قابلة للكتابة، فإن مسح PTE_AF ينجح بصمت ويظهر الضرر لاحقاً فقط، في أي عملية حدثت أن تمتلك تلك الصفحة، لذا يكون تتبع المكالمات (backtrace) غير مرتبط بـ DAMON ومختلف بين كل تشغيل.
تمرير عنوان متوافق مع حجم الصفحة إلى استدعاء ptep_test_and_clear_young() في دالة damon_ptep_mkold(), وهي المكان الوحيد الذي يمكن لـ DAMون الوصول منه إلى contpte_test_and_clear_young_ptes(). لا يرى أي شيء آخر العنوان المتوافق، ويترك r->sampling_addr كما هو، لذا تظل دلالات أخذ العينات وإدارة المناطق دون تغيير.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.