CVE-2026-99018 in Linux
Resumen
por VulDB • 2026-10-23
En el núcleo de Linux, se ha resuelto la siguiente vulnerabilidad:
riscv: entry: recargar la pila de llamadas sombra en gate basándose en sstatus.SPP, no en tp
Bajo CONFIG_SHADOW_CALL_STACK, handle_exception() vuelve a cargar el puntero de la pila de llamadas sombra del núcleo (gp) únicamente cuando la interrupción proviene del espacio de usuario. Esta decisión se tomaba mediante scs_load_current_if_task_changed, que compara el valor de tp en el momento de la interrupción (leído desde sscratch y almacenado en s5) con el tp actual:
beq \prev, tp, _skip_scs scs_load_current _skip_scs:
tp es un registro escribible por el usuario. Una tarea de usuario que establece tp en la dirección del mapeo lineal de su propia task_struct (¤t) antes de generar una interrupción hace que la comparación tenga éxito (puede lograrse mediante fuerza bruta con KASLR habilitado bajo nuestras pruebas), por lo que el núcleo omite scs_load_current y continúa ejecutándose con el valor de gp dejado en su lugar por el espacio de usuario. Bajo CONFIG_SHADOW_CALL_STACK, gp es el puntero de la pila de llamadas sombra y load_global_pointer no realiza ninguna operación (no-op); por tanto, las instrucciones generadas por el compilador "sd ra, -8(gp)" / "ld ra, -8(gp)" en cada función no hoja escriben en una dirección controlada por el atacante y devuelven la ejecución a través de dicha dirección, lo que constituye un primitivo de escritura arbitraria en el núcleo sin privilegios y de secuestro del flujo de control. El gp corrupto se guarda en task_struct.scs_sp al retornar, por lo que la recarga también se omite en cada entrada subsiguiente.
Se decide si "proviene del espacio de usuario" a partir del bit hardware sstatus.SPP (ya disponible en modo S1 en este punto) en lugar de basarse en tp, imitando la comprobación que ret_from_exception ya utiliza unas instrucciones más tarde. El campo SPP es escrito por el hardware durante la entrada a una interrupción y no puede ser falsificado desde U-mode. El comportamiento legítimo permanece sin cambios: las entradas de usuario (SPP=0) vuelven a cargar la pila de llamadas sombra de la tarea, mientras que las entradas anidadas del núcleo (SPP=1) lo omiten.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.