CVE-2022-50491CVE-2022-50491是Linux内核coresight CTI(Cross Trigger Interface,交叉触发接口)驱动中的一个高可用性影响漏洞。该漏洞源于cti_enable_hw()和cti_disable_hw()函数在原子上下文(atomic context)中被调用,但内部却使用了运行时电源管理(runtime PM)调用。由于runtime PM在与固件通信时可能导致睡眠(sleep),而原子上下文中不允许睡眠操作,这会导致系统在特定场景下发生挂起(hang)。
该问题在Juno开发平台上运行Perf Coresight测试或执行perf record命令时触发,会导致系统完全无响应。从CVSS评分来看,该漏洞评分为5.5分,属于中危级别,攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),机密性影响低(C:L),完整性影响无(I:N),可用性影响高(A:H)。虽然利用条件需要本地访问和特定硬件平台,但一旦触发,系统将完全不可用,影响严重。
此漏洞由Linux内核提交3c6656337852(Revert "firmware: arm_scmi: Add clock management to the SCMI power domain")引入并暴露,在commit 692c9a499b28修复了pm_runtime_put()错误设备参数问题后才被完整发现。修复方案是完全移除runtime PM调用,因为构建跟踪路径时已经完成了相关操作。
从技术层面分析,该漏洞的根本原因是在coresight CTI驱动的cti_enable_hw()和cti_disable_hw()函数中错误地使用了runtime PM接口(pm_runtime_resume和pm_runtime_put)。
具体而言,coresight子系统在启用跟踪路径时会调用cti_enable_hw(),该函数进而调用__pm_runtime_resume()。然而,cti_enable_hw()是从原子上下文(atomic context)中调用的,调用链为:perf_event_exec -> ctx_resched -> perf_event_sched_in -> ctx_sched_in -> merge_sched_in -> event_sched_in -> etm_event_add -> etm_event_start -> coresight_enable_path -> coresight_control_assoc_ectdev -> cti_enable -> cti_enable_hw。
在原子上下文中,调度器被禁用,不允许执行可能导致睡眠的操作。但pm_runtime_resume()在内部会调用__might_sleep()检查,当检测到在原子上下文中调用时,会触发BUG警告并可能导致系统挂起。特别是在ARM Juno平台上,由于SCMI电源域时钟管理的交互,问题更加严重。
利用方式非常简单,只需在受影响平台上执行以下perf命令即可触发:
perf record -e cs_etm//u -- ls
该命令会尝试启用coresight ETM(Embedded Trace Macrocell)跟踪,进而触发CTI启用流程,最终导致系统挂起。修复方法是在cti_enable_hw()和cti_disable_hw()中完全移除runtime PM调用,因为这些操作在构建跟踪路径时已经完成,无需重复执行。