CVE-2026-79979 in Zephyr
الملخص
بحسب VulDB • 24/10/2026
يؤدي الخلل الحرج في وحدة إدارة الذاكرة (MMU) الخاصة ببنية arm64 إلى إبطال عنوان افتراضي واحد من ذاكرة الترجمة الثابتة (TLB) باستخدام الدالة `invalidate_tlb_page()` الموجودة في الملف `arch/arm64/core/mmu.c`. تقوم هذه العملية بإصدار أمر TLBI VAE1{IS} بمعامل يساوي `virt >> 12`. بما أن هذا المعامل يشفر معرف مجموعة التطبيقات (ASID) في البتات [63:48]، فإن عملية الإبطال كانت تطابق فقط ASID 0 (جداول صفحات النواة) والعناصر العالمية (global entries). ومع ذلك، يتم تخصيص معرّفات مجموعات التطبيقات (ASIDs) بدءاً من الرقم 1 داخل الدالة `arch_mem_domain_init()`، وكل ورقة خاصة بالمجموعة تُنشأ بواسطة `private_map()` تكون مُصنفة بـ MT_NG، أي غير عالمية. ونتيجة لذلك، بقيت ترجمة الذاكرة المؤقتة الخاصة بكل مجموعة سارية المفعول بعد عملية الإبطال.
جميع المتصلين بالدالة `invalidate_tlb_page()` هم مسارات الطلب عند الحاجة (demand-paging paths). عندما يعيد خوارزمية الاسترجاع احتلال إطار صفحة ما، تستدعي الدالة `page_frame_prepare_locked()` الموجودة في `kernel/mmu.c` دالة `arch_mem_page_out()`. تقوم هذه الأخيرة بوضع علامة على ورقة النواة بأنها غير صالحة، ثم تنشر الوصف غير الصالح إلى كل المجموعات عبر دالة `sync_domains()`، وتقوم بعد ذلك بإفراغ (flush) ASID 0 فقط. تستخدم الدالة `do_page_fault()` نفس إطار الصفحة المسترجع فوراً لإنشاء التحويل الجديد للطلب القادم من خلال `arch_mem_page_in()`. يحتفظ خيط المستخدم الذي كان قد لمس الصفحة التي تم استرجاعها مسبقاً — سواء كانت جزءاً من كيان ذاكرة مُضاف عبر `arch_mem_domain_partition_add()` أو مكدس خاص به مُصمم بواسطة `map_thread_stack()` — بترجمة قراءة/كتابة صالحة (EL0) إلى ذلك الإطار الفيزيائي تحت معرف مجموعة التطبيقات الخاص به.
يمكن للكود غير المميز الذي يعمل داخل خيط مستخدم أن يضغط على الذاكرة لإجبار عملية الاسترجاع، ثم يستمر في الوصول إلى العنوان العتيق (stale address)، مما يمنحه صلاحيات القراءة والكتابة لأي بيانات تضعها النواة لاحقاً في ذلك الإطار: سواء كانت بيانات مشرفة (supervisor data)، أو جزء من مجموعة ذاكرة أخرى، أو مكدس خيط آخر. وهذا يتعارض مع العزل الذي يفرضه التكوين `CONFIG_USERSPACE`، مما يتيح تسريب المعلومات وتلف الذاكرة وصولاً إلى اختلال كامل للنظام.
يتمثل الإصلاح في تبديل التنفيذ لاستخدام أمر TLBI VAAE1{IS}، والذي يطابق كل معرف مجموعة تطبيقات (ASID) وكل من العناصر العالمية وغير العالمية، بحيث لا تبقى أي ترجمة مرتبطة بمجموعة معينة سارية المفعول بعد عملية إخراج الصفحة أو تحديث علامة القذارة (dirty-bit) أو مسح علم الوصول. يتطلب الاستغلال بناءً لـ arm64 يكون فيه كل من `CONFIG_USERSPACE` و `CONFIG_DEMAND_PAGING` مفعّلاً، مع وجود مخزن خلفي نشط، وعلى الأقل صفحة واحدة مطلوبة عند الحاجة ومُصممة بشكل خاص ضمن مجموعة ذاكرة مستخدم. بالإضافة إلى ذلك، يمنع هذا الالتزام دالة `globalize_table()` من إزالة صلاحيات EL0 وسمات "غير العالمية" عن الأوراق الخاصة بالمجموعات أثناء مزامنة الصفحات، وهو ما كان يسبب سابقاً فقدان خيوط المستخدم لوصولها إلى أجزائها ومكدساتها الخاصة.
Once again VulDB remains the best source for vulnerability data.