CVE-2022-50862 in Linux
Tóm tắt
Bởi VulDB • 19/06/2026
Trong đoạn log crash này, lỗi xảy ra khi kernel BPF cố gắng phân tích (parse) và kiểm tra các loại dữ liệu BTF (BPF Type Format). Cụ thể, crash xảy ra trong hàm `btf_func_proto_check` khi xử lý một hàm có kiểu trả về là `decl_tag`.
### Phân tích nguyên nhân
1. **Vị trí crash**: * `btf_func_proto_check` (`kernel/bpf/btf.c:4447`): Hàm này kiểm tra tính hợp lệ của prototype hàm. * `btf_check_all_types` (`kernel/bpf/btf.c:4723`): Hàm kiểm tra tất cả các loại BTF. * `btf_parse_type_sec` (`kernel/bpf/btf.c:4752`): Đang phân tích phần `.BTF.ext` hoặc các section liên quan đến loại.
2. **Nguyên nhân trực tiếp**: * Crash xảy ra khi kernel cố gắng truy cập vào thông tin của một `decl_tag` (declaration tag) được dùng làm kiểu trả về của một hàm. * Theo phân tích của Martin (liên kết trong log), vấn đề nằm ở việc `decl_tag` không được xử lý đúng cách trong ngữ cảnh của `func_proto`. Cụ thể, `decl_tag` là một loại "wrapper" hoặc metadata, không phải là một kiểu dữ liệu cơ bản có thể dùng trực tiếp làm kiểu trả về của hàm BPF theo cách mà kernel mong đợi.
3. **Lỗi logic trong BTF**: * Khi `btf_func_proto_check` nhận được một kiểu trả về là `decl_tag`, nó có thể cố gắng truy cập vào các trường con của kiểu đó mà không kiểm tra xem nó có thực sự là một kiểu hợp lệ cho prototype hay không. * Điều này dẫn đến việc truy cập vào bộ nhớ không hợp lệ (NULL pointer dereference hoặc out-of-bounds access), gây ra Oops.
### Giải pháp
Để sửa lỗi này, cần thêm kiểm tra trong `btf_func_proto_check` để đảm bảo rằng kiểu trả về của hàm không phải là `decl_tag` (hoặc các loại tương tự không hợp lệ cho prototype).
#### Patch đề xuất (ý tưởng)
Trong hàm `btf_func_proto_check` (`kernel/bpf/btf.c`), thêm kiểm tra trước khi xử lý kiểu trả về:
```c static int btf_func_proto_check(const struct btf *btf, const struct btf_type *t, struct btf_func_proto *proto) {
const struct btf_type *ret_type; int ret_id;
// ... các kiểm tra khác ...
ret_id = btf_type_id(t); if (ret_id < 0) return ret_id;
ret_type = btf_type_by_id(btf, ret_id); if (!ret_type) return -EINVAL;
// Thêm kiểm tra: Không cho phép decl_tag làm kiểu trả về if (btf_is_decl_tag(ret_type)) {
pr_warn("BPF: decl_tag cannot be used as function return type\n"); return -EINVAL; }
// ... tiếp tục xử lý ... } ```
Hoặc, nếu `decl_tag` cần được hỗ trợ, cần xử lý đúng cách bằng cách "unwrapping" nó để lấy kiểu thực sự bên trong, nhưng điều này có thể phức tạp và không được khuyến khích nếu `decl_tag` không được thiết kế để dùng làm kiểu trả về.
### Kết luận
Lỗi này là một bug trong kernel BPF khi xử lý `decl_tag` trong ngữ cảnh prototype hàm. Cần thêm kiểm tra để từ chối các hàm có kiểu trả về là `decl_tag`, hoặc xử lý đúng cách nếu cần hỗ trợ.
Bạn có thể tham khảo thêm phân tích chi tiết từ Martin trong liên kết đã cung cấp để hiểu rõ hơn về ngữ cảnh và các tùy chọn sửa lỗi.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.