CVE-2022-50510CVE-2022-50510是Linux内核perf/smmuv3(SMMUv3性能监控单元)驱动程序中的一个资源泄漏漏洞。该漏洞存在于arm_smmu_pmu_init()函数中,当platform_driver_register()调用失败时,函数没有正确清理之前通过cpuhp_setup_state_multi()注册的热插拔回调(hotplug callback),导致回调函数泄漏。
该漏洞的CVSS评分为5.5,属于中危级别。攻击者需要本地低权限访问权限即可利用此漏洞,无需用户交互。漏洞的主要影响是系统可用性(Availability),可能导致内核资源耗尽或系统不稳定,但不会直接导致机密性或完整性损失。
此漏洞与之前在arm-ccn驱动中修复的类似问题(commit 26242b330093)相似,属于典型的错误处理路径中资源清理不完整的问题。Linux内核中许多驱动程序使用CPU热插拔机制来管理CPU状态变化时的回调函数,如果初始化过程中发生错误而没有正确注销这些回调,就会导致资源泄漏,长期积累可能引发系统性能下降或崩溃。
该漏洞影响多个Linux内核稳定版本,修复补丁已合并到多个stable分支中。修复方法是在platform_driver_register()失败时调用cpuhp_remove_multi_state()来移除已注册的回调。
该漏洞的技术原理涉及Linux内核CPU热插拔(CPU hotplug)机制和SMMUv3性能监控单元驱动的初始化流程。
在arm_smmu_pmu_init()函数执行过程中,首先调用cpuhp_setup_state_multi()注册一个CPU热插拔状态回调,该回调用于在CPU上线/下线时执行SMMUv3 PMU相关的处理逻辑。注册成功后,函数继续调用platform_driver_register()注册平台驱动。
问题出现在错误处理路径:当platform_driver_register()调用失败时,arm_smmu_pmu_init()函数直接返回错误码,但没有调用cpuhp_remove_multi_state()来撤销之前注册的热插拔回调。这导致:
1. 回调函数指针仍然保留在内核的cpuhp状态机中
2. 当CPU发生热插拔事件时,内核会尝试调用已经不存在的驱动上下文
3. 多次失败初始化可能导致多个泄漏的回调累积
4. 最终可能导致内核空指针引用或资源耗尽
利用方式方面,攻击者需要本地访问权限(AV:L)和低权限(PR:L),但无需用户交互(UI:N)。攻击者可以通过反复触发驱动初始化失败条件来累积泄漏的热插拔回调,最终导致系统不稳定或拒绝服务。由于此漏洞影响可用性(A:H),攻击的主要后果是系统可用性受损。
修复方案参考了commit 26242b330093中arm_ccn_init()的处理方式,在fail path中添加cpuhp_remove_multi_state()调用,确保资源正确释放。