CVE-2023-53661CVE-2023-53661是Linux内核中Broadcom NetXtreme(bnxt)网络驱动程序的一个整数溢出漏洞。该漏洞存在于bnxt_get_nvram_directory()函数中,由于在执行算术运算(乘法运算)之前未能将操作数强制转换为更大的数据类型,导致算术表达式的值可能出现溢出。
该漏洞由Security Code and Linux Verification Center(linuxtesting.org)使用SVACE静态分析工具发现。漏洞的CVSS 3.1评分为5.5分,属于中等严重级别。攻击者需要本地低权限访问权限即可触发该漏洞,无需用户交互。漏洞的成功利用不会导致机密性泄露或完整性破坏,但会导致系统可用性受到严重影响,可能造成内核崩溃或系统不稳定。
bnxt驱动程序广泛用于支持Broadcom NetXtreme系列网卡,包括各种企业级服务器和数据中心环境中常见的BCM57xxx、BCM574xx等系列网络控制器。由于Linux内核广泛应用于服务器、桌面和嵌入式系统,该漏洞的影响范围较广。
该漏洞已在Linux内核的多个稳定版本中通过提交17e0453a7523ad7a25bb47af941b150a6c66d7b6、7c6dddc239abe660598c49ec95ea0ed6399a4b2a、d5eaf2a6b077f32a477feb1e9e1c1f60605b460e和efb1a257513438d43f4335f09b2f684e8167cad2进行了修复,主要通过使用安全的乘法宏替代直接的乘法运算符来避免溢出问题。
该漏洞的技术原理在于bnxt_get_nvram_directory()函数中存在的整数溢出问题。在C语言中,当两个较小的整数类型(如int或unsigned int)相乘时,结果仍然存储在相同类型的变量中,如果乘积超过该类型能表示的最大值,就会发生整数溢出,导致结果被截断为一个意外的小值或负值。
在bnxt_get_nvram_directory()函数中,开发者在计算NVRAM目录相关参数时使用了直接的乘法运算符(*),而不是使用Linux内核提供的安全乘法宏(如check_mul_overflow()或mul_u32_u32()等)。当传入的目录大小或偏移量参数经过乘法运算后,如果结果超出了变量类型的表示范围,就会发生溢出。
利用方式方面,攻击者可以通过以下步骤触发该漏洞:
1. 拥有本地系统的低权限访问权限
2. 通过ioctl或其他驱动程序接口与bnxt网卡驱动交互
3. 精心构造调用bnxt_get_nvram_directory()函数时的参数
4. 触发整数溢出后,可能导致缓冲区分配过小或数组越界访问
5. 最终导致内核崩溃(kernel panic)或系统不稳定
修复方案是将直接乘法运算符替换为Linux内核提供的安全乘法检查宏,这些宏在编译时或运行时检测溢出并返回错误,从而防止溢出导致的未定义行为。