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

CVE-2026-43201 Linux Kernel APEI/GHES越界访问漏洞

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

漏洞信息

漏洞编号
CVE-2026-43201
漏洞类型
内存越界访问
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelDoSMemory CorruptionGHESARMCVE-2026-43201

漏洞概述

Linux内核APEI/GHES组件在处理ARM处理器错误记录时存在越界访问漏洞。因未对BIOS生成的错误记录中的 `section_length` 和 `ctx_info->size` 进行充分验证,当接收到畸形数据时,内核会读取边界外的内存。这导致内核发生OOPS(恐慌),造成系统拒绝服务。该漏洞需本地权限触发,依赖特定BIOS行为。

技术细节

漏洞原理在于Linux内核 `drivers/ras/ras.c` 文件中的 `log_arm_hw_error` 函数。该函数负责解析来自BIOS的ARM处理器错误信息结构。代码在遍历上下文信息时,使用指针算术来定位下一个 `cper_arm_ctx_info` 结构体。关键问题在于循环中直接使用 `ctx_info->size` 计算偏移量 `sz`,并移动指针 `ctx_info`,而没有检查计算出的地址是否仍在原始分配的缓冲区范围内。攻击者(或恶意的BIOS/QEMU环境)可以构造一个 `section_length` 很小但声称包含大量上下文信息的错误记录,或者是一个被截断的记录。当内核尝试访问这些越界地址时,会触发缺页异常,导致内核崩溃。由于攻击向量为本地且需要低权限,主要影响是系统可用性(DoS),而非机密性泄露。

攻击链分析

STEP 1
环境准备
攻击者拥有本地低权限访问权限,或能够控制/修改BIOS/固件提供的ACPI表(例如在虚拟化环境中)。
STEP 2
触发错误
系统产生ARM处理器错误,或通过机制触发GHES(Generic Hardware Error Source)处理流程。
STEP 3
提交恶意数据
BIOS或固件向内核提交一个特制的GHESv2错误记录,该记录的 `section_length` 过小或 `ctx_info->size` 字段异常大。
STEP 4
内核解析失败
Linux内核的 `log_arm_hw_error` 函数在解析该记录时,未进行边界检查,导致指针越界。
STEP 5
系统崩溃
内核访问非法内存地址,触发Oops或Panic,导致系统重启或拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <string.h> // Simulating the kernel structure handling struct cper_arm_ctx_info { int size; // ... other fields ... }; // Simulated vulnerable logic from drivers/ras/ras.c void simulate_vulnerable_parse(struct cper_arm_ctx_info *ctx_info, int context_info_num, int buffer_size) { struct cper_arm_ctx_info *current = ctx_info; unsigned long ctx_len = 0; for (int n = 0; n < context_info_num; n++) { // Vulnerability: No check if (current + sz) exceeds allocated buffer_size int sz = sizeof(struct cper_arm_ctx_info) + current->size; // Move pointer based on untrusted size value current = (struct cper_arm_ctx_info *)((long)current + sz); ctx_len += sz; printf("Step %d: Pointer moved to %p, Total offset: %lu\n", n, current, ctx_len); // In a real kernel, accessing 'current' here if out of bounds causes an Oops/Panic if ((char *)current > (char *)ctx_info + buffer_size) { printf("[OOPS] Kernel panic: Out of bounds memory access!\n"); break; } } } int main() { // Allocate a small buffer to simulate a valid BIOS error record area const int BUFFER_SIZE = 64; char *buffer = malloc(BUFFER_SIZE); memset(buffer, 0, BUFFER_SIZE); struct cper_arm_ctx_info *fake_record = (struct cper_arm_ctx_info *)buffer; // Exploit: Set a size that forces the pointer arithmetic to go past the buffer fake_record->size = 200; // Malicious large size printf("Triggering CVE-2026-43201 PoC simulation...\n"); simulate_vulnerable_parse(fake_record, 1, BUFFER_SIZE); free(buffer); return 0; }

影响范围

Linux Kernel < 6.18
Linux Kernel stable branches before specific commits

防御指南

临时缓解措施
在应用补丁前,无法通过软件配置完全缓解此问题,因为漏洞源于对BIOS数据的信任。建议用户确保BIOS/固件为最新版本,以减少产生畸形错误记录的可能性。对于虚拟化环境,应确保Hypervisor不生成恶性的ACPI/GHES表。

参考链接

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