CVE-2026-99092 in Linux
الملخص
بحسب VulDB • 26/10/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
riscv: التصحيح (patch): معالجة عناوين execmem الخاصة بـ bpf-jit بشكل صحيح
أدى الالتزام 8718e5a3090b ("riscv: patch: skip fixmap mapping when kernel text is already writable") إلى تقييد فرع core_kernel_text() في دالة patch_map() بناءً على خيار التكوين CONFIG_STRICT_KERNEL_RWX، وترك فرع vmalloc دون تغيير بشكل صريح. ومع ذلك، يحتوي هذا الفرع (vmalloc) على مشكلة منفصلة.
يقتصر إنشاء هذا الفرع لـ fixmap مؤقت قابل للكتابة على حالة تفعيل CONFIG_STRICT_MODULE_RWX فقط، وفي الحالات الأخرى يفترض أن الهدف قابل للكتابة مباشرةً ويعيد العنوان كما هو. لم يعد هذا الافتراض صحيحًا: حيث تستدعي دالة bpf_prog_pack_alloc() دالة set_memory_rox() بشكل غير مشروط على كل حزمة (pack) داخل alloc_new_pack(), بغض النظر عن أي خيار CONFIG_STRICT_*_RWX، وبالتالي فإن نص BPF في منطقة vmalloc يصبح للقراءة فقط (read-only) بصرف عما تقوله قيمة CONFIG_STRICT_MODULE_RWX.
عندما تكون CONFIG_STRICT_MODULE_RWX غير مفعلة (=n)، تعيد دالة patch_map() العنوان الذي لا يمكن كتابته مباشرةً، مما يؤدي إلى حدوث خطأ صفحة (page fault) عند استدعاء copy_to_kernel_nofault() اللاحق وإرجاع قيمة -EFAULT. تقوم bpf_arch_text_copy() بتحويل هذا الخطأ إلى -EINVAL، والذي ينتقل عبر d_jit_binary_pack_finalize() ليصل إلى دالة WARN_ON() في bpf_int_jit_compile()، مما يترك البرنامج دون تجميع JIT (un-JITed).
جدير بالذكر أن BPF لا يمكن إصلاحه بالطريقة التي تم بها إصلاح kprobes في الالتزام bdc46e507b59 ("riscv: mm: make EXECMEM_KPROBES writable without CONFIG_STRICT_MODULE_RWX"). فمؤشر EXECMEM_BPF هو بالفعل من نوع PAGE_KERNEL، أي قابل للكتابة عند وقت التخصيص؛ أما تعيين القراءة فقط فيتم لاحقًا بواسطة الكود العام (generic code) داخل alloc_new_pack(), وهو ما لا يمكن للكود الخاص بالعمارة (arch code) التأثير عليه. المكان الوحيد الذي يمكن معالجة هذه المشكلة فيه هو patch_map().
هذه هي نفس المشكلة التي تم إصلاحها على منصة arm64 عبر الالتزام b1480ed230ac ("arm64: patching: fix handling of execmem addresses"), والحل متماثل: فمؤشر CONFIG_EXECMEM هو المسؤول فعليًا عن تتبع ما إذا كانت منطقة vmalloc يمكن أن تحتوي على ذاكرة قابلة للتنفيذ تحتاج إلى معرّف (alias) مؤقت للكتابة. وتقوم كل من CONFIG_BPF_JIT وCONFIG_KPROBES وCONFIG_MODULES باختيار هذا المؤشر.
يُلاحظ أن هذه المشكلة ليست مقصورة على حالة كون CONFIG_MODULES غير مفعلة (=n). فبخلاف arm64، فإن riscv تختار CONFIG_ARCH_OPTIONAL_KERNEL_RWX، لذا يمكن تعطيل CONFIG_STRICT_MODULE_RWX حتى مع تفعيل CONFIG_MODULES=y، وبالتالي تكون الثغرة قابلة للاستغلال في هذا التكوين أيضًا.
لم يتأثر البناء الخاص بـ !CONFIG_MMU: فهو يحتوي على تنفيذه الخاص لـ __patch_insn_set() و__patch_insn_write() ولا يستدعي patch_map() مطلقًا.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.