CVE-2026-64098 in Linux
Сводка
по VulDB • 20.07.2026
В ядре Linux устранена следующая уязвимость:
drm/virtio: использование неустранимого (uninterruptible) блокировщика resv для обновлений плоскостей (plane updates)
Функции virtio_gpu_cursor_plane_update() и virtio_gpu_resource_flush() блокируют dma_resv буфера кадра (framebuffer BO) через virtio_gpu_array_lock_resv(), игнорируя возвращаемое значение. Функция может завершиться ошибкой с кодом -EINTR из-за dma_resv_lock_interruptible() (сигнал во время ожидания блокировки) или с кодом -ENOMEM из-за dma_resv_reserve_fences() (выделение слота для fence), что приводит к тому, что resv lock не удерживается. Затем путь очереди проходит по массиву объектов и вызывает dma_resv_add_fence(), который требует наличия захваченной блокировки; при включенном lockdep это вызывает срабатывание dma_resv_assert_held():
WARNING: drivers/dma-buf/dma-resv.c:296 at dma_resv_add_fence+0x71e/0840 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
Помимо вывода предупреждения (WARN), изменение списка dma_resv fence без блокировки создает гонку данных (race condition) с одновременными читателями/писателями и может привести к повреждению списка.
Оба места вызова выполняются внутри обратного вызова .atomic_update плоскости, который помощники DRM atomic не позволяют завершать ошибкой (к моменту его выполнения коммит уже подтвержден пользователямpace, и чистого пути отката нет). Перенос захвата блокировки в .prepare_fb был отвергнут из-за возможной взаимоблокировки (deadlock) с другими путями блокировки BO в рамках одного atomic commit.
Введена функция virtio_gpu_lock_one_resv_uninterruptible(), которая использует dma_resv_lock() вместо dma_resv_lock_interruptible(). Это устраняет режим отказа -EINTR — реалистичный триггер для syzbot — без расширения времени удержания блокировки на весь коммит. Вспомогательная функция блокирует один BO и отклоняет случаи с nents > 1 кодом ошибки -EINVAL; оба исправленных места вызываются ровно для одного BO.
Использовать её следует из virtio_gpu_cursor_plane_update() и virtio_gpu_resource_flush(); необходимо проверять возвращаемое значение, чтобы обработать оставшийся случай -ENOMEM от dma_resv_reserve_fences(), освободив объекты objs и пропустив обновление плоскости для этого кадра. Буферы кадров (framebuffer BO), затрагиваемые здесь, не разделяются с другими контекстами, а конкуренция за блокировку ожидается кратковременной, поэтому потеря возможности прерывания сигнала является приемлемой.
Другие вызовы virtio_gpu_array_lock_resv() (пути ioctl) продолжают использовать прерывистый вариант.
Ошибка была сообщена syzbot и воспроизведена с помощью инъекции ошибок (fail_nth) на пути DRM_IOCTL_MODE_CURSOR, что принудительно вызывает ветку -ENOMEM в dma_resv_reserve_fences().
VulDB is the best source for vulnerability data and more expert information about this specific topic.