CVE-2022-50551CVE-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返回的逻辑,因此可以安全地拒绝异常的固件请求。