CVE-2023-53674CVE-2023-53674是Linux内核中clk(时钟)子系统中的一个内存泄漏漏洞。该漏洞位于devm_clk_notifier_register()函数中,该函数用于注册设备资源管理(devres)相关的时钟通知器。在实现过程中,函数正确地分配了devres资源用于clk notifier,但未能将该资源正确注册到设备上,导致在设备分离(detach)时通知器无法被自动注销,进而造成已分配的devres资源泄漏。
该漏洞最初是通过kmemleak(内核内存泄漏检测工具)在Chromebook平台上发现的。内存泄漏虽然不会直接导致数据泄露或权限提升,但随着时间推移或在高频率调用场景下,会持续消耗系统内存资源,最终可能导致系统可用内存耗尽,引发系统性能下降甚至内核层面的拒绝服务(DoS)状态。由于内核态内存泄漏的影响范围涉及整个系统稳定性,其危害性不可低估。
根据CVSS 3.1评分标准,该漏洞评分为5.5分,属于中等严重等级。攻击者需要本地低权限访问权限即可触发此漏洞,无需用户交互,主要影响系统的可用性。该漏洞已在Linux内核的多个稳定版本中通过提交49451db71b746df990888068961f1033f7c9b734、7fb933e56f77a57ef7cfc59fc34cbbf1b1fa31ff、a326cf0107b197e649bbaa2a2b1355894826ce32、cb1b04fd4283fc8f9acefe0ddc61ba072ed44877和efbbda79b2881a04dcd0e8f28634933d79e17e49进行了修复。
该漏洞的技术原理涉及Linux内核的设备资源管理(devres)框架。devm_clk_notifier_register()函数的设计初衷是在设备注销时自动释放与时钟通知器相关的资源,避免手动管理资源释放带来的复杂性。
在存在漏洞的代码实现中,函数执行了以下关键步骤:
1. 调用devres_alloc()分配一个devres资源结构体;
2. 初始化该资源并设置clk notifier;
3. 但遗漏了调用devres_add()将该资源注册到设备的devres链表。
由于缺少devres_add()调用,devres框架无法追踪该资源,因此当设备被注销(device_detach)时,devres的释放回调函数不会被触发,导致以下问题:
- clk notifier不会被自动注销,可能残留为悬空指针;
- 分配的devres资源结构体内存永久泄漏;
- 关联的clk_notifier结构体也无法被释放。
利用方式方面,攻击者需要具备本地系统的低权限访问权限。攻击者可以通过编写内核模块或利用已有的驱动程序接口,重复触发clk notifier的注册流程(例如反复进行设备的probe和remove操作),从而持续累积内存泄漏。虽然每次泄漏的内存量较小,但通过长时间运行或高频触发,可以导致内核内存资源逐渐耗尽,最终触发内核的内存不足处理逻辑(OOM killer),造成系统不稳定或服务中断。
修复方案是在分配资源后添加devres_add()调用,确保资源被正确注册到设备的devres链表中,从而在设备注销时能够被自动释放。