CVE-2023-53556CVE-2023-53556是Linux内核iavf(Intel Adaptive Virtual Function)驱动中存在的一个高危释放后使用(Use-After-Free)漏洞,CVSS评分为7.8。该漏洞源于iavf驱动在管理NAPI(New API)结构时的不一致操作:驱动对所有已分配的q_vectors[]数组执行了netif_napi_add()注册操作,但在某些情况下仅对部分q_vectors执行netif_napi_del()注销操作,随后便调用kfree()释放q_vectors内存,导致dev->napi_list中遗留了指向已释放内存的悬空指针。当系统调用free_netdev()释放网络设备时,内核会遍历napi_list链表并尝试访问这些已被释放的q_vectors内存,从而触发KASAN(Kernel Address Sanitizer)检测到的use-after-free错误。该漏洞可通过同时操作SR-IOV虚拟功能数量和网卡通道数来触发,影响系统的机密性、完整性和可用性,可能导致内核崩溃(Kernel Panic)或权限提升。
从技术层面分析,该漏洞的根本原因是iavf驱动在处理q_vectors数组生命周期管理时存在逻辑缺陷。具体而言:
1. **注册阶段**:iavf_probe()或iavf_init_rss()等初始化函数会对所有分配的q_vectors调用netif_napi_add(),将对应的napi_struct结构添加到dev->napi_list链表中。
2. **注销阶段**:在某些错误处理路径或资源回收路径中,iavf_remove()或相关清理函数仅对部分q_vectors调用netif_napi_del(),而对其他q_vectors未执行注销操作就直接调用kfree()释放内存。
3. **悬空指针残留**:释放后,dev->napi_list中仍然保留着指向已释放q_vectors内存的napi_struct指针,形成悬空引用。
4. **触发释放后使用**:当SR-IOV被禁用(sriov_numvfs设置为0)时,系统会调用free_netdev()释放网络设备,该函数遍历dev->napi_list链表并访问每个napi_struct结构。由于napi_struct指向的内存已被释放,内核在读取该内存时触发use-after-free漏洞。
漏洞利用需要本地低权限用户访问系统,并能够操作sysfs中的SR-IOV配置(如sriov_numvfs)和网卡通道配置(如通过ethtool修改combined通道数),通过竞态条件触发该漏洞。