CVE-2026-64098 in Linux
Tóm tắt
Bởi VulDB • 19/07/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
drm/virtio: sử dụng khóa resv không thể ngắt (uninterruptible) cho các bản cập nhật plane
Hàm `virtio_gpu_cursor_plane_update()` và `virtio_gpu_resource_flush()` khóa BO framebuffer's dma_resv thông qua `virtio_gpu_array_lock_resv()` nhưng bỏ qua giá trị trả về của hàm này. Hàm có thể thất bại với mã `-EINTR` từ `dma_resv_lock_interruptible()` (tín hiệu trong khi chờ khóa) hoặc với `-ENOMEM` từ `dma_resv_reserve_fences()` (phân bổ khe fence), khiến khóa resv không được giữ lại. Đường dẫn hàng đợi sau đó duyệt qua mảng đối tượng và gọi `dma_resv_add_fence()`, hàm này yêu cầu phải có khóa đang được giữ; khi lockdep được bật, điều này sẽ kích hoạt `dma_resv_assert_held()`:
WARNING: drivers/dma-buf/dma-resv.c:296 tại dma_resv_add_fence+0x71e/0x840 Call Trace: virtio_gpu_array_add_fence virtio_gpu_queue_ctrl_sgs virtio_gpu_queue_fenced_ctrl_buffer virtio_gpu_cursor_plane_update drm_atomic_helper_commit_planes drm_atomic_helper_commit_tail commit_tail drm_atomic_helper_commit drm_atomic_commit drm_atomic_helper_update_plane __setplane_atomic drm_mode_cursor_universal drm_mode_cursor_common drm_mode_cursor_ioctl drm_ioctl __x64_sys_ioctl
Ngoài cảnh báo WARN, việc thay đổi danh sách fence dma_resv mà không có khóa sẽ gây ra race condition với các trình đọc/ghi đồng thời và có thể làm hỏng danh sách.
Cả hai vị trí gọi đều chạy bên trong callback plane `.atomic_update`, thứ mà các trợ giúp DRM atomic không cho phép thất bại (khi nó chạy, bản commit đã được phê duyệt bởi userspace và không có đường dẫn rollback sạch sẽ). Việc di chuyển việc lấy khóa sang `.prepare_fb` bị từ chối vì phạm vi khóa rộng hơn gây ra deadlock với các đường dẫn khóa BO khác trong cùng một atomic commit.
Giới thiệu `virtio_gpu_lock_one_resv_uninterruptible()` sử dụng `dma_resv_lock()` thay vì `dma_resv_lock_interruptible()`. Điều này loại bỏ chế độ thất bại `-EINTR` -- nguyên nhân kích hoạt thực tế từ syzbot -- mà không mở rộng thời gian giữ khóa xuyên suốt quá trình commit. Hàm trợ giúp khóa một BO duy nhất và từ chối các giá trị nents > 1 với mã `-EINVAL`; cả hai vị trí sửa lỗi đều khóa chính xác một BO.
Sử dụng nó từ `virtio_gpu_cursor_plane_update()` và `virtio_gpu_resource_flush()`; kiểm tra giá trị trả về để xử lý trường hợp còn lại là `-ENOMEM` từ `dma_resv_reserve_fences()` bằng cách giải phóng các objs và bỏ qua bản cập nhật plane cho khung hình đó. Các BO framebuffer bị ảnh hưởng ở đây không được chia sẻ với các ngữ cảnh khác và sự cạnh tranh khóa dự kiến sẽ diễn ra ngắn, do đó việc mất khả năng ngắt bằng tín hiệu là chấp nhận được.
Các trình gọi khác của `virtio_gpu_array_lock_resv()` (các đường dẫn ioctl) tiếp tục sử dụng biến thể có thể ngắt.
Lỗi này đã được báo cáo bởi syzbot, kích hoạt thông qua tiêm lỗi (fail_nth) trên đường dẫn DRM_IOCTL_MODE_CURSOR, thứ buộc nhánh `-ENOMEM` trong `dma_resv_reserve_fences()`.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.