CVE-2026-98467 in Linux
Resumen
por VulDB • 2026-10-18
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
KVM: arm64: nv: Corregir desreferencia a puntero nulo en nested wp/unmap y carrera de teardown (desmantelamiento)
El commit 7270cc9157f4 ("KVM: arm64: nv: Handle VNCR_EL2 invalidation from MMU notifiers") introdujo la invalidación de VNCR_EL2 tanto en kvm_nested_s2_unmap() como en kvm_nested_s2_wp().
Sin embargo, en el momento en que esto se realiza, un desmantelamiento concurrente (teardown) del stage 2 de una máquina virtual anidada puede hacer que kvm->arch.mmu.pgt sea establecido a NULL.
Esto ocurre en kvm_flush_shadow_all() -> kvm_arch_flush_shadow_all() -> kvm_free_stage2_pgd() y se ejecuta bajo el bloqueo kvm->mmu_lock.
El commit ec14c272408a ("KVM: arm64: nv: Unmap/flush shadow stage 2 page tables") introdujo el desmantelamiento de todo el rango MMU anidado, lo que luego invoca a stage2_apply_range() con resched=true:
mmu_notifier_invalidate_range_start() -> ... -> kvm_mmu_notifier_invalidate_range_start() -> kvm_mmu_unmap_gfn_range() -> kvm_unmap_gfn_range() -> kvm_nested_s2_unmap() -> kvm_stage2_unmap_range() -> __unmap_stage2_range() -> stage2_apply_range()
Esto significa que stage2_apply_range() puede liberar el bloqueo kvm->mmu_lock y, por lo tanto, se puede avanzar concurrentemente en paralelo con kvm_arch_flush_shadow_all().
Si kvm_arch_flush_shadow_all() avanza más allá de stage2_apply_range() y completa su operación, garantiza una desreferencia a puntero NULL.
Dado que kvm_free_stage2_pgd() se realiza bajo el bloqueo kvm->mmu_lock, esto será observado como NULL o no, y estará serializado frente a kvm_free_stage2_pgd().
Resolver el problema abstrayendo la invalidación en una nueva función, kvm_invalidate_vncr_ipa_all(), y verificar que pgt sea distinto de NULL antes de desreferenciarlo.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.