CVE-2022-50543CVE-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成功分配后才负责释放操作,避免在错误路径中重复释放。