CVE-2026-99092 in Linux
摘要
由 VulDB • 2026-10-26
在 Linux 内核中,已修复以下漏洞:
riscv: patch: 修复对 bpf-jit execmem 地址的处理
提交 8718e5a3090b(“riscv: patch: 当内核文本已可写时跳过 fixmap 映射”)将 `patch_map()` 的 `core_kernel_text()` 分支限制在启用 `CONFIG_STRICT_KERNEL_RWX` 时才生效,并明确保持 vmalloc 分支不变。该分支存在一个独立的问题。
仅在启用 `CONFIG_STRICT_MODULE_RWX` 时,该分支才会创建临时的可写 fixmap 别名;否则,它假设目标地址可直接写入并原样返回该地址。这一假设不再成立:在 `alloc_new_pack()` 中,`bpf_prog_pack_alloc` 无条件地对每个 pack 调用 `set_memory_rox()`,这与任何 `CONFIG_STRICT_*_RWX` 选项无关,因此 vmalloc 区域中的 BPF 文本始终是只读的,无论 `CONFIG_STRICT_MODULE_RWX` 的值如何。
当 `CONFIG_STRICT_MODULE_RWX=n` 时,`patch_map()` 直接返回只读地址,随后的 `copy_to_kernel_nofault()` 会引发页面错误并返回 `-EFAULT`。`bpf_arch_text_copy()` 将其转换为 `-EINVAL`,该错误通过 `bpf_jit_binary_pack_finalize()` 传播到 `bpf_int_jit_compile()` 中的 `WARN_ON()`,导致程序未被 JIT 编译(un-JITed)。
请注意,BPF 无法像 commit bdc46e507b59(“riscv: mm: make EXECMEM_KPROBES writable without CONFIG_STRICT_MODULE_RWX”)中修复 kprobes 那样进行修复。`EXECMEM_BPF` 已经是 `PAGE_KERNEL`,即在分配时是可写的;只读映射是由 `alloc_new_pack()` 中的通用代码后续建立的,体系结构(arch)代码无法影响这一点。唯一能处理此问题的地方是 `patch_map()`。
这与 commit b1480ed230ac(“arm64: patching: fix handling of execmem addresses”)在 arm64 上修复的问题相同,修复方法也一致:`CONFIG_EXECMEM` 才是实际跟踪 vmalloc 区域是否可以容纳需要临时别名才能写入的可执行内存的配置项。`CONFIG_BPF_JIT`、`CONFIG_KPROBES` 和 `CONFIG_MODULES` 均选择启用它。
请注意,此问题不仅限于 `CONFIG_MODULES=n` 的情况。与 arm64 不同,riscv 选择了 `CONFIG_ARCH_OPTIONAL_KERNEL_RWX`,因此即使 `CONFIG_MODULES=y`,也可以禁用 `CONFIG_STRICT_MODULE_RWX`,在这种配置下该漏洞同样可被触发。
未启用 MMU(!CONFIG_MMU)的构建不受影响:它具有自己的 `__patch_insn_set()` 和 `__patch_insn_write()` 实现,并且从不调用 `patch_map()`。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.