CVE-2023-53583CVE-2023-53583是Linux内核RISC-V架构性能监控单元(PMU)驱动中的一个逻辑缺陷漏洞。该漏洞源于commit 096b52fd2bb4("perf: RISC-V: throttle perf events")引入的perf事件限流机制与RISC-V PMU驱动的不兼容问题。具体而言,当perf事件溢出中断处理时间过长时,内核框架会通过perf_sample_event_took()函数降低采样率并对事件进行限流(throttling)。在限流解除后,timer中断处理会调用riscv_pmu_start()函数,但该函数中保留了不必要的PERF_HES_STOPPED标志检查,导致触发WARN_ON_ONCE()警告。该警告虽然不会直接导致系统崩溃,但表明内核处于不一致状态,可能影响系统稳定性和可用性。CVSS评分为5.5分,属于中危级别,攻击向量为本地,需要低权限即可触发,无需用户交互,主要影响系统可用性。修复方案是参考Arm、Loongarch、Csky和Mips等其他PMU驱动,移除riscv_pmu_start()中不必要的PERF_HES_STOPPED标志检查。
该漏洞的技术原理如下:
1. 自commit 096b52fd2bb4起,内核增加了perf_sample_event_took()函数用于报告溢出中断中花费的时间。当中断处理时间过长时,perf框架会降低sysctl_perf_event_sample_rate和max_samples_per_tick的值。
2. 当hwc->interrupts超过max_samples_per_tick时,hwc->interrupts会被设置为MAX_INTERRUPTS,事件将在__perf_event_account_interrupt()函数中被限流。
3. 关键问题在于:RISC-V PMU驱动在pmu_sbi_ovf_handler()函数中调用perf_event_overflow()后,没有调用riscv_pmu_stop()来更新PERF_HES_STOPPED标志以避免限流。
4. 当perf框架在timer中断处理中解除事件限流时,会触发riscv_pmu_start()函数。由于该函数中保留了PERF_HES_STOPPED标志检查,而标志未被正确设置,导致WARN_ON_ONCE()警告被触发。
5. 复现条件:在RISC-V平台上运行perf工具,触发足够多的性能事件使中断处理时间超过阈值,导致事件被限流,随后限流解除时即会触发警告。
利用方式:本地攻击者通过运行特定的perf命令或性能测试工具,使PMU中断频繁触发,最终触发内核警告。虽然该警告本身不会直接造成拒绝服务,但可能导致内核日志被大量警告信息填充,影响系统可维护性。