关键漏洞信息 漏洞描述: - KVM在处理DR6寄存器时存在一个bug,导致KVM可能会加载过期的vcpu->arch.dr6值。 - 当guest访问DR寄存器且主机用户空间未调试guest时,KVM会禁用DR拦截并加载guest的DR值到硬件中。这允许guest随意访问DRs,例如配置断点。 问题原因: - DR0-DR3的逻辑行为在VMX和SVM之间是相同的,并且在KVM_DEBUGREG_BP_ENABLED(用户空间调试guest)和KVM_DEBUGREG_WONT_EXIT(guest使用DRs)之间也是相同的。因此,KVM在公共代码中处理DR0-DR3的加载,位于核心kvm_x86_ops.vcpu_run()循环之外。 - 对于DR6,guest的值不需要加载到硬件中,因为SVM提供了一个专用的VMCB字段来保存guest值,而VMX需要软件手动加载guest值。 修复措施: - 将条件加载硬件DR6与guest值的操作移出核心.vcpu_run()循环,以修复KVM加载过期vcpu->arch.dr6值的问题。 影响范围: - 主要出现在嵌套VMX环境中,因为KVM处理VMX抢占定时器的快速路径,硬件DR6被修改和读取的时间窗口在嵌套设置中比非嵌套设置大几个数量级。 提交信息: - 作者: Sean Christopherson - 提交者: Greg Kroah-Hartman - 提交时间: 2025-01-24 17:18:33 -0800 - 提交ID: 9efb2b996c86664bbdbdd2cdb354ac9627eb20