CVE-2023-53670CVE-2023-53670是Linux内核nvme-core模块中存在的一个内存泄漏漏洞。该漏洞位于nvme_init_ctrl()函数中,当NVMe控制器初始化过程中出现错误时,由于没有正确调用dev_pm_qos_hide_latency_tolerance()函数来清理已分配的PM QoS(电源管理服务质量)资源,导致内存泄漏问题。
通过kmemleak工具可以检测到未引用的内存对象,这些对象在nvme_init_ctrl()调用dev_pm_qos_update_user_latency_tolerance()时被分配,但在错误处理路径中未被释放。该漏洞会持续消耗系统内存资源,虽然单次泄漏量较小(96字节),但在反复触发初始化失败的情况下,可能导致系统内存耗尽,影响系统可用性。
该漏洞的触发条件为本地低权限用户能够触发NVMe控制器初始化流程,例如通过nvme/044测试用例(双向认证测试)即可复现。CVSS评分为5.5,属于中危级别,主要影响系统的可用性,对机密性和完整性无影响。
该漏洞已在多个Linux内核稳定版本中得到修复,包括通过补丁2ed9a89192e3192e5fea7ff6475c8722513f325e、7237c26431cc78e5ec3259f4350f3dd58f6a4319等提交的修复方案。
该漏洞的技术原理涉及Linux内核的PM QoS(Power Management Quality of Service)子系统和NVMe驱动初始化流程。
在nvme_core模块的nvme_init_ctrl()函数中,当初始化NVMe控制器时,会调用dev_pm_qos_update_user_latency_tolerance()来设置延迟容忍度,该函数内部通过kmalloc_trace()分配一个96字节的内存对象来存储QoS相关信息。
漏洞的根本原因在于错误处理路径不完整:当nvme_init_ctrl()在后续初始化步骤中失败时,控制流跳转到错误处理标签处,但该错误处理路径中没有调用dev_pm_qos_hide_latency_tolerance()来释放先前分配的PM QoS资源,导致内存泄漏。
利用方式方面,攻击者需要本地访问权限(PR:L),通过触发NVMe控制器初始化失败即可造成内存泄漏。例如:
1. 通过blktests测试框架运行nvme/044测试(双向认证测试)
2. 使用kmemleak-clear清除泄漏记录
3. 执行./check nvme/044触发初始化流程
4. 使用kmemleak-scan和kmemleak-show检测泄漏
通过反复触发该路径,攻击者可以持续消耗内核内存,最终可能导致系统性能下降或内存耗尽(DoS)。漏洞的调用栈显示泄漏发生在kmalloc_trace -> dev_pm_qos_update_user_latency_tolerance -> nvme_init_ctrl的调用链中。