CVE-2026-31531Linux内核的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的大小计算。