CVE-2026-98396
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
powerpc: No restaurar KUAP en arch_exit_to_user_mode_prepare()
KUAP significa que el kernel no puede tocar la memoria de usuario a menos que se habilite explícitamente. En el kernel debe permanecer AMR_KUAP_BLOCKED. Al volver al espacio de usuario, justo antes de RFI, el kernel debe restaurar el valor AMR del usuario.
Parece que GENERIC_ENTRY podría estar tratando arch_exit_to_user_mode_prepare() como el último paso de la arquitectura antes de volver al espacio de usuario.
Leer descripción completaMostrar menos
El commit bee25f97ad24 ("powerpc: Enable GENERIC_ENTRY feature") por tanto llamó a kuap_user_restore() desde ese hook. Pero en PowerPC eso es demasiado pronto. Después de irqentry_exit() / syscall_exit_to_user_mode() todavía ejecutamos rutinas de salida específicas de la plataforma.
Por ejemplo, fragmentos de código que muestran tanto el manejo de excepciones como el manejo de llamadas al sistema como los llamadores de la función arch_exit_to_user_mode_prepare(), que hace kuap_user_restore(). La siguiente ruta muestra que llamar a kuap_user_restore() es demasiado pronto cuando se invoca desde arch_exit_to_user_mode_prepare().
Manejo de excepciones en exceptions-64s.S =======================================
La reintentación de prep_irq_for_enabled_exit() puede ejecutar código del kernel con las IRQ activadas. Por tanto, solo cuando esa rutina ha terminado por completo es cuando KUAP del usuario debe restaurarse por completo, lo que interrupt_exit_user_prepare() ya gestiona antes de retornar.
De forma similar para el manejo de llamadas al sistema en interrupt_64.S ======================================================
syscall_exit_prepare(), que puede habilitar las IRQ, reproducir una interrupción pendiente y solo entonces ejecutar rfi. Esas funciones ya restauran KUAP justo antes de rfi.
Detalles técnicos trazas, registros y código del informe original
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); <<< demasiado pronto 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); <<< demasiado pronto b interrupt_return_srr .. bl CFUNC(interrupt_exit_user_prepare) <<< ya llama a kuap_user_restore 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); <<< demasiado pronto syscall_exit_to_user_mode_prepare(regs); <<< demasiado pronto kuap_user_restore(regs); <<< ya lo llama Tenga en cuenta que si restauramos el AMR del usuario demasiado pronto, como en el código actual mostrado en los fragmentos anteriores, obtenemos la siguiente advertencia cuando CONFIG_PPC_KUAP_DEBUG está habilitado: 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
Traducción automática del texto original de NVD (en inglés).
CVSS
NVD no ha asignado puntuación CVSS a esta CVE (habitual desde el cambio de política de abril de 2026).
Probabilidad de explotación (EPSS)
- Probabilidad de explotación en los próximos 30 días
- 0.20 %
- Percentil entre todas las CVEs puntuadas
- 9
- Fecha de la puntuación
- 21/10/2026
EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).
Tecnologías afectadas (1)
⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.
Referencias
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-98396",
"cveTags": [],
"metrics": {},
"affected": [
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"affectedData": [
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "02565a782c1ee7e8ada38ad24a698e01d6ea9ff8",
"lessThan": "c8e80c19c3b9c8db83a14fab00445a6064992442",
"versionType": "git"
},
{
"status": "affected",
"version": "02565a782c1ee7e8ada38ad24a698e01d6ea9ff8",
"lessThan": "c2549d749539487239475fbc8c614a1f9244d655",
"versionType": "git"
}
],
"programFiles": [
"arch/powerpc/include/asm/entry-common.h"
],
"defaultStatus": "unaffected"
},
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "7.2"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "7.2",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "7.2.7",
"versionType": "semver",
"lessThanOrEqual": "7.2.*"
},
{
"status": "unaffected",
"version": "7.3",
"versionType": "original_commit_for_fix",
"lessThanOrEqual": "*"
}
],
"programFiles": [
"arch/powerpc/include/asm/entry-common.h"
],
"defaultStatus": "affected"
}
]
}
],
"published": "2026-10-14T14:17:50.530",
"references": [
{
"url": "https://git.kernel.org/stable/c/c2549d749539487239475fbc8c614a1f9244d655",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/c8e80c19c3b9c8db83a14fab00445a6064992442",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}
],
"vulnStatus": "Received",
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\npowerpc: Do not restore KUAP in arch_exit_to_user_mode_prepare()\n\nKUAP means kernel cannot touch user memory unless it explicitly is\nenabled. In the kernel it should stay AMR_KUAP_BLOCKED. While returning\nto userspace just before RFI, kernel should restore the user AMR value\nback.\n\nLooks like GENERIC_ENTRY might be treating arch_exit_to_user_mode_prepare()\nas the last architecture step before returning to userspace.\ncommit bee25f97ad24 (\"powerpc: Enable GENERIC_ENTRY feature\")\ntherefore called kuap_user_restore() from that hook. But on PowerPC that\nis too early. After irqentry_exit() / syscall_exit_to_user_mode() we\nstill run platform specific exit routines.\n\ne.g. code snippets showing both exception handling and system call\nhandling as the callers of function arch_exit_to_user_mode_prepare()\nwhich does kuap_user_restore(). The below path shows that calling\nkuap_user_restore() is too early when called from\narch_exit_to_user_mode_prepare().\n\nException handling in exceptions-64s.S\n=======================================\n\nbl\tCFUNC(do_page_fault)\n\t ..DEFINE_INTERRUPT_HANDLER_ASYNC(do_page_fault)\n\t arch_interrupt_async_enter_prepare(regs);\n\t state = irqentry_enter(regs);\n\t instrumentation_begin();\n\t irq_enter_rcu();\n\t handler(regs);\n\t nap_adjust_return(regs);\n\t irq_exit_rcu();\n\t instrumentation_end();\n\t arch_interrupt_async_exit_prepare(regs);\n\t irqentry_exit(regs, state); \t\t <<< too early\n\t irqentry_exit_to_user_mode()\n\t\t __exit_to_user_mode_prepare(regs, EXIT_TO_USER_MODE_WORK_IRQ);\n\t\t arch_exit_to_user_mode_prepare(regs, ti_work); <<< too early\nb\tinterrupt_return_srr\n\t\t.. bl\tCFUNC(interrupt_exit_user_prepare) <<< already calls kuap_user_restore\n\nprep_irq_for_enabled_exit() retry can run kernel code with IRQs on. So\nonly when that routine is fully finished is when the user KUAP should be\nfully restored which interrupt_exit_user_prepare() already takes care of\nbefore returning.\n\nSimilarly for system call handling in interrupt_64.S\n======================================================\n\n\tbl\tCFUNC(system_call_exception)\n\n.Lsyscall_exit:\n\taddi\tr4,r1,STACK_INT_FRAME_REGS\n\tli\tr5,0 /* !scv */\n\tbl\tCFUNC(syscall_exit_prepare)\n\t\t .. kuap_assert_locked();\n\t\t syscall_exit_to_user_mode(regs); <<< too early\n\t\t syscall_exit_to_user_mode_prepare(regs); <<< too early\n \t\t kuap_user_restore(regs); <<< already calls\n\nsyscall_exit_prepare(), which can enable IRQs, replay a pending\ninterrupt, and only then rfi. Those functions already restore KUAP\nimmediately before rfi.\n\nNote that if we restore the user AMR too early like in the current code\nas shown from the code snippets above, then we get the following warning\nwhen CONFIG_PPC_KUAP_DEBUG is enabled:\n WARNING: arch/powerpc/include/asm/book3s/64/kup.h:293 at interrupt_exit_user_prepare+0x1a0/0x1c0\n Hardware name: IBM pSeries (emulated by qemu) POWER10 (architected)\n TRAP: 0700\n LR: c00000000000d8d4 CTR: c0000000021fe500\n MSR: <SF,EE,ME,IR,DR,RI,LE> CR: 44000804 XER: 20040000\n interrupt_exit_user_prepare+0x1a0/0x1c0\n interrupt_return_srr_user+0x8/0x12c"
}
],
"lastModified": "2026-10-19T10:18:44.197",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}