IPBUF安全漏洞报告
English
CVE-2022-50551 CVSS 7.1 高危

CVE-2022-50551 Linux内核brcmfmac驱动移位越界漏洞

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

漏洞信息

漏洞编号
CVE-2022-50551
漏洞类型
移位越界(Shift-out-of-bounds)/ 整数溢出
CVSS评分
7.1 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核(drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c)

相关标签

Linux内核brcmfmacBroadcomWiFi驱动移位越界整数溢出UBSAN本地提权拒绝服务信息泄露

漏洞概述

CVE-2022-50551是Linux内核中Broadcom brcmfmac WiFi驱动固件请求分配函数(brcmf_fw_alloc_request())中存在的一个移位越界漏洞。该漏洞源于驱动在处理芯片版本号(chiprev)时未对其取值范围进行充分校验,直接使用BIT(chiprev)宏进行位运算。当设备提供的chiprev值过大(例如内核日志中显示的移位指数为151055786)时,BIT()宏将产生超出u32类型位宽范围的移位操作,触发UBSAN(Undefined Behavior Sanitizer)报告的shift-out-of-bounds错误。

该漏洞由Google的syzkaller模糊测试工具的修改版本发现,攻击者可通过构造恶意的USB WiFi设备或利用存在缺陷的固件交互流程触发该问题。在CVSS 3.1评分体系中,该漏洞获得7.1分(高危),攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性产生高影响(C:H),对完整性无影响(I:N),对可用性产生高影响(A:H)。这意味着本地低权限攻击者可利用该漏洞导致内核崩溃(DoS)或读取内核内存中的敏感信息。

该漏洞影响多个Linux内核稳定版本分支,修复补丁已合并到多个stable内核中,包括5.10.x、5.15.x、5.19.x等系列。漏洞的修复方式是在brcmf_fw_alloc_request()函数中添加对chiprev值的范围检查,确保其严格小于BITS_PER_TYPE(u32)(即32),否则函数返回NULL,由调用方(brcmf_usb_probe_cb()或brcmf_usb_reset_resume())进行NULL指针的妥善处理。

技术细节

该漏洞的技术根源位于Linux内核brcmfmac驱动的固件请求分配函数brcmf_fw_alloc_request()中。具体而言,当驱动从USB设备获取芯片版本信息时,会将chiprev值直接传递给BIT()宏进行位运算:BIT(chiprev)。BIT宏在Linux内核中定义为(1UL << (shift)),当shift值超过底层类型的位宽时,将导致未定义行为。

在内核日志中可以看到具体的崩溃现场:UBSAN报告shift exponent 151055786 is too large for 64-bit type 'long unsigned int'。这个异常的chiprev值(151055786)显然超出了合法范围(0-31),表明攻击者可通过恶意USB设备注入异常的芯片版本数据。

调用链分析:brcmf_usb_probe -> brcmf_attach -> brcmf_c_preinit_dcmds -> brcmf_c_process_clm_blob -> brcmf_usb_get_fwname -> brcmf_fw_alloc_request。当USB WiFi设备插入时,内核会触发该调用链,最终在brcmf_fw_alloc_request()中执行BIT(chiprev)时发生移位越界。

漏洞利用方式:攻击者需要物理访问目标系统或能够插入恶意的USB WiFi设备(支持Broadcom芯片的设备),通过固件级别的篡改使设备在USB描述符或固件握手中返回异常的chiprev值。一旦该值被传递到brcmf_fw_alloc_request(),将触发UBSAN检测并可能导致内核panic(拒绝服务),或在某些配置下泄露内核内存内容。

修复方案:补丁添加了如下检查逻辑——如果chiprev >= BITS_PER_TYPE(u32),则函数直接返回NULL。由于后续调用方(如brcmf_usb_probe_cb()和brcmf_usb_reset_resume())已具备处理NULL返回的逻辑,因此可以安全地拒绝异常的固件请求。

攻击链分析

