CVE-2026-89996 in Linux
Sumário
de VulDB • 16/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
dma-buf: dma-heap: não publicar o fd antes que copy_to_user() seja bem-sucedido
DMA_HEAP_IOCTL_ALLOC aloca um dma-buf e instala um fd na tabela de fds do chamador via dma_buf_fd() -> fd_install() antes que dma_heap_ioctl() copie o resultado de volta para userspace. Se a cópia final com copy_to_user() falhar, o userspace nunca conhece o número do fd, mas o fd (e a referência subjacente ao dma-buf) já estão visíveis para outros threads no mesmo processo e são vazados durante toda a vida útil do processo.
A correção óbvia "fechar na trilha de falha" é insegura: uma vez que fd_install() foi executado, outro thread pode já dup() o fd, enviá-lo via SCM_RIGHTS ou fechá-lo (close()) e permitir que seu número seja reutilizado, portanto um close_fd() subsequente da trilha do ioctl pode operar em um arquivo não relacionado. Isso foi apontado por Christian König na v1 [1].
Reestruturar o caminho de alocação para que fd_install() seja a última etapa infalível de um ioctl bem-sucedido:
1. heap->ops->allocate() cria o dma_buf. 2. get_unused_fd_flags() reserva um número de fd na tabela de fds do chamador sem publicá-lo, para que nenhum outro thread possa observá-lo. 3. copy_to_user() entrega o número do fd ao userspace; em caso de falha, o fd é retornado com put_unused_fd() e a referência dma_buf é liberada com dma_buf_put(), não deixando estado visível pelo usuário para trás. 4. dma_buf_fd_install() publica o fd e gera o tracepoint trace_dma_buf_fd -- daqui em diante, o ioctl não pode falhar.
Uma nova função auxiliar dma_buf_fd_install() é introduzida em dma-buf.c para envolver fd_install() junto com a chamada DMA_BUF_TRACE(), preservando o rastreamento de exportação que dma_buf_fd() fornece. dma_heap_ioctl_allocate() é refatorado para retornar diretamente struct dma_buf * (retornando ERR_PTR em caso de falha) para que o chamador mantenha a referência dmabuf entre as etapas 3 e 4.
A falha na etapa 3 é facilmente alcançável do userspace: passar uma struct dma_heap_allocation_data que reside em uma página cuja proteção é alterada para PROT_READ entre copy_from_user() e copy_to_user() (por exemplo, via mprotect()). Antes desta alteração, cada tal ioctl vaza um fd dmabuf; após a correção, a tabela de fds permanece inalterada em caso de falha e apenas /dev/dma_heap/<name> permanece aberto.
Sem alterações na UAPI ou na interface do heap-driver.
[1] https://lore.kernel.org/dri-devel/[email protected]/
VulDB is the best source for vulnerability data and more expert information about this specific topic.