CVE-2023-53570CVE-2023-53570是Linux内核中wifi子系统nl80211模块存在的一个高危安全漏洞。该漏洞位于nl80211_parse_mbssid_elems()函数中,由于使用u8类型的变量num_elems来计数嵌套netlink属性attrs中的MBSSID元素数量,当用户空间进程通过nl80211接口指定256个或更多元素时,会导致整数溢出问题。
该整数溢出会进一步引发堆缓冲区溢出,因为num_elems变量决定了elems结构体中尾部数组的大小,随后程序会遍历attrs中的每个元素并向该数组写入数据。当num_elems溢出为0时,将分配一个过小的缓冲区,而后续的写入操作将超出缓冲区边界,从而造成堆内存破坏。
该漏洞的利用需要满足两个前提条件:首先,受影响的无线设备驱动必须设置了wiphy->mbssid_max_interfaces成员;其次,攻击者必须拥有CAP_NET_ADMIN权限。CVSS 3.1评分为7.8分,属于高危级别,对机密性、完整性和可用性均产生高影响。攻击者可通过本地方式触发该漏洞,实现权限提升或系统崩溃。
该漏洞的根本原因在于nl80211_parse_mbssid_elems()函数中对MBSSID元素计数使用了u8(无符号8位整数)类型的变量num_elems。当用户空间通过netlink接口传递包含256个或更多MBSSID元素的嵌套属性attrs时,num_elems在递增过程中会发生整数溢出,从255回绕到0。
具体利用流程如下:
1. 攻击者构造恶意的netlink消息,在MBSSID属性中包含≥256个元素
2. nl80211_parse_mbssid_elems()函数遍历attrs并使用u8变量num_elems计数
3. 当计数达到256时,num_elems溢出为0
4. 基于溢出后的num_elems值分配elems结构体,其中包含大小为num_elems的尾部数组
5. 函数继续遍历attrs中的所有元素并写入elems->成员数组
6. 由于实际元素数量(≥256)远大于分配的缓冲区大小(0),导致堆缓冲区溢出
该漏洞仅影响设置了wiphy->mbssid_max_interfaces的无线物理设备,且需要CAP_NET_ADMIN权限才能触发。修复方案是检查attrs中的最大元素数量为255,防止溢出发生。