STEP 1
步骤1:准备恶意设备
攻击者准备一个恶意的USB WiFi设备(或使用QEMU模拟Broadcom芯片设备),该设备在固件握手中返回异常的chiprev值(如151055786),该值远超合法范围(0-31)。
STEP 2
步骤2:插入设备触发驱动加载
攻击者将恶意设备插入目标Linux系统的USB端口,内核的USB核心层检测到新设备并触发brcmfmac驱动的probe流程,调用brcmf_usb_probe()函数。
STEP 3
步骤3:驱动初始化与固件请求
brcmfmac驱动在初始化过程中调用brcmf_attach() -> brcmf_c_preinit_dcmds() -> brcmf_c_process_clm_blob() -> brcmf_usb_get_fwname() -> brcmf_fw_alloc_request()的调用链,从设备获取芯片版本信息。
STEP 4
步骤4:触发移位越界
在brcmf_fw_alloc_request()函数中,恶意chiprev值被直接传递给BIT(chiprev)宏。由于chiprev值远超BITS_PER_TYPE(u32)(32位),导致1UL << 151055786的移位操作超出64位无符号整数的位宽范围。
STEP 5
步骤5:触发UBSAN检测或内核崩溃
UBSAN(未定义行为检测器)捕获shift-out-of-bounds错误并打印警告信息。在某些内核配置下,这可能导致内核panic(拒绝服务攻击),或者在未启用UBSAN的环境中导致未定义行为,可能造成内存损坏或信息泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2022-50551 PoC - Trigger shift-out-of-bounds in brcmf_fw_alloc_request() * * This PoC demonstrates how to trigger the vulnerability by providing * an out-of-range chiprev value to the brcmfmac driver via a malicious * USB WiFi device emulation (using QEMU or a hardware USB device). * * The vulnerability is triggered when BIT(chiprev) is called with * chiprev >= BITS_PER_TYPE(u32) (i.e., >= 32). * * In the syzkaller report, the actual chiprev value was 151055786, * which is far beyond the valid range. */ #include <linux/usb.h> #include <linux/bits.h> #include <linux/types.h> /* Simulate the vulnerable function from brcmfmac/firmware.c */ static u32 brcmf_fw_alloc_request_vulnerable(u32 chiprev, u32 chipid) { /* VULNERABLE: No bounds check on chiprev before BIT() operation */ u32 fwflags = (chipid << 16) | BIT(chiprev); return fwflags; } /* Simulate the fixed function with bounds check */ static u32 brcmf_fw_alloc_request_fixed(u32 chiprev, u32 chipid) { /* FIXED: Check chiprev against BITS_PER_TYPE(u32) */ if (chiprev >= BITS_PER_TYPE(u32)) return 0; /* Return NULL-equivalent */ u32 fwflags = (chipid << 16) | BIT(chiprev); return fwflags; } /* Trigger the vulnerability */ void trigger_cve_2022_50551(void) { u32 malicious_chiprev = 151055786; /* Value from syzkaller report */ u32 chipid = 0x4359; /* Example Broadcom chip ID */ pr_info("Triggering CVE-2022-50551 with chiprev=%u\n", malicious_chiprev); /* This call will trigger UBSAN: shift-out-of-bounds */ brcmf_fw_alloc_request_vulnerable(malicious_chiprev, chipid); /* The fixed version safely returns 0 */ brcmf_fw_alloc_request_fixed(malicious_chiprev, chipid); } /* * To reproduce in a real environment: * 1. Set up a QEMU VM with USB emulation support * 2. Create a malicious USB device descriptor that reports an * invalid chiprev value in the Broadcom firmware handshake * 3. Attach the device to the VM * 4. The kernel will trigger the UBSAN report when brcmfmac * driver attempts to allocate firmware request * * Expected kernel log output: * UBSAN: shift-out-of-bounds in drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c * shift exponent 151055786 is too large for 64-bit type 'long unsigned int' */

影响范围

Linux kernel < 5.10.150
Linux kernel 5.11.x - 5.15.x(部分版本)
Linux kernel 5.16.x - 5.19.x(部分版本)
Linux kernel 6.0.x(部分版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可采取以下临时缓解措施:1)在内核启动参数中禁用brcmfmac驱动(使用modprobe.blacklist=brcmfmac),但这将导致Broadcom WiFi设备无法使用;2)通过USB设备访问控制策略限制未授权USB设备的接入;3)在内核编译配置中启用UBSAN以检测并阻止此类未定义行为的利用;4)使用SELinux或AppArmor等强制访问控制机制限制加载恶意USB设备的权限。

参考链接

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