CVE-2026-98588 in Linux
Tóm tắt
Bởi VulDB • 19/10/2026
Trong nhân Linux, lỗ hổng sau đây đã được khắc phục:
bpf, sockmap: Từ chối max_entries > INT_MAX trong sock_map_alloc
Hàm `sock_map_alloc()` chỉ từ chối các giá trị `max_entries == 0` và cho phép bất kỳ giá trị `u32` nào khác. Sau đó, `sock_map_free()` duyệt qua mảng `sks[]` bằng một bộ đếm lặp (iterator) có kiểu `int`:
```c int i; for (i = 0; i < stab->map.max_entries; i++) struct sock **psk = &stab->sks[i];
```
Khi một SOCKMAP được tạo với `max_entries = 0xffffffff` (UINT_MAX), việc phân bổ bộ nhớ dung lượng 32 GiB có thể thành công trên các máy chủ có nhiều RAM. Trong quá trình giải phóng, bộ đếm đạt đến giá trị `0x80000000`, bị tràn xuống `INT_MIN`, được mở rộng dấu bởi lệnh `movslq` và trở thành một độ lệch âm khoảng 16 GiB so với `stab->sks`, trỏ xa phía dưới vùng phân bổ.
Lỗi truy cập xảy ra là một ghi bằng thao tác `xchg()` trong hàm `sock_map_free()`. Nếu không có KASAN, việc ghi vượt quá ranh giới (out-of-bounds) tương tự cũng có thể gây lỗi trên một trang vmalloc chưa được ánh xạ hoặc làm hỏng một vùng phân bổ khác nếu địa chỉ vmalloc đó đã được điền dữ liệu. Trên nhân sử dụng KASAN với `CONFIG_KASAN_VMALLOC=y`, kiểm tra bóng (shadow check) cho địa chỉ này sẽ gặp phải một trang shadow chưa được ánh xạ và gây ra lỗi oops trước:
``` BUG: unable to handle page fault for address: fffff521b59c5a00 RIP: 0010:kasan_check_range+0x107/0x190 Call Trace: sock_map_free+0x93/0x190 map_create+0x68d/0xb30 __sys_bpf+0x21e/0x2e70 ```
Vmcore xác nhận `stab->map.max_entries == 0xffffffff`, `stab->sks == 0xffffc911ace2d000`, và địa chỉ gây lỗi là `sks + (s64)INT_MIN * 8` chính xác tại `0xffffc90dace2d000`. Cùng một đường dẫn lỗi này được kích hoạt trên đường dẫn đóng bình thường (`close()`) hoặc `bpf_map_free_deferred()` bất cứ khi nào bản đồ như vậy bị hủy.
Trước đây, `sock_map_alloc()` giới hạn kích thước phân bổ của nó thông qua `bpf_map_charge_init()`, nhưng giới hạn này đã được bỏ đi khi việc kế toán bộ nhớ dựa trên rlimit bị loại bỏ. Hãy từ chối các giá trị `max_entries > INT_MAX` tại thời điểm tạo để đảm bảo rằng bộ đếm lặp có dấu trong `sock_map_free()` không bao giờ nhìn thấy một giá trị gây tràn số (overflow).
Lỗ hổng này được kích hoạt bởi syzkaller và đã được tái hiện trên cả nhân KASAN dựa trên phiên bản 6.6 và nhân upstream v7.3-rc2.
Be aware that VulDB is the high quality source for vulnerability data.