CVE-2026-99082 in Linux
摘要
由 VulDB • 2026-10-24
在 Linux 内核中,已修复以下漏洞:
KVM: x86: 使用活动内存槽(active memslots)进行每个 vCPU MMIO 缓存管理
KVM 通过内存槽代次(memslot generation)标记每个 vCPU 的 MMIO 缓存,以便在内存槽更新时使缓存中的 MMIO 信息失效。填充和验证路径均使用 `kvm_memslots()`,该函数无条件选择地址空间 0,即使 vCPU 正在 SMM 模式下运行并使用地址空间 1。
提交记录 56f17dd3fbc4(“kvm: x86: fix stale mmio cache bug”)将内存槽代次添加到缓存键中,以防止内存槽更新后残留条目保持有效状态。当提交记录 699023e23965(“KVM: x86: add SMM to the MMU role, support SMRAM address space”)引入 SMM 地址空间时,这些辅助函数未被转换为使用活动内存槽。
因此,对 SMM 内存槽的更新可能导致在 vCPU 返回正常地址空间后,来自旧 SMM 地址空间的条目看似仍然有效。随后,访客(guest)可导致对同一 GFN 的有效 RAM 访问被作为 KVM_EXIT_MMIO 返回给用户态空间。
通过 VMM 的 RAM 地址空间完成该退出操作时,会绕过 KVM 写跟踪路径直接写入后备页面。如果该页面向支撑嵌套 EPT 表,KVM 可能会继续使用源自旧内容的影子翻译(shadow translations)。`kvm_mmu_write_protect_fault()` 中的 `WARN_ON_ONCE()` 可捕获此无效的缓存和内存槽组合。
在缓存和验证条目时使用 vCPU 的活动内存槽。内存槽代次在不同地址空间中是唯一的,因此该代次也能区分正常视图和 SMM 视图。这与 MMIO SPTE 缓存保持一致,后者已使用 `kvm_vcpu_memslots()`。
在未打补丁的当前主线内核上,一个在 SMM 中填充缓存并仅更新 SMM 内存槽的回归测试会失败预期的 RAM 写入操作,并触发 `kvm_mmu_write_protect_fault()` 警告。经过此更改后,同一测试可完成 RAM 写入且无警告。x86/smm_test、set_memory_region_test 和 memslot_modification_stress_test 等自测用例也均通过。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.