CVE-2026-89928 in Linuxinformação

Sumário

de VulDB • 17/09/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

KVM: x86/mmu: Consumir o valor rmap bloqueado na travessia de rmap sem trava (lockless)

__kvm_rmap_lock() deliberadamente omite a trava do rmap quando observa um rmap vazio. Nesse caso, kvm_rmap_lock_readonly() também reativa a preempção e retorna zero, portanto o chamador não possui nem a trava do rmap nem uma referência de preempção. A omissão documenta a invariável na qual ela se baseia:

* Omitir a trava se o rmap estiver vazio, pois os iteradores sem trava (modo somente leitura) não precisam (e não podem) percorrer um rmap vazio, nem podem adicionar entradas ao rmap. Ou seja, as únicas rotas que processam rmaps vazios fazem-no enquanto seguram mmu_lock para gravação e são mutuamente exclusivas.

kvm_rmap_age_gfn_range() ignora o valor retornado e entra incondicionalmente em for_each_rmap_spte_lockless(). O iterador iniciado com rmap_get_first() re-lê rmap_head->val em vez de usar o valor retornado pela trava. Se um escritor popular o rmap entre a leitura da trava e a re-leitura do iterador, a rota de envelhecimento percorre o rmap recém-instalado sem segurar sua trava.

Para um rmap KVM_RMAP_MANY isso deixa o iterador seguindo uma cadeia pte_list_desc que ele nunca bloqueou. Um escritor segurando mmu_lock para gravação pode liberar essa cadeia (por exemplo, kvm_zap_all_rmap_sptes() na rota de reciclagem ou qualquer zap do rmap) via kmem_cache_free() enquanto a travessia está em andamento, causando um use-after-free no slab. Nada serializa as duas operações: a rota de envelhecimento executa-se sem mmu_lock quando CONFIG_KVM_MMU_LOCKLESS_AGING=y, e a trava do rmap que normalmente excluiria o escritor foi omitida. Como a rota vazia reativa a preempção, o intervalo entre as duas leituras pode abranger um atraso de agendamento arbitrário.

Corrigir essa classe de bug fazendo com que a travessia sem trava consuma o valor retornado pela trava em vez de re-ler o rmap. Dividir rmap_get_first() em __rmap_get_first(), que inicia um iterador a partir de um valor de rmap já lido, e fazer for_each_rmap_spte_lockless() aceitar esse valor e chamar __rmap_get_first() diretamente. kvm_rmap_age_gfn_range() passa o valor retornado por kvm_rmap_lock_readonly(): quando a trava foi omitida, o valor é zero, __rmap_get_first() retorna NULL e a travessia é ignorada. Nenhum iterador sem trava re-lê o rmap, portanto a invariável de omissão da trava não pode ser violada, e nenhuma rota lock()-without-paired-unlock() é adicionada ao código de envelhecimento.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Responsável

Linux

Reservar

11/09/2026

Divulgação

17/09/2026

Moderação

aceite

Entrada

VDB-405767

CPE

pronto

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Might our Artificial Intelligence support you?

Check our Alexa App!