CVE-2022-50473CVE-2022-50473是Linux内核cpufreq(CPU频率调节)子系统中的一个高可用性影响漏洞。该漏洞源于cpufreq_policy_alloc()函数中completion结构体的初始化顺序问题。具体而言,当kobject_init_and_add()调用失败时,cpufreq_sysfs_release()会尝试使用一个尚未初始化的completion结构体,导致系统触发页面错误(page fault)并在内核的complete()函数处崩溃。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问即可触发此漏洞,无需用户交互。漏洞的影响范围仅限于系统可用性,不会泄露机密信息或破坏数据完整性,但会导致内核崩溃和系统拒绝服务。从漏洞的调用栈来看,该问题通常在acpi_cpufreq驱动初始化或CPU热插拔过程中被触发,当cpufreq_register_driver()或cpufreq_online()执行过程中出现异常时,会进入错误的代码路径并触发未初始化内存的访问。此漏洞已通过Linux内核稳定版补丁修复,涉及多个内核版本。
该漏洞的根本原因是Linux内核cpufreq子系统中completion结构体的初始化时机不当。在cpufreq_policy_alloc()函数中,kobject_init_and_add()会在completion_init()之前被调用。当kobject_init_and_add()调用失败时,系统会通过kobject_put()触发cpufreq_sysfs_release()的调用路径,进而在complete()函数中访问未初始化的completion结构体。由于completion结构体内部的等待队列头(wait_queue_head)包含随机或无效的指针数据,对complete()的调用会导致对地址0xfffffffffffffff8的非法内存访问,触发"BUG: unable to handle page fault"错误。
漏洞触发条件:
1. 本地用户加载cpufreq相关内核模块(如acpi_cpufreq)
2. 在cpufreq_register_driver()或cpufreq_online()执行过程中,kobject_init_and_add()调用失败
3. 错误处理路径调用kobject_put(),进而调用cpufreq_sysfs_release()
4. cpufreq_sysfs_release()调用complete()访问未初始化的completion
修复方案是将completion的初始化移到kobject_init_and_add()调用之前,确保在任何可能调用complete()的代码路径执行前,completion结构体已被正确初始化。