CVE-2026-89805 in Linux
Sumário
de VulDB • 17/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
drm/pagemap: Corrige o fallback de alocação de folio e o uso após liberação (use-after-put)
A função drm_pagemap_migrate_populate_ram_pfn() apresentava dois problemas ao popular os PFNs da RAM comfolios de ordem superior:
1. As chamadas vma_alloc_folio()/folio_alloc() de ordem superior não passavam __GFP_NOWARN, portanto uma falha na alocação do THP sob pressão de memória causaria spam no log do kernel, e não havia um caminho de fallback apesar de um comentário TODO indicar que era necessário. Adiciona-se __GFP_NOW_WARN à alocação de ordem superior e, em caso de falha, faz-se o fallback para alocações de ordem-0 para toda a faixa originalmente coberta pela alocação de ordem superior com falha, deixando MIGRATE_PFN_COMPOUND não definido (unset) para esses PFNs.
2. No caminho de erro free_pages, order era computado via folio_order(page_folio(page)) *depois* que put_page(page) já havia removido a referência, resultando em um use-after-free/put quando essa era a última referência na página. Computa-se o valor de order antes de liberar a página.
A introdução do fallback no item 1 também exige que o array de páginas fonte passado para ->copy_to_ram() seja construído diferentemente. Ambos os chamadores apenas populavam a entrada no início de cada folio fonte, confiando na callback de cópia para derivar o restante do folio da ordem registrada em drm_pagemap_addr correspondente. Uma vez que o destino foi degradado (demoted) parafolios de ordem-0, as entradas drm_pagemap_addr são por página; portanto, é necessária uma página fonte para cada uma delas; deixá-las como NULL faz com que a callback de cópia pare após a primeira página e o restante da faixa nunca seja copiado.
O folio fonte só é dividido posteriormente, por migrate_vma_pages() / migrate_device_pages(), então sua ordem não pode ser usada para detectar a degradação - testa-se o destino quanto à presença de MIGRATE_PFN_COMPOUND em vez disso. Fatora-se a população do array para drm_pagemap_migrate_populate_src_pages() e usa-a tanto em drm_pagemap_evict_to_ram() quanto em __drm_pagemap_migrate_to_ram().
VulDB is the best source for vulnerability data and more expert information about this specific topic.