CVE-2023-53663CVE-2023-53663是Linux内核KVM(基于内核的虚拟机)子系统中nSVM(嵌套安全虚拟机)模块的一个安全漏洞。该漏洞位于arch/x86/kvm/svm/nested.c文件的nested_vmcb02_prepare_control函数中,具体涉及嵌套TSC(时间戳计数器)缩放功能的处理逻辑。
在KVM的nSVM实现中,当L1管理程序(L1 hypervisor)执行嵌套VMRUN操作进入L2客户机时,内核会检查L1的MSR_AMD64_TSC_RATIO寄存器值是否与KVM的默认值发生了偏离。如果发生了偏离,内核代码会使用WARN_ON断言来确认TSC缩放功能已暴露给L1。然而,这种基于断言的处理方式存在缺陷,因为用户空间(userspace)可以在KVM_RUN之前的任何时间修改客户机的CPUID信息来隐藏TSC缩放功能(X86_FEATURE_TSCRATEMSR),从而触发内核WARN警告。
该漏洞的影响主要体现在可用性方面。攻击者可以通过修改MSR寄存器和CPUID特性来反复触发内核WARN警告,导致内核日志被大量警告信息淹没,在某些配置下可能引发系统不稳定或性能下降。CVSS评分为5.5分,属于中等严重等级。攻击者需要本地低权限访问权限,但无需用户交互即可触发该漏洞。
该漏洞的技术原理涉及KVM nSVM嵌套虚拟化中TSC缩放功能的处理逻辑。在AMD SVM(Secure Virtual Machine)架构中,MSR_AMD64_TSC_RATIO寄存器用于控制TSC缩放比率,而X86_FEATURE_TSCRATEMSR CPUID特性标识处理器是否支持TSC比率MSR。
在正常的嵌套虚拟化场景中,当L1 hypervisor执行VMRUN以进入L2 guest时,KVM需要正确处理TSC缩放功能。如果L1修改了MSR_AMD64_TSC_RATIO寄存器的值(使其偏离KVM默认值),KVM需要确保TSC缩放功能在嵌套环境中得到正确支持。
原始代码使用WARN_ON断言来检查这种情况,但这种设计存在问题:用户空间程序可以在创建VM和vCPU之后、KVM_RUN之前的任何时间修改客户机的CPUID信息。具体来说,攻击者可以:
1. 创建一个新的VM和vCPU;
2. 通过ioctl写入MSR_AMD64_TSC_RATIO寄存器(修改TSC比率);
3. 通过ioctl清除X86_FEATURE_TSCRATEMSR CPUID特性位(隐藏TSC缩放支持);
4. 执行KVM_RUN触发嵌套VMRUN操作。
当执行到nested_vmcb02_prepare_control函数时,由于MSR值已偏离但CPUID未暴露相应功能,WARN_ON断言被触发,产生内核警告。该警告会在每次VMRUN时重复出现,导致系统日志被大量警告信息淹没。此外,漏洞描述中提到嵌套#VMEXIT路径也存在类似缺陷,但需要不同的修复方案。
修复方案是将WARN_ON断言替换为条件检查(if语句),在不支持嵌套TSC缩放时采取适当的处理措施而非触发内核警告。