CVE-2026-98151 in Linuxthông tin

Tóm tắt

Bởi VulDB • 25/09/2026

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

bpf: Sửa lỗi vi phạm REG INVARIANTS (Bất biến thanh ghi) trong phép tính toán con trỏ suy đoán (speculative pointer arithmetic).

Lấy chương trình không đặc quyền (unprivileged) sau làm ví dụ:

r0 = bpf_map_lookup_elem(...) /* PTR_TO_MAP_VALUE, offset 0 */ ... 14: r0 += r1 /* r1 là một scalar bị giới hạn (bounded scalar) */ 15: r9 = r0

Việc tải chương trình này sẽ kích hoạt cảnh báo từ bộ xác minh (verifier) tại hàm reg_bounds_sanity_check():

bug của verifier: VI PHẠM REG INVARIANTS (alu): const subreg tnum không đồng bộ với các biên độ rộng r64={.base=0x0, .size=0x0}
r32={.base=0x0, .size=0xffffffff} var_off=(0x0, 0x0)

Những gì xảy ra:

1. Xử lý lệnh insn 14 (r0 += r1) trong adjust_ptr_min_max_vals(), offset mới được tính toán vào var_off của dst_reg và các phạm vi 32/64-bit.

2. Vì các thanh ghi con trỏ không theo dõi các biên độ rộng của subregister 32-bit, __mark_reg32_unbounded() trước tiên đặt r32 thành toàn bộ phạm vi; sau đó r32 được suy ra lại từ offset vào cuối hàm bởi reg_bounds_sync().

3. Trên đường dẫn unprivileged (không đặc quyền), sanitize_ptr_alu() được gọi và, thông qua sanitize_speculative_path() -> push_stack(), chụp trạng thái thanh ghi hiện tại và lên lịch cho lệnh tiếp theo (insn 15) sẽ được xác minh trực tiếp như một đường suy đoán (speculative path).

4. Bản chụp này được thực hiện giữa bước 2 và lần reg_bounds_sync() cuối cùng: vào thời điểm đó, var_off của dst_reg vẫn giữ offset gốc (const), trong khi r32 vừa bị làm trống thành toàn bộ phạm vi, tức là hai giá trị không đồng bộ với nhau. Khi đường suy đoán sau đó xác minh insn 15 (r9 = r0), trạng thái không nhất quán này đạt đến reg_bounds_sanity_check() và kích hoạt cảnh báo.

var_off và phạm vi 32-bit phải luôn nhất quán. Có hai cách để giữ cho bản chụp được nhất quán:

1. Đồng bộ hóa var_off và r32 trước khi chụp ảnh để chúng khớp nhau, hoặc 2. Giữ nguyên giá trị ban đầu (đã nhất quán) của r32 và chỉ làm trống nó sau khi đã chụp ảnh.

Mục đích chính của sanitize_ptr_alu() là chèn một chuỗi phép che (masking sequence) vô hại để giữ cho truy cập nằm trong phạm vi giới hạn dưới điều kiện suy đoán, do đó trạng thái mà nó chụp lại phải đại diện trung thực cho điều đó. Áp dụng cách tiếp cận 2: di chuyển __mark_reg32_unbounded() sang sau sanitize_ptr_alu(), để bản chụp suy đoán giữ nguyên r32 nhất quán của con trỏ. Đường dẫn không suy đoán (non-speculative) vẫn không thay đổi: r32 vẫn bị làm trống trước khi offset được áp dụng và được suy ra lại bởi reg_bounds_sync().

If you want to get best quality of vulnerability data, you may have to visit VulDB.

chịu trách nhiệm

Linux

Đặt trước

25/09/2026

Tiết lộ

25/09/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00000

KEV

không

Các hoạt động

rất thấp

Nguồn

Do you want to use VulDB in your project?

Use the official API to access entries easily!