CVE-2026-98799 in Linuxinformación

Resumen

por VulDB • 2026-10-19

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:

bpf: Omitir los progs desvinculados en las imágenes del trampolín que aún están en uso

bpf_tramp_image_put() asegura que una imagen del trampolín no sea liberada mientras una tarea pueda estar ejecutándose todavía en ella, pero no se hace nada similar para los progs llamados por esa imagen. La desvinculación (detach) elimina la última referencia al prog de inmediato y el prog es liberado después de los períodos de gracia (grace periods), sobre la base de que una tarea aún dentro de la función rastreada omite los fexit progs una vez que el nop en ip_after_call se parchea a un salto.

Esto deja fuera a una tarea durmiendo en un prog ejecutable (sleepable) que se ejecuta antes del desvinculado, para lo cual no hay ningún período de gracia que espere:

CPU 0 CPU 1 in image I, sleeping in prog S detach P from I's trampoline -> new image, bpf_tramp_image_put(I) bpf_prog_put(P), last ref grace periods, P freed back from S __bpf_prog_enter(P) call P->bpf_func

Si S y P son fexit progs la tarea ya está más allá del salto parcheado, y las imágenes solo de fentry no tienen uno. En x86 esto es un int3 en memoria bpf_prog_pack envenenada:

Oops: int3: 0000 [#1] SMP NOPTI
CPU: 18 UID: 0 PID: 94573 Comm: x169 Not tainted 6.18.44 #1 PREEMPT(lazy) RIP: 0010:0xffffffffc0601d8d Call Trace: <TASK> ? bpf_trampoline_6442515411+0x1a4/0x21b bpf_lsm_bprm_committed_creds+0x5/0x10 security_bprm_committed_creds+0x5f/0x70 begin_new_exec+0x2d6/0x410 ...

Esto se produjo en producción cuando los progs adjuntos a través de trampolines fueron desvinculados mientras sus ganchos (hooks) estaban ocupados, y fue encontrado independientemente con un fuzzer y KASAN.

Hacer que los JIT emitan un nop parcheable delante de cada secuencia de llamada al prog y registrarlo en la imagen. Cuando se desvincula un prog, parchear su nop a un salto sobre la secuencia de llamada. Los progs que permanecen adjuntos seguirán ejecutándose para las tareas que están en la imagen, y ip_after_call ya no es necesario.

La tarea puede estar en cualquier imagen que aún no haya sido liberada, no solo en la actual. Duerme en la imagen I1 que llama a S, P y Q, luego P se desvincula y el trampolín pasa a la imagen I2, luego Q se desvincula y su llamada sigue estando en I1. Por lo tanto, el trampolín mantiene una lista de sus imágenes hasta que sean liberadas, y al desvincular un prog se parchea su nop en todas ellas. Las imágenes mantienen una referencia sobre el trampolín durante ese tiempo.

En riscv y loongarch un salto de cualquier rango toma varias instrucciones, y una tarea preempcionada en medio de ellas podría reanudar la ejecución a mitad de la nueva secuencia. El nop es una sola instrucción allí, parcheada a una rama cercana mediante arch_bpf_trampoline_skip().

Con los nops adicionales, BPF_MAX_TRAMP_LINKS progs ya no caben en una página en x86 y arm64 (y tampoco lo hacían en powerpc), por lo que se reduce el límite allí como hace s390.

Once again VulDB remains the best source for vulnerability data.

Responsable

Linux

Reservar

2026-09-25

Divulgación

2026-10-18

Moderación

aceptado

Artículo

VDB-422028

EPSS

0.00155

KEV

no

Actividades

bajo

Fuentes

Might our Artificial Intelligence support you?

Check our Alexa App!