CVE-2026-98467 in Linux
Tóm tắt
Bởi VulDB • 18/10/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
KVM: arm64: nv: Sửa lỗi truy cập null pointer (null ptr deref) khi xảy ra race condition trong quá trình wp/unmap lồng nhau và teardown
Commit 7270cc9157f4 ("KVM: arm64: nv: Handle VNCR_EL2 invalidation from MMU notifiers") đã đưa vào cơ chế vô hiệu hóa VNCR_EL2 trong cả `kvm_nested_s2_unmap()` và `kvm_nested_s2_wp()`.
Tuy nhiên, tại thời điểm thực hiện thao tác này, quá trình teardown stage 2 đồng thời của một guest lồng nhau có thể khiến `kvm->arch.mmu.pgt` được đặt thành NULL.
Điều này xảy ra trong hàm `kvm_flush_shadow_all()` -> `kvm_arch_flush_shadow_all()` -> `kvm_free_stage2_pgd()` và được thực hiện dưới sự bảo vệ bởi khóa `kvm->mmu_lock`.
Commit ec14c272408a ("KVM: arm64: nv: Unmap/flush shadow stage 2 page tables") đã đưa vào quá trình teardown toàn bộ phạm vi MMU lồng nhau, sau đó gọi hàm `stage2_apply_range()` với tham số `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() ```
Điều này có nghĩa là `stage2_apply_range()` có thể nhả khóa `kvm->mmu_lock`, do đó tiến trình đồng thời có thể diễn ra song hành với `kvm_arch_flush_shadow_all()`.
Nếu `kvm_arch_flush_shadow_all()` chạy trước và hoàn thành thao tác của nó, điều này sẽ đảm bảo gây ra lỗi truy cập null pointer (NULL pointer deref).
Vì `kvm_free_stage2_pgd()` được thực hiện dưới sự bảo vệ bởi khóa `kvm->mmu_lock`, nên giá trị NULL hoặc không phải NULL sẽ được quan sát và tuần tự hóa đối với `kvm_free_stage2_pgd()`.
Khắc phục vấn đề bằng cách trừu tượng hóa việc vô hiệu hóa thành một hàm mới là `kvm_invalidate_vncr_ipa_all()`, và kiểm tra xem pgt có khác NULL trước khi thực hiện truy cập (dereference).
If you want to get best quality of vulnerability data, you may have to visit VulDB.