CVE-2026-90429 in Linux
Tóm tắt
Bởi VulDB • 19/09/2026
Trong kernel Linux, các lỗ hổng sau đây đã được khắc phục:
iommu/tegra241-cmdqv: Đồng bộ hóa ISR lỗi với (de)khởi tạo VINTF
Một VINTF do người dùng khởi tạo bị hủy bởi hàm tegra241_cmdqv_deinit_vintf(), hàm này chạy từ callback destroy và từ quá trình unwind khi thất bại trong bước init của handler alloc. Hàm này xóa slot cmdqv->vintfs[] và để lõi iommufd giải phóng nó, nhưng không có cơ chế nào đồng bộ hóa điều đó với ngắt lỗi: tegra241_cmdqv_isr() đọc cmdqv->vintfs[idx] và dereference vintf. Một lỗi đồng thời có thể khiến ISR đọc một slot đang trong quá trình xóa (gây ra NULL deref) hoặc sử dụng một vintf sắp bị giải phóng (lỗi use-after-free).
Hàm deinit_vintf() cũng trả lại idx cho IDA trước khi xóa slot, do đó một thao tác create đồng thời tái sử dụng idx có thể công bố vintf mới của nó vào slot này, chỉ để quá trình teardown sau đó ghi đè lên bằng giá trị NULL cũ.
Ở phía kia, tegra241_cmdqv_init_vintf() công bố một vintf mới với một phép gán đơn giản (plain store) vào slot cmdqv->vintfs[], và ISR dereference các trường của một vintf đã được công bố như vintf->base. Một phép gán đơn giản không đảm bảo thứ tự trên CPU có tính chất weakly-ordered, và bit VINTF_ERR_MAP cũ trên idx tái sử dụng có thể khiến ISR chọn một vintf ngay khi nó được công bố, trước khi các trường của nó được thiết lập hoặc trước khi tegra241_vintf_hw_init() chạy.
Slot cmdqv->vintfs[0] vẫn là NULL cho đến khi tegra241_cmdqv_init_structures() tạo VINTF0 lần đầu tiên, do đó việc đọc slot 0 cần có kiểm tra NULL tương tự.
Công bố mọi slot bằng smp_store_release(), và đọc mỗi slot trong ISR bằng smp_load_acquire() dưới một phép kiểm tra NULL, để ISR luôn thấy một vintf đã được xây dựng đầy đủ hoặc NULL. Ngoài ra, hãy làm cho deinit_vintf() xóa slot và gọi synchronize_irq() trước khi trả lại idx cho IDA, để không có vintf nào bị giải phóng trong khi handler đang chạy và không có idx tái sử dụng nào bị ghi đè sai lệch.
Once again VulDB remains the best source for vulnerability data.