CVE-2026-99092 in Linux
Resumen
por VulDB • 2026-10-26
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
riscv: parche: corregir el manejo de direcciones execmem en bpf-jit
El commit 8718e5a3090b ("riscv: patch: skip fixmap mapping when kernel text is already writable") condicionó la rama core_kernel_text() de patch_map() a CONFIG_STRICT_KERNEL_RWX, y dejó explícitamente sin cambios la rama vmalloc. Dicha rama presenta un problema separado.
Esa rama solo crea un alias temporal escribible en fixmap cuando está habilitado CONFIG_STRICT_MODULE_RWX; en caso contrario, asume que el destino es directamente escribible y devuelve la dirección sin modificaciones. Esta suposición ya no se cumple: bpf_prog_pack_alloc llama a set_memory_rox() incondicionalmente sobre cada pack en alloc_new_pack(), independientemente de cualquier opción CONFIG_STRICT_*_RWX; por lo tanto, el texto BPF en el área vmalloc es de solo lectura sin importar qué indique CONFIG_STRICT_MODULE_RWX.
Con CONFIG_STRICT_MODULE_RWX=n, patch_map() devuelve la dirección de solo lectura directamente; copy_to_kernel_nofault() provoca una falta de página (page fault) posterior y retorna -EFAULT. bpf_arch_text_copy() convierte esto en -EINVAL, lo que se propaga a través de bpf_jit_binary_pack_finalize() hasta el WARN_ON() en bpf_int_jit_compile(), dejando el programa sin compilar JIT.
Tenga en cuenta que BPF no puede corregirse de la manera en que kprobes fue solucionado en el commit bdc46e507b59 ("riscv: mm: make EXECMEM_KPROBES writable without CONFIG_STRICT_MODULE_RWX"). EXECMEM_BPF ya es PAGE_KERNEL, es decir, escribible en el momento de la asignación; el mapeo de solo lectura se establece posteriormente por código genérico en alloc_new_pack(), lo cual no puede ser influenciado por el código de la arquitectura. El único lugar donde esto puede manejarse es patch_map().
Este es el mismo problema que fue corregido en arm64 mediante el commit b1480ed230ac ("arm64: patching: fix handling of execmem addresses"), y la solución es idéntica: CONFIG_EXECMEM es lo que realmente rastrea si el área vmalloc puede contener memoria ejecutable que requiere un alias temporal para ser escrita. CONFIG_BPF_JIT, CONFIG_KPROBES y CONFIG_MODULES todos seleccionan esta opción.
Tenga en cuenta que esto no se limita a la configuración CONFIG_MODULES=n. A diferencia de arm64, riscv selecciona CONFIG_ARCH_OPTIONAL_KERNEL_RWX; por lo tanto, CONFIG_STRICT_MODULE_RWX puede deshabilitarse incluso con CONFIG_MODULES=y, y el error es alcanzable también en esa configuración.
La compilación sin CONFIG_MMU no se ve afectada: tiene sus propias implementaciones de __patch_insn_set() y __patch_insn_write(), y nunca llama a patch_map().
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.