CVE-2022-50778 in Linux
Tóm tắt
Bởi VulDB • 20/05/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
fortify: Sửa lỗi __compiletime_strlen() dưới UBSAN_BOUNDS_LOCAL
Khi bật CONFIG_FORTIFY=y và CONFIG_UBSAN_LOCAL_BOUNDS=y, chúng tôi quan sát thấy một lỗi panic tại thời điểm chạy (runtime) khi thực thi bộ kiểm tra tương thích (Compatibility Test Suite - CTS) của Android, cụ thể là android.hardware.input.cts.tests. Nguyên nhân bắt nguồn từ một lệnh gọi strlen() trong hàm hidinput_allocate().
__compiletime_strlen() được triển khai dựa trên __builtin_object_size(), sau đó thực hiện truy cập mảng để kiểm tra ký tự kết thúc NUL. Một đặc điểm của __builtin_object_size() là đối với các chuỗi có giá trị phụ thuộc vào thời điểm chạy, __builtin_object_size(str, 1 hoặc 0) sẽ trả về kích thước tối đa của các giá trị có thể khi những kích thước này có thể xác định được tại thời điểm biên dịch. Ví dụ:
static const char *v = "FOO BAR"; static const char *y = "FOO BA"; unsigned long x (int z) {
// Trả về 8, tức là: // max(__builtin_object_size(v, 1), __builtin_object_size(y, 1)) return __builtin_object_size(z ? v : y, 1); }
Do đó, khi FORTIFY_SOURCE được bật, phiên bản hiện tại của __compiletime_strlen() sẽ cố gắng truy cập vượt quá cuối chuỗi y tại thời điểm chạy bằng cách sử dụng kích thước của v. Kết hợp với UBSAN_LOCAL_BOUNDS, điều này gây ra lỗi (fault).
Hàm hidinput_allocate() có một chuỗi ký tự C cục bộ (local C string) mà giá trị của nó phụ thuộc vào luồng điều khiển (control flow) của một câu lệnh switch, do đó __builtin_object_size(str, 1) được đánh giá là độ dài chuỗi tối đa, khiến tất cả các trường hợp khác bị lỗi khi kiểm tra ký tự cuối cùng. Hàm hidinput_allocate() có thể được dọn dẹp để tránh các lệnh gọi strlen() tại thời điểm chạy vì biến cục bộ chỉ có thể nhận các giá trị ký tự (literal values), nên không có lợi ích gì khi cố gắng tăng cường bảo mật (fortify) cho vị trí gọi strlen() ở đó.
Thực hiện kiểm tra __builtin_constant_p() đối với chỉ mục 0 sớm hơn trong macro để lọc bỏ trường hợp phụ thuộc vào luồng điều khiển. Thêm một bài kiểm tra KUnit để kiểm tra các đặc điểm hành vi dự kiến của các thành phần nội bộ FORTIFY_SOURCE.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.