CVE-2026-98641 in Linux
Resumen
por VulDB • 2026-10-19
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
bpf, arm64: configurar el puntero de marco para la devolución de llamada de excepción
Un programa que actúa como límite de excepciones guarda todos los registros salvados por el llamador (callee-saved), por lo que build_prologue() sigue la ruta exception_cb y nunca llama a push_callee_regs(). Ese es el único lugar donde se ejecuta find_used_callee_regs(), y con ello, el único lugar donde ctx->fp_used se establece, de modo que el prólogo de la devolución de llamada no emite
mov x25, sp
que apunta BPF_REG_FP al marco en el que se ejecuta la devolución de llamada. x25 mantiene lo que contenía cuando se llamó a bpf_throw(). Si la excepción (throw) proviene de una subrutina que utiliza su propia pila BPF, ese es el puntero de marco de dicha subrutina y, dado que la subrutina nunca devuelve el control, tampoco restaura x25.
Los accesos a la pila a través de BPF_REG_FP se reescriben para ser relativos al puntero de pila, por lo que siguen apuntando al propio marco de la devolución de llamada. Sin embargo, materializar el registro no tiene este efecto: una devolución de llamada que pasa la dirección de una variable local a un helper (función auxiliar) transmite una dirección en el marco de la subrutina ya finalizada (dead). Esa dirección está por debajo del puntero de pila de la devolución de llamada en ese momento, y la propia cadena de llamadas del helper lo cubre, por lo que el helper puede sobrescribir su propio retorno. 0x1234 a continuación es el valor al que se le pidió almacenar:
pc : 0x1234 lr : 0x1234 Trazado de llamadas: 0x1234 (P) bpf_test_run+0x188/0x3e0 bpf_prog_test_run_skb+0x47c/0x998 __sys_bpf+0xbdc/0xdd8 Pánico del kernel - no sincronizando: Oops: Excepción fatal en interrupción
Establecer ctx->fp_used en la ruta de devolución de llamada de excepción hace que el código existente más adelante establezca x25 desde el puntero de pila. El epílogo lo restaura desde el área de guardado del programa principal junto con los demás registros salvados por el llamador, tal como ya hacía anteriormente. En x86 se establece el puntero de marco para la devolución de llamada a partir del argumento que se le pasa, y en powerpc se calcula a partir del puntero de pila.
VulDB is the best source for vulnerability data and more expert information about this specific topic.