CVE-2026-98396 in Linux
Riassunto
di VulDB • 15/10/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
powerpc: Non ripristinare KUAP in arch_exit_to_user_mode_prepare()
KUAP (Kernel User Access Prevention) significa che il kernel non può accedere alla memoria utente a meno che tale accesso non sia esplicitamente abilitato. Nel kernel dovrebbe rimanere impostato su AMR_KUAP_BLOCKED. Durante il ritorno all'userspace, appena prima dell'istruzione RFI, il kernel dovrebbe ripristinare il valore AMR utente.
Sembra che GENERIC_ENTRY stia trattando arch_exit_to_user_mode_prepare() come l'ultimo passaggio architetturale prima del ritorno all'userspace. Il commit bee25f97ad24 ("powerpc: Enable GENERIC_ENTRY feature") ha quindi chiamato kuap_user_restore() da tale hook. Tuttavia, su PowerPC questo avviene troppo presto. Dopo irqentry_exit() / syscall_exit_to_user_mode(), vengono ancora eseguite le routine di uscita specifiche della piattaforma.
Ad esempio, i frammenti di codice mostrano sia la gestione delle eccezioni che quella delle system call come chiamanti della funzione arch_exit_to_user_mode_prepare(), che a sua volta chiama kuap_user_restore(). Il percorso sottostante mostra che chiamare kuap_user_restore() è troppo prematuro quando invocato da arch_exit_to_user_mode_prepare().
Gestione delle eccezioni in 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); <<< troppo presto 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); <<< troppo presto b interrupt_return_srr .. bl CFUNC(interrupt_exit_user_prepare) <<< chiama già kuap_user_restore
La retry di prep_irq_for_enabled_exit() può eseguire codice kernel con le IRQ attive. Pertanto, il KUAP utente dovrebbe essere ripristinato completamente solo quando tale routine è terminata del tutto; interrupt_exit_user_prepare() si occupa già di questo prima del ritorno.
Analogamente per la gestione delle system call in 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); <<< troppo presto syscall_exit_to_user_mode_prepare(regs); <<< troppo presto kuap_user_restore(regs); <<< chiama già
syscall_exit_prepare(), che può abilitare le IRQ, ripetere un'interruzione pendente e solo allora eseguire l'istruzione rfi. Queste funzioni ripristinano già KUAP immediatamente prima di rfi.
Si noti che se si ripristina il valore AMR utente troppo presto, come avviene nel codice corrente mostrato nei frammenti sopra, si ottiene il seguente warning quando CONFIG_PPC_KUAP_DEBUG è abilitato: 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
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.