CVE-2022-50515CVE-2022-50515是Linux内核AMD GPU驱动(drm/amdgpu)中存在的一个内存泄漏漏洞。该漏洞位于hpd_rx_irq_create_workqueue()函数中,在处理热插拔检测接收中断(HPD RX IRQ)的离线工作时被触发。
在AMD GPU驱动的初始化过程中,系统需要创建一组工作队列(workqueue)数组来处理HPD RX中断的离线工作负载。这些工作队列用于异步处理GPU热插拔事件,确保系统能够正确响应显示设备的连接和断开。然而,当创建工作队列数组的过程中发生失败时(例如由于内存分配失败等原因),驱动程序未能正确执行清理操作。具体而言,已经成功创建的工作队列未被销毁,为hpd_rx_irq_offload_work_queue结构体数组分配的内存也未被释放。
这种资源泄漏会导致内核内存逐渐耗尽,特别是在频繁触发GPU热插拔事件或反复初始化GPU驱动的场景下。攻击者可以通过本地低权限访问,利用该漏洞持续消耗系统内存资源,最终可能导致系统性能下降或触发内核的内存不足(OOM)机制,从而影响系统可用性。该漏洞的CVSS评分为5.5,属于中等严重等级,攻击者需要本地低权限访问即可利用,无需用户交互。
该漏洞的技术原理涉及Linux内核AMD GPU驱动中的工作队列管理机制。
在amdgpu驱动初始化过程中,hpd_rx_irq_create_workqueue()函数负责为每个HPD(Hot Plug Detection)接收器创建一个工作队列。工作队列是Linux内核中用于异步执行任务的机制,允许驱动程序将耗时操作推迟到进程上下文执行。
漏洞的根本原因在于错误处理路径不完整。当使用alloc_workqueue()创建工作队列的循环过程中,如果某一次调用失败(例如由于系统内存压力),函数会返回一个错误码,但在此之前已经成功创建的工作队列没有被逐个销毁(通过destroy_workqueue()),同时为work_queue结构体数组分配的内存也没有被释放(通过kfree())。
攻击利用方式:
1. 攻击者需要拥有系统的本地低权限访问权限;
2. 通过触发AMD GPU驱动的初始化或重新初始化流程(例如通过加载/卸载amdgpu模块);
3. 在内存压力条件下,使alloc_workqueue()调用失败;
4. 观察内核内存使用量的持续增长;
5. 反复执行上述步骤以耗尽系统内存;
6. 最终触发内核OOM killer或导致系统不稳定。
该漏洞的影响主要体现在可用性方面(CVSS向量中A:H),由于每次泄漏的内存量相对较小,攻击者需要持续触发才能造成显著影响。