CVE-2022-50484CVE-2022-50484是Linux内核ALSA(Advanced Linux Sound Architecture)USB音频驱动中的一个内存泄漏漏洞。该漏洞位于内核源码的sound/usb/urb.c文件中,具体涉及同步端点(sync endpoint)URB(USB Request Block)的分配逻辑。
在正常情况下,当USB音频驱动为同步端点分配URB或缓冲区时,如果遇到内存分配失败(返回-ENOMEM错误),驱动程序会中止当前操作并跳转到错误处理路径,释放先前已分配的所有资源。然而,该漏洞揭示了一个缺陷:当-ENOMEM错误发生在同步端点URB分配循环的中间阶段时,部分已分配的URB可能无法被正确释放。
根本原因在于ep->nurbs变量在循环开始时未被正确初始化。在分配循环开始之前,ep->nurbs的值仍然为零。当内存分配在中途失败时,错误处理程序会遍历URB列表进行清理,但由于ep->nurbs为零,循环不会执行,导致部分已分配的URB资源泄漏。
该漏洞的CVSS 3.1评分为5.5分,属于中危级别。虽然攻击向量为本地(AV:L)且需要低权限(PR:L),但其可用性影响为高(A:H),意味着成功利用该漏洞可能导致系统资源耗尽或内核不稳定。该漏洞影响多个Linux内核稳定版本,需要相关用户及时更新内核以修复此问题。
该漏洞的技术原理涉及Linux内核ALSA USB音频驱动中URB分配的内存管理逻辑。具体分析如下:
1. **触发场景**:当用户插入USB音频设备时,内核会调用ALSA USB音频驱动为设备的同步端点(sync endpoint)分配多个URB用于音频数据传输。URB是USB子系统中用于描述一次USB数据传输的数据结构。
2. **漏洞代码路径**:在snd_usb_endpoint_init函数或相关的URB分配函数中,存在一个循环用于分配多个URB。在循环开始时,ep->nurbs被设置为目标数量(例如每个端点分配的URB数量),然后逐个调用usb_alloc_urb()分配URB。
3. **缺陷分析**:原始代码中,ep->nurbs的赋值发生在循环内部或分配之后才更新。当循环中途因usb_alloc_urb()返回NULL(-ENOMEM)而跳出时,ep->nurbs的值尚未更新为实际已分配的URB数量,仍保持为零。
4. **错误处理失效**:错误处理函数(如release_urbs())通过遍历ep->nurbs次来释放URB。由于ep->nurbs为0,循环不执行,导致已分配的URB及其关联的DMA缓冲区永久泄漏。
5. **修复方案**:补丁通过在循环开始前首先设置ep->nurbs为目标数量,确保错误处理程序能够遍历完整的URB列表,释放所有已分配的资源。
6. **利用方式**:攻击者可以通过反复插入和拔出USB音频设备,或通过USB设备模拟工具发送特定请求,触发频繁的URB分配操作。在内存压力较大的环境下,-ENOMEM更容易被触发,从而导致URB资源持续泄漏,最终可能耗尽内核内存。