CVE-2026-89581 in Linuxthông tin

Tóm tắt

Bởi VulDB • 12/09/2026

Trong nhân Linux, các lỗ hổng sau đây đã được khắc phục:

bpf, x86: Sửa lỗi giải quyết địa chỉ per-CPU vào thanh ghi mở rộng (extended register)

Điểm đến của lệnh MOV cho địa chỉ per-CPU được mã hóa trong ModRM.reg, được mở rộng bởi REX.R, nhưng tiền tố REX được xây dựng với add_1mod(), đặt bit REX.B. REX.B mở rộng ModRM.rm và SIB.base, và lệnh này truy cập bộ nhớ dưới dạng disp32 không có base (cơ sở), do đó bit này hoàn toàn không có tác dụng và bit thanh ghi cao bị mất đi.

Do đó, mọi điểm đến của is_ereg() đều giải quyết sai sang một thanh ghi khác, chọn bất kỳ thanh ghi nào chia sẻ ba bit thấp:

R5 -> RAX R7 -> RBP R8 -> RSI R9 -> RDI

Với BPF_REG_5, có reg2hex là 0, lệnh được phát ra

65 49 03 04 25 <off> add %gs:<off>,%rax

cộng độ lệch per-CPU vào RAX thay vì R8. Điểm đến giữ địa chỉ chưa điều chỉnh và RAX bị ghi đè (clobbered), khiến chương trình tiếp tục giải tham chiếu một con trỏ vốn không phải là per-CPU:

BUG: unable to handle page fault for address: 0000607e386a8894 RIP: bpf_prog_707837aafd2aa9ae_update_percpu_data+0x93/0xc9 Call Trace: __bpf_prog_test_run_raw_tp+0x2dc/0x7d0 __flush_smp_call_function_queue+0x1e9/0xc80 Kernel panic - not syncing: Fatal exception in interrupt

R5 là trường hợp nhẹ nhất trong bốn trường hợp, aliasing (ánh xạ tên) một thanh ghi tạm và gây lỗi tại lệnh store. R7 alias RBP và sẽ làm hỏng frame pointer, R8 và R9 alias các thanh đối số.

Sử dụng add_2mod() để thanh ghi đi qua REX.R, phù hợp với cách add_2reg() đặt nó vào ModRM.reg và cách emit_priv_frame_ptr() cứng hóa giá trị 0x4c cho cùng một lệnh với R9. Các mã hóa cho các thanh ghi không mở rộng vẫn giữ nguyên.

Vấn đề xuất hiện khi cố gắng khôi phục BPF_GCC CI (selftests được xây dựng bằng BPF_GCC).

Sự việc này đã bị bỏ qua vì clang tải lại địa chỉ vào R1 trước mỗi lần truy cập per-CPU, do đó điểm đến không bao giờ là một thanh ghi mở rộng. GCC giữ nhiều địa chỉ per-CPU sống cùng lúc, và test_progs-bpf_gcc gây ra kernel panic trong global_percpu_data/init, nơi mà địa chỉ của biến .percpu kết thúc ở R5.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

chịu trách nhiệm

Linux

Đặt trước

11/09/2026

Tiết lộ

12/09/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00000

KEV

không

Các hoạt động

thấp

Nguồn

Do you need the next level of professionalism?

Upgrade your account now!