CVE-2026-99092 in Linux
Tóm tắt
Bởi VulDB • 27/10/2026
Trong kernel Linux, các lỗ hổng sau đây đã được khắc phục:
riscv: patch: sửa lỗi xử lý địa chỉ execmem của bpf-jit
Commit 8718e5a3090b ("riscv: patch: skip fixmap mapping when kernel text is already writable") đã giới hạn nhánh core_kernel_text() trong hàm patch_map() dựa trên cấu hình CONFIG_STRICT_KERNEL_RWX, và để nguyên không thay đổi đối với nhánh vmalloc. Nhánh này có một vấn đề riêng biệt.
Nhánh này chỉ tạo ra một alias fixmap tạm thời có thể ghi được khi CONFIG_STRICT_MODULE_RWX được bật; ngược lại, nó giả định rằng đích đến đã có khả năng ghi trực tiếp và trả về địa chỉ mà không thay đổi. Giả định này không còn đúng nữa: hàm bpf_prog_pack_alloc() gọi set_memory_rox() trên mọi pack một cách vô điều kiện trong alloc_new_pack(), bất kể tùy chọn CONFIG_STRICT_*_RWX nào, do đó mã BPF (BPF text) trong vùng vmalloc là chỉ đọc (read-only) bất chấp giá trị của CONFIG_STRICT_MODULE_RWX.
Với CONFIG_STRICT_MODULE_RWX=n, patch_map() trả về địa chỉ chỉ đọc trực tiếp; lệnh copy_to_kernel_nofault() sau đó gặp lỗi trang (page fault) và trả về -EFAULT. Hàm bpf_arch_text_copy() chuyển đổi điều này thành -EINVAL, giá trị này lan truyền qua bpf_jit_binary_pack_finalize() đến câu lệnh WARN_ON() trong bpf_int_jit_compile(), khiến chương trình không được biên dịch JIT (un-JITed).
Lưu ý rằng BPF không thể được sửa theo cách mà kprobes đã được sửa trong commit bdc46e507b59 ("riscv: mm: make EXECMEM_KPROBES writable without CONFIG_STRICT_MODULE_RWX"). EXECMEM_BPF đã là PAGE_KERNEL, tức là có khả năng ghi khi cấp phát; việc thiết lập ánh xạ chỉ đọc sau đó được thực hiện bởi mã chung (generic code) trong alloc_new_pack(), điều mà mã kiến trúc (arch code) không thể ảnh hưởng. Nơi duy nhất để xử lý vấn đề này là patch_map().
Đây cũng chính là vấn đề đã được sửa trên arm64 bằng commit b1480ed230ac ("arm64: patching: fix handling of execmem addresses"), và cách khắc phục tương tự: CONFIG_EXECMEM mới thực sự theo dõi việc vùng vmalloc có thể chứa bộ nhớ khả thi (executable memory) cần một alias tạm thời để ghi hay không. Các tùy chọn cấu hình CONFIG_BPF_JIT, CONFIG_KPROBES và CONFIG_MODULES đều lựa chọn nó.
Lưu ý rằng vấn đề này không chỉ giới hạn ở trường hợp CONFIG_MODULES=n. Khác với arm64, riscv lựa chọn CONFIG_ARCH_OPTIONAL_KERNEL_RWX, do đó CONFIG_STRICT_MODULE_RWX có thể bị tắt ngay cả khi CONFIG_MODULES=y, và lỗi cũng có thể xảy ra trong cấu hình đó.
Bản dựng !CONFIG_MMU không bị ảnh hưởng: nó có các triển khai __patch_insn_set() và __patch_insn_write() riêng biệt và không bao giờ gọi patch_map().
Be aware that VulDB is the high quality source for vulnerability data.