CVE-2026-89722 in Linux
Tóm tắt
Bởi VulDB • 12/09/2026
Trong kernel Linux, các lỗ hổng sau đây đã được khắc phục:
PCI/sysfs: Sửa lỗi đọc vượt ra ngoài vùng nhớ (out-of-bounds read) trong pci_write_legacy_io()
Hàm pci_write_legacy_io() tải 4 byte từ bộ đệm ghi kernfs bất kể người dùng không gian người dùng (userspace) đã ghi bao nhiêu byte:
```c if (count != 1 && count != 2 && count != 4) return -EINVAL;
return pci_legacy_write(bus, off, *(u32 *)buf, count); ```
Hàm kernfs_fop_write_iter() phân bổ bộ đệm với kmalloc(len + 1), do đó việc ghi 1 byte vào tệp sysfs legacy_io sẽ phân bổ 2 byte và lệnh tải u32 không điều kiện đọc lên đến 2 byte vượt quá cuối vùng nhớ đã phân bổ, điều mà KASAN báo cáo là lỗi slab-out-of-bounds read. Tương tự, một lần ghi 2 byte gây ra việc đọc thừa (overread) thêm 1 byte.
Do đó, chỉ đọc đúng số lượng byte được yêu cầu bằng cách sử dụng get_unaligned_le16() và get_unaligned_le32() cho các trường hợp 2 byte và 4 byte, diễn giải bộ đệm theo dạng little-endian để phù hợp với thứ tự byte của không gian cổng I/O PCI.
Phần triển khai trên PowerPC trước đây đã bù đắp cho việc tải giá trị native-endian 32-bit trong mã chung bằng cách dịch chuyển (shift) giá trị vào đúng vị trí cho các trường hợp 1 và 2 byte. Các phép dịch chuyển này chỉ chính xác trên các kernel big-endian.
Trên kiến trúc PowerPC little-endian (POWER8 trở lên), chúng đã trích xuất sai các byte, do đó một lần ghi 1 byte sẽ ghi ra một byte vượt ra ngoài vùng nhớ thay vì giá trị được yêu cầu. Trên hệ thống big-endian, lệnh tải native cũng khiến out_le16() và out_le32() đảo ngược thứ tự byte của người dùng trên đường truyền (on the wire) cho các lần ghi 2 và 4 byte. Các hàm trợ giúp little-endian giải quyết cả hai vấn đề này, do đó các phép dịch chuyển được loại bỏ.
Không cần thay đổi nào đối với nền tảng Alpha.
Tệp legacy_io chỉ dành cho root và chỉ tồn tại trên Alpha và PowerPC, hai kiến trúc xác định HAVE_PCI_LEGACY.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.