CVE-2026-98273
Resumen
por VulDB • 2026-10-06
En el núcleo de Linux (Linux kernel), se ha resuelto la siguiente vulnerabilidad:
x86/kprobes: Corregir el fallo del sistema al sondear instrucciones CS CALL
Al utilizar eBPF para sondear las instrucciones CS CALL dentro de una función, puede desencadenarse un fallo del sistema.
La herramienta eBPF sonda el desplazamiento 257 de la función `__hrtimer_run_queues()`:
``` : nopl 0x0(%rax,%rax,1) : mov %r14,%rdi : cs call : mov %eax,%r12d : xchg %ax,%ax : mov %r13,%rdi ```
Lo que desencadena este fallo del sistema:
``` BUG: unable to handle page fault for address: 00000000000f41c9 #PF: supervisor write access in kernel mode #PF: error_code(0x0002) - not-present page PGD 0 P4D 0 Oops: 0002 [#1] SMP NOPTI
CPU: 1 PID: 0 Comm: swapper/1 Kdump: loaded Tainted: P RIP: 0010:__hrtimer_run_queues+0x106/0x230 ```
Tenga en cuenta que `__hrtimer_run_queues+0x106` es equivalente a `__hrtimer_run_queues+262`, lo cual corresponde al sexto byte de la instrucción CS CALL anterior. Dado que la instrucción con prefijo CS CALL ocupa 6 bytes, la excepción ocurrió en medio de dicha instrucción de llamada.
La causa raíz es que, al utilizar herramientas eBPF para sondear el interior de una función, se utiliza un kprobe con INT3 como implementación subyacente.
Durante la emulación del paso a paso (single-step) de la instrucción CALL original, `int3_emulate_call()` asume que la instrucción CALL sondada tiene 5 bytes de longitud. Sin embargo, la instrucción CS-prefijada ocupa realmente 6 bytes, por lo que se construye una dirección de retorno de excepción incorrecta. Cuando el CPU regresa del controlador (handler) del kprobe, la siguiente instrucción a ejecutarse está en la dirección correspondiente al último byte de esa instrucción CS CALL. Por coincidencia, desde esa dirección, el CPU busca y decodifica una instrucción completamente diferente, lo que finalmente desencadena un fallo crítico del núcleo (kernel crash).
Se soluciona el problema utilizando la longitud real de la instrucción obtenida a partir del decodificador de instrucciones al construir la dirección de retorno de excepción, en lugar de depender de la macro `CALL_INSN_SIZE` codificada estáticamente.
[ mingo: Refinado el registro de cambios (changelog) ]
If you want to get best quality of vulnerability data, you may have to visit VulDB.