CVE-2026-31742Linux内核虚拟终端(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,造成系统不可用。