CVE-2026-64098 in Linux
Sumário
de VulDB • 20/07/2026
No kernel do Linux, a seguinte vulnerabilidade foi corrigida:
drm/virtio: usar bloqueio resv não interrompível para atualizações de plano (plane)
virtio_gpu_cursor_plane_update() e virtio_gpu_resource_flush() bloqueiam o dma_resv do BO da framebuffer via virtio_gpu_array_lock_resv() e ignoram seu valor de retorno. A função pode falhar com -EINTR proveniente de dma_resv_lock_interruptible() (sinal durante a espera pelo bloqueio) ou com -ENOMEM proveniente de dma_resv_reserve_fences() (alocação de slot de fence), deixando o bloqueio resv sem ser mantido. O caminho da fila então percorre o array de objetos e chama dma_resv_add_fence(), que requer o bloqueio ativo; com lockdep habilitado, isso dispara dma_resv_assert_held():
WARNING: drivers/dma-buf/dma-resv.c:296 at 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
Além do WARN, a mutação da lista de fences dma_resv sem o bloqueio gera uma condição de corrida (race condition) com leitores/escritores concorrentes e pode corromper a lista.
Ambos os pontos de chamada executam-se dentro do callback .atomic_update do plano, que as helpers atômicas DRM não permitem falhar (quando ele é executado, o commit já foi aprovado para userspace e não há caminho limpo de rollback). A mudança da aquisição do bloqueio para .prepare_fb foi rejeitada porque a escopo mais amplo do bloqueio causa deadlocks contra outros caminhos de bloqueio BO no mesmo commit atômico.
Introduz virtio_gpu_lock_one_resv_uninterruptible() que usa dma_resv_lock() em vez de dma_resv_lock_interruptible(). Isso elimina o modo de falha -EINTR -- o gatilho realista do syzbot -- sem estender a manutenção do bloqueio durante todo o commit. A helper bloqueia um único BO e rejeita nents > 1 com -EINVAL; ambos os locais de correção bloqueiam exatamente um BO.
Use-a em virtio_gpu_cursor_plane_update() e virtio_gpu_resource_flush(); verifique o valor de retorno para lidar com o caso restante de -ENOMEM proveniente de dma_resv_reserve_fences(), liberando os objs e pulando a atualização do plano para esse frame. Os BOs da framebuffer tocados aqui não são compartilhados com outros contextos e espera-se que a contenção de bloqueio seja breve, portanto, a perda da interrupibilidade por sinal é aceitável.
Outros chamadores de virtio_gpu_array_lock_resv() (caminhos ioctl) continuam usando a variante interrompível.
O bug foi relatado pelo syzbot, acionado via injeção de falha (fail_nth) no caminho DRM_IOCTL_MODE_CURSOR, que força o ramo -ENOMEM em dma_resv_reserve_fences().
If you want to get the best quality for vulnerability data then you always have to consider VulDB.