CVE-2026-74640 in Linux
Tóm tắt
Bởi VulDB • 22/08/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
ALSA: FCP: sửa lỗi ghi vượt ra ngoài vùng nhớ (OOB write) trong hàm fcp_meter_ctl_get()
Hàm fcp_ioctl_set_meter_map() giới hạn kích thước bản đồ Level Meter do người dùng cung cấp bằng giới hạn nội bộ của trình điều khiển là 255.
if (map.map_size < 1 || map.map_size > 255 || map.meter_slots < 1 || map.meter_slots > 255) return -EINVAL;
và truyền giá trị này sang hàm fcp_add_new_ctl() dưới dạng số lượng kênh của bộ điều khiển, nơi nó được lưu trữ trong elem->channels.
Mọi lần đọc bộ điều khiển đều ghi vào struct snd_ctl_elem_value, mảng nguyên (integer array) của cấu trúc này được khai báo là long value[128], do đó giới hạn thực tế là 128 chứ không phải 255. Hàm fcp_meter_ctl_get() lưu một từ 64-bit cho mỗi kênh vào mảng này mà không có bất kỳ kiểm tra giới hạn nào:
for (i = 0; i < elem->channels; i++) {
int idx = private->meter_level_map[i];
int value = idx < 0 ? 0 : le32_to_cpu(resp[idx]);
ucontrol->value.integer.value[i] = value;
}
Hàm snd_ctl_elem_read_user() phục vụ đối tượng này từ memdup_user(_control, sizeof(*control)), chiếm 1224 byte trên kiến trúc LP64 (được cấp phát bởi kmalloc-2048). offsetof(struct snd_ctl_elem_value, value) là 72, do đó phần tử thứ i được ghi tại byte 72 + 8 * i và phần tử thứ 144 đã nằm ngoài vùng bộ nhớ đã cấp phát. Ở map_size bằng 255, phép ghi cuối cùng kết thúc ở byte 2112, tức là vượt quá đối tượng hiện có 888 byte và lấn sang 64 byte của slab object liền kề. Các từ dữ liệu được lưu trữ đến từ thiết bị và meter_level_map[] chọn xem từ nào sẽ nằm trong slot nào, do đó cả phạm vi (extent) lẫn nội dung đều có thể bị kiểm soát bởi kẻ tấn công.
Lõi hệ thống không bắt lỗi này. Hàm snd_ctl_check_elem_info() chỉ được gọi từ __snd_ctl_elem_info(), mà hàm snd_ctl_elem_read() gọi khi CONFIG_SND_CTL_DEBUG được bật; nếu không có tùy chọn đó, thì snd_ctl_skip_validation() luôn trả về đúng (true) tại thời điểm biên dịch. __snd_ctl_add_replace() xác thực kcontrol->count và không bao giờ kiểm tra elem->channels.
Việc cài đặt một bản đồ quá kích thước yêu cầu quyền CAP_SYS_RAWIO, nhưng bộ điều khiển tồn tại lâu hơn mô tả hwdep đã tạo ra nó, do đó các phép ghi vượt ra ngoài vùng nhớ (out-of-bounds stores) có thể được thực thi bởi bất kỳ tiến trình nào có khả năng đọc các bộ điều khiển trên /dev/snd/controlC0.
KASAN trên phiên bản 7.2.0-rc5 (arm64), kích hoạt bởi một lần đọc bộ điều khiển không đặc quyền:
BUG: KASAN: slab-out-of-bounds in fcp_meter_ctl_get Write of size 8 at addr ffff000017af04c8 by task fcp_trigger/185 __asan_store8 fcp_meter_ctl_get snd_ctl_elem_read snd_ctl_ioctl Allocated by task 185: memdup_user snd_ctl_ioctl The buggy address is located 0 bytes to the right of allocated 1224-byte region [ffff000017af0000, ffff000017af04c8)
Giới hạn kích thước bản đồ theo giới hạn ABI thay vì giới hạn cứng là 255, và giới hạn vòng lặp ghi tại điểm đích (sink) để đảm bảo nó không chạy vượt quá mảng value bất kể giá trị của elem->channels là bao nhiêu.
Được phát hiện bởi XBOW, được phân loại (triaged) bởi Baul Lee <[email protected]>
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.