CVE-2023-53563CVE-2023-53563是Linux内核中cpufreq子系统的amd-pstate-ut驱动存在的一个资源管理缺陷。该漏洞源于驱动在调用cpufreq_cpu_get()获取CPU频率策略(policy)后,未能在适当的位置调用对应的cpufreq_cpu_put()来释放策略引用,导致策略对象被永久标记为busy状态。当其他内核实体(如amd_pstate模式切换逻辑)尝试访问该策略时,会因等待引用计数归零而被无限期阻塞,最终引发系统hung task检测告警甚至内核panic。CVSS评分为5.5分,属于中危级别。该漏洞需要本地低权限用户即可触发,无需任何用户交互,主要影响系统可用性,对机密性和完整性无影响。漏洞已在多个Linux内核稳定版本中修复,涉及多个git.kernel.org补丁提交。
在Linux内核的cpufreq框架中,cpufreq_cpu_get()和cpufreq_cpu_put()是一对引用计数管理函数。当调用cpufreq_cpu_get()获取指定CPU的频率策略时,会增加策略对象的引用计数;调用cpufreq_cpu_put()则减少引用计数。当引用计数不为零时,cpufreq框架不允许释放该策略。
在amd-pstate-ut驱动的amd_pstate_ut_check_perf()和amd_pstate_ut_check_freq()函数中,代码调用了cpufreq_cpu_get()获取CPU策略并标记为busy,但缺少对应的cpufreq_cpu_put()调用。这导致策略对象的引用计数永远无法归零。
当用户通过sysfs接口(如echo命令写入status文件)触发amd_pstate驱动模式切换时,内核会调用amd_pstate_change_driver_mode(),进而调用cpufreq_unregister_driver()和cpufreq_remove_dev()。这些函数会调用cpufreq_policy_free(),后者内部调用cpufreq_policy_put_kobj()等待引用计数归零。由于引用计数永远不为零,进程会在wait_for_completion()处无限期阻塞,超过120秒后触发hung task检测器告警。