IPBUF安全漏洞报告
English
CVE-2023-53563 CVSS 5.5 中危

CVE-2023-53563 Linux内核amd-pstate-ut驱动cpufref引用计数泄漏漏洞

披露日期: 2025-10-04
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53563
漏洞类型
资源管理错误/引用计数泄漏/拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 (cpufreq: amd-pstate-ut驱动)

相关标签

Linux内核cpufreqamd-pstate-ut拒绝服务资源管理错误引用计数泄漏内核panic本地提权可用性影响

漏洞概述

CVE-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检测器告警。

攻击链分析

STEP 1
步骤1
攻击者加载amd-pstate-ut内核模块,触发驱动初始化并调用amd_pstate_ut_check_perf()和amd_pstate_ut_check_freq()函数
STEP 2
步骤2
这些函数内部调用cpufreq_cpu_get()获取CPU频率策略,策略引用计数增加但永远不会被释放(缺少cpufreq_cpu_put()调用)
STEP 3
步骤3
攻击者通过sysfs接口写入status文件(如echo passive > /sys/devices/system/cpu/cpufreq/amd_pstate/status)触发amd_pstate驱动模式切换
STEP 4
步骤4
内核调用amd_pstate_change_driver_mode()→cpufreq_unregister_driver()→cpufreq_remove_dev()→cpufreq_policy_free(),后者在cpufreq_policy_put_kobj()中等待引用计数归零
STEP 5
步骤5
由于引用计数永远不为零,进程无限期阻塞,触发hung task检测器告警(120秒超时),系统进入不可用状态(DoS)

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// Trigger the vulnerability by loading amd-pstate-ut driver and changing amd-pstate mode // This will cause the policy reference count to never reach zero // Step 1: Load the amd-pstate-ut driver (triggers cpufreq_cpu_get without cpufreq_cpu_put) modprobe amd-pstate-ut // Step 2: Wait for the ut driver to call check_perf/check_freq functions // These functions call cpufreq_cpu_get() but never call cpufreq_cpu_put() // Step 3: Change amd-pstate mode via sysfs to trigger the hang echo "passive" > /sys/devices/system/cpu/cpufreq/amd_pstate/status // Expected result: System hangs with "blocked for more than 120 seconds" message // Call trace will show: // wait_for_completion // cpufreq_policy_put_kobj // cpufreq_policy_free // cpufreq_remove_dev // cpufreq_unregister_driver // amd_pstate_change_driver_mode

影响范围

Linux kernel < 6.5 (包含amd-pstate-ut驱动的版本)
Linux kernel 6.5-rc2 及之前版本
Linux kernel stable分支受影响的版本(需通过git.kernel.org补丁修复)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1) 避免加载amd-pstate-ut驱动模块(不执行modprobe amd-pstate-ut);2) 限制非特权用户对cpufreq相关sysfs文件的写访问权限;3) 监控系统hung task日志,及时发现异常阻塞;4) 如系统已出现hang,可通过sysrq等方式强制重启恢复。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表