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

CVE-2026-43224: Linux内核io_uring内存泄漏漏洞

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

漏洞信息

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

相关标签

Linux KernelMemory Leakio_uringDoSPrivilege Escalation (Local)CVE-2026-43224

漏洞概述

Linux内核的io_uring子系统中的零拷贝接收(zcrx)模块存在一个内存泄漏漏洞。该漏洞源于在特定32位架构但支持64位DMA的机器上,当DMA映射初始化失败时,错误处理路径未能正确释放已分配的scatter-gather table(sgtable)。由于代码逻辑中`!is_mapped`条件阻止了清理操作的执行,导致内核内存资源泄漏。攻击者需拥有本地低权限账号,通过恶意调用相关系统接口可触发此漏洞,长期利用可能导致系统内存耗尽,从而引发拒绝服务。

技术细节

该漏洞位于Linux内核的`io_uring/zcrx`驱动实现中,具体涉及`io_zcrx_map_area`函数。在正常的零拷贝接收流程中,系统需要调用`sg_alloc_table`初始化sgtable,随后调用`io_populate_area_dma`进行DMA区域填充和映射。然而,在`PAGE_POOL_32BIT_ARCH_WITH_64BIT_DMA`架构上,`io_populate_area_dma`可能失败。此时,代码进入错误处理路径,但该路径下的资源释放逻辑(如`sg_free_table`)被包含在`if (is_mapped)`的判断块内。由于映射操作失败,`is_mapped`标志为假,导致已分配的sgtable未被释放,形成内存泄漏。攻击者通过本地环境反复触发此失败路径,可累积消耗内核内存,最终导致系统崩溃或服务中断。

攻击链分析

STEP 1
1. 获取本地访问权限
攻击者需要在目标Linux系统上拥有低权限用户账号。
STEP 2
2. 触发特定系统调用
攻击者执行利用代码,通过io_uring接口调用零拷贝接收功能。
STEP 3
3. 触发DMA映射失败
在特定架构(32位系统支持64位DMA)下,故意或偶然触发`io_populate_area_dma`的失败条件。
STEP 4
4. 内存泄漏发生
由于错误处理路径缺陷,已分配的sgtable未被释放,导致内核内存泄漏。
STEP 5
5. 拒绝服务
攻击者重复上述步骤,耗尽系统内存,导致系统不稳定或崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-43224 * This code attempts to trigger the io_uring zerocopy receive path. * Successful exploitation requires a system with PAGE_POOL_32BIT_ARCH_WITH_64BIT_DMA. * Compile with: gcc -o poc_cve2026_43224 poc_cve2026_43224.c -luring */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <liburing.h> #define QUEUE_DEPTH 256 int main() { struct io_uring ring; int ret; // Initialize io_uring instance ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0); if (ret < 0) { perror("io_uring_queue_init"); return 1; } printf("[+] io_uring initialized. Attempting to trigger zcrx path...\n"); printf("[!] Note: This PoC demonstrates the setup. The actual leak depends on specific hardware conditions (32-bit arch with 64-bit DMA) and network configuration.\n"); // In a real scenario, one would set up a socket and register buffers // to force the io_zcrx_map_area path. // Loop to attempt triggering the condition for (int i = 0; i < 100; i++) { // Placeholder for the actual syscall sequence that triggers the bug // This typically involves IORING_OP_PROVIDE_BUFFERS with zerocopy enabled struct io_uring_sqe *sqe = io_uring_get_sqe(&ring); if (!sqe) { fprintf(stderr, "Could not get sqe\n"); break; } // Setup sqe for buffer registration (simplified) // io_uring_prep_provide_buffers(sqe, ...); io_uring_submit(&ring); io_uring_wait_cqe(&ring, NULL); } io_uring_queue_exit(&ring); printf("[+] Done.\n"); return 0; }

影响范围

Linux Kernel < v6.1 (Specific commit a983aae39776)
Linux Kernel < v6.6 (Specific commit ef075c1464ac)
Linux Kernel < v6.9 (Specific commit f1ae40332431)

防御指南

临时缓解措施
限制非特权用户访问io_uring功能(通过内核参数`io_uring_disabled`),或禁用零拷贝网络接收功能以降低风险。

参考链接

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