CVE-2022-50544CVE-2022-50544是Linux内核USB主机控制器(xHCI)驱动中的一个内存泄漏漏洞。该漏洞位于xhci_alloc_stream_info()函数中,该函数负责为USB流(stream)分配流上下文数组。在分配stream_info->stream_ctx_array时,调用了xhci_alloc_stream_ctx()来分配内存。然而,当函数执行过程中发生错误时,已经分配的stream_info->stream_ctx_array资源没有被正确释放,导致内存泄漏问题长期存在。
该漏洞的CVSS评分为5.5,属于中危级别。其攻击向量为本地攻击(AV:L),需要低权限(PR:L),无需用户交互(UI:N)。虽然机密性和完整性影响较低,但可用性影响较高(A:H),意味着攻击者可以通过反复触发该错误路径来持续消耗系统内存资源,最终可能导致系统可用内存耗尽,引发系统性能下降甚至拒绝服务(DoS)。
此漏洞影响所有使用受影响版本Linux内核的系统,特别是在使用USB 3.0 xHCI主机控制器的环境中更为常见。该漏洞已在多个Linux内核稳定版本中得到修复,包括多个stable分支的补丁提交。修复方案是在错误处理路径中添加xhci_free_stream_ctx()调用,确保在异常情况下也能正确释放已分配的流上下文数组内存。
从技术层面分析,该漏洞的根因在于xhci_alloc_stream_info()函数中的错误处理路径不完整。具体技术细节如下:
1. **漏洞位置**:xhci_alloc_stream_info()函数,定义在Linux内核的drivers/usb/host/xhci.c文件中。该函数用于为USB流传输分配流信息结构体。
2. **漏洞原理**:当调用xhci_alloc_stream_info()分配流信息时,函数内部会调用xhci_alloc_stream_ctx()来分配stream_info->stream_ctx_array指向的DMA一致性内存区域。如果在分配过程中后续步骤失败(例如DMA映射失败或其他资源分配错误),函数会跳转到错误处理标签处退出,但未释放已经成功分配的stream_ctx_array内存。
3. **利用方式**:攻击者可以通过编写特定的USB驱动或利用用户态USB设备操作接口,频繁触发流分配失败的条件。由于每次失败都会泄漏固定大小的内存(取决于流上下文数组的大小),攻击者可以通过持续触发该路径来耗尽系统的DMA内存池或内核内存。
4. **影响范围**:该漏洞影响Linux内核的多个版本,受影响的版本范围从引入该代码的版本开始,直至各个stable分支的修复版本。具体的修复补丁包括782c873f8e76、7e271f42a5cc、7fc6bab3413e、91271a3e772e和9fa81cbd2dd3等多个提交。
5. **修复方案**:在错误处理路径中增加xhci_free_stream_ctx(&stream_info->stream_ctx_array)调用,确保在任何退出路径上都能正确释放已分配的内存资源,避免内存泄漏。