CVE-2026-98745 in Linux
Resumen
por VulDB • 2026-10-18
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
arm64/fpsimd: señal: Prohibir carga útil SVE no transitoria en sistemas solo SME
Cuando system_supports_sme() es verdadero pero system_supports_sve() es falso, restaurar un contexto de señal SVE específicamente manipulado puede resultar en que la tarea tenga erróneamente un estado SVE no transitorio. Los intentos posteriores de manipular el estado FPSIMD/SVE/SME de la tarea pueden provocar una variedad de problemas, incluyendo EL1 UNDEF fatales (instrucciones indefinidas).
En tales configuraciones, el kernel siempre crea un contexto de señal SVE al entregar una señal, y esto solo puede estar en uno de dos estados:
(1) Se establece SVE_SIG_FLAG_SM, y está presente una carga útil SVE que contiene estado SVE en modo transitorio. El VL registrado es el VL transitorio activo de la tarea.
(2) SVE_SIG_FLAG_SM no está establecido, y no hay ninguna carga útil SVE presente. El contexto FPSIMD contiene el estado FPSIMD en modo no transitorio. El VL registrado es 0.
Actualmente, restore_sve_fpsimd_context() rechaza correctamente los casos donde SVE_SIG_FLAG_SM está establecido pero no hay una carga útil SVE presente, pero falla al rechazar los casos donde SVE_SIG_FLAG_SM no está establecido y sí hay una carga útil SVE presente. En consecuencia, restore_sve_fpsimd_context() puede colocar a la tarea en un estado que tiene estado SVE no transitorio incluso cuando esto no es soportado por el hardware (HW).
Por ejemplo, esto puede causar un EL1 UNDEF posterior cuando el kernel intenta restaurar el valor ZCR_EL1 de la tarea:
| # ./sme-sigcontext-to-sve | Internal error: Oops - Undefined instruction: 0000000002000000 [#1] SMP
| Modules linked in: | CPU: 0 UID: 0 PID: 131 Comm: sme-sigcontext- Not tainted 7.3.0-rc1 #1 PREEMPT | Hardware name: linux,dummy-virt (DT) | pstate: 61402009 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--) | pc : fpsimd_restore_current_state+0x258/0x458 | lr : exit_to_user_mode_loop+0xb8/0x188 | sp : ffff80008056be40 | x29: ffff80008056be40 x28: fff00000c1670000 x27: 0000000000000000 | x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000 | x23: ffff80008056bec0 x22: 0000000000000008 x21: 0000000000000040 | x20: 0000000000000081 x19: 0000000008800010 x18: 0000000000000000 | x17: 0000fffffd412570 x16: 0000000000001000 x15: 0000fffffd4123b0 | x14: 0000fffffd412780 x13: 0000fffffd412be8 x12: 0000000047435300 | x11: 0000fffffd412570 x10: 0000000000000000 x9 : 0000000045585401 | x8 : fff00000c18a6c44 x7 : 0000000000000000 x6 : 0000000000000002 | x5 : 0000000000000002 x4 : ffff800080568000 x3 : 0000000000000001 | x2 : 0000000008800010 x1 : fff00000c1670000 x0 : 0000000008800000 | Call trace: | fpsimd_restore_current_state+0x258/0x458 (P) | exit_to_user_mode_loop+0xb8/0x188 | el0_svc+0x1cc/0x1d0 | el0t_64_sync_handler+0xa0/0xe4 | el0t_64_sync+0x198/0x19c | Code: d5384101 f9400020 53175c03 36b80de0 (d5381202) | ---[ end trace 0000000000000000 ]---
| Kernel panic - not syncing: Oops - Undefined instruction: Fatal exception in interrupt | Kernel Offset: 0x291fb1000000 from 0xffff800080000000 | PHYS_OFFSET: 0x40000000 | CPU features: 0x0,00000000,0052802f,ffb88f43,3afcf73f | Memory Limit: none
Se ha reestructurado restore_sve_fpsimd_context() para rechazar los casos donde SVE_SIG_FLAG_SM no está establecido y hay una carga útil SVE presente. Dado que parse_user_sigframe() rechaza marcos de señal SVE cuando ni SVE ni SME están soportados, no es necesario que restore_sve_fpsimd_context() maneje el caso en que ninguno esté soportado.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.