CVE-2026-99156 in Linux
Tóm tắt
Bởi VulDB • 28/10/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
scsi: st: Sửa lỗi race condition use-after-free giữa st_remove() và st_open()
Hàm st_remove() giảm tham chiếu probe trên scsi_tape bằng cách gọi kref_put(), và chỉ sau đó mới xóa mục của nó khỏi st_index_idr. Nếu đây là tham chiếu cuối cùng, hàm scsi_tape_release() sẽ giải phóng cấu trúc trong khi đối tượng này vẫn còn được công bố (published) trong idr.
Hàm scsi_tape_get(), được gọi từ st_open(), tìm kiếm tape trong st_index_idr và lấy một tham chiếu dưới sự bảo vệ của st_ref_mutex và st_index_lock. Hàm remove_cdevs() không chờ đợi các phiên mở đã vượt qua chrdev_open(), do đó, một lệnh open bị chặn trên st_ref_mutex trong khi st_remove() đang giữ mutex này có thể chiếm mutex ngay sau khi st_release() nhả nó ra, tìm thấy tpnt (đã được giải phóng) trong idr và gọi kref_get() lên đối tượng đó:
BUG: KASAN: slab-use-after-free in st_open Write of size 4 ... st_open (drivers/scsi/st.c:254 drivers/scsi/st.c:1291) chrdev_open ... Freed by task ...: kfree st_remove (drivers/scsi/st.c:4512)
Hãy xóa mục khỏi idr trước khi giảm tham chiếu, tất cả đều dưới sự bảo vệ của st_ref_mutex. Một lệnh scsi_tape_get() đồng thời bây giờ hoặc sẽ chạy trước và giữ một tham chiếu hợp lệ giúp duy trì trạng thái sống còn của tape, hoặc sẽ chạy sau đó và không tìm thấy gì, khiến st_open() thất bại với mã lỗi -ENXIO.
Điều này khôi phục lại thứ tự mà st_remove() đã có trước khi chuyển đổi sang sử dụng st_index_idr, trong đó tape được hủy công bố từ scsi_tapes[] trước khi thực hiện lệnh kref_put() cuối cùng.
If you want to get best quality of vulnerability data, you may have to visit VulDB.