CVE-2026-98396 in Linux
الملخص
بحسب VulDB • 14/10/2026
في نواة Linux، تم حل الثغرة التالية:
powerpc: عدم استعادة KUAP في arch_exit_to_user_mode_prepare()
يعني KUAP أن النواة لا يمكنها لمس ذاكرة المستخدم إلا إذا كان ذلك مفعلاً صراحةً. داخل النواة يجب أن تظل AMR_KUAP_BLOCKED. أثناء العودة إلى مساحة المستخدم (userspace) مباشرة قبل RFI، يجب على النواة استعادة قيمة AMR الخاصة بالمستخدم مرة أخرى.
يبدو أن GENERIC_ENTRY يعامل arch_exit_to_user_mode_prepare() على أنها الخطوة الأخيرة المحددة للعمارة قبل العودة إلى مساحة المستخدم. لذلك، في commit bee25f97ad24 ("powerpc: Enable GENERIC_ENTRY feature") تم استدعاء kuap_user_restore() من ذلك الخطاف (hook). لكن هذا مبكر جداً بالنسبة لـ PowerPC. بعد irqentry_exit() / syscall_exit_to_user_mode() ما زلنا ننفذ روتينات الخروج الخاصة بالمنصة.
على سبيل المثال، مقاطع الكود التي تظهر كلًا من معالجة الاستثناءات ومعالجة مكالمات النظام كمتصلين للدالة arch_exit_to_user_mode_prepare() والتي تقوم بـ kuap_user_restore(). المسار أدناه يوضح أن استدعاء kuap_user_restore() مبكر جداً عند القيام به من داخل arch_exit_to_user_mode_prepare().
معالجة الاستثناء في exceptions-64s.S =======================================
bl CFUNC(do_page_fault) ..DEFINE_INTERRUPT_HANDLER_ASYNC(do_page_fault) arch_interrupt_async_enter_prepare(regs); state = irqentry_enter(regs); instrumentation_begin(); irq_enter_rcu(); handler(regs); nap_adjust_return(regs); irq_exit_rcu(); instrumentation_end(); arch_interrupt_async_exit_prepare(regs); irqentry_exit(regs, state); <<< مبكر جداً irqentry_exit_to_user_mode() __exit_to_user_mode_prepare(regs, EXIT_TO_USER_MODE_WORK_IRQ); arch_exit_to_user_mode_prepare(regs, ti_work); <<< مبكر جدًا b interrupt_return_srr .. bl CFUNC(interrupt_exit_user_prepare) <<< يستدعي بالفعل kuap_user_restore
يمكن أن يؤدي retry في prep_irq_for_enabled_exit() إلى تشغيل كود النواة مع تفعيل IRQs. لذلك، يجب استعادة KUAP الخاصة بالمستخدم بشكل كامل فقط عندما ينتهي هذا الروتين تمامًا، وهو ما يتعامل معه interrupt_exit_user_prepare() بالفعل قبل العودة.
وبالمثل بالنسبة لمعالجة مكالمات النظام في interrupt_64.S ======================================================
bl CFUNC(system_call_exception)
.Lsyscall_exit: addi r4,r1,STACK_INT_FRAME_REGS li r5,0 /* !scv */ bl CFUNC(syscall_exit_prepare) .. kuap_assert_locked(); syscall_exit_to_user_mode(regs); <<< مبكر جدًا syscall_exit_to_user_mode_prepare(regs); <<< مبكر جدًا kuap_user_restore(regs); <<< يستدعي بالفعل
تستطيع syscall_exit_prepare() تفعيل IRQs، وإعادة تشغيل مقاطعة معلقة، ثم تنفيذ rfi فقط. هذه الوظائف تقوم باستعادة KUAP مباشرة قبل RFI.
نلاحظ أنه إذا قمنا باستعادة AMR الخاصة بالمستخدم مبكرًا جدًا كما هو الحال في الكود الحالي كما يظهر من مقاطع الكود أعلاه، فسنحصل على التحذير التالي عند تفعيل CONFIG_PPC_KUAP_DEBUG: WARNING: arch/powerpc/include/asm/book3s/64/kup.h:293 at interrupt_exit_user_prepare+0x1a0/0x1c0 Hardware name: IBM pSeries (emulated by qemu) POWER10 (architected) TRAP: 0700 LR: c00000000000d8d4 CTR: c0000000021fe500 MSR: <SF,EE,ME,IR,DR,RI,LE> CR: 44000804 XER: 20040000 interrupt_exit_user_prepare+0x1a0/0x1c0 interrupt_return_srr_user+0x8/0x12c
If you want to get best quality of vulnerability data, you may have to visit VulDB.