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

CVE-2026-31767 Linux内核i915驱动除零拒绝服务漏洞

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

漏洞信息

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

相关标签

DoSLinux Kerneli915DRMDivision by ZeroLocal

漏洞概述

Linux内核的drm/i915/dsi驱动组件中存在一个逻辑缺陷,该漏洞源于驱动在命令模式下错误地应用了DSC(Display Stream Compression)水平时序调整。根据Bspec规范,此类调整本应仅在视频模式下执行,但驱动代码未能区分模式,导致在某些机器上计算出的水平总计数(htotal)过小。当系统尝试基于此值确定垂直总计数(vtotal)时,会导致每行时间(line_time_us)计算结果为零,进而引发除零错误。该漏洞会导致系统在加载驱动时发生内核崩溃,严重影响可用性。虽然修复此问题可防止华为Matebook E等设备上的内核崩溃,但可能无法完全恢复显示功能。

技术细节

该漏洞属于Linux内核子系统中DRM(Direct Rendering Manager)驱动的逻辑错误。DRM/i915驱动负责管理Intel集成显卡的显示输出,其中包括对DSI接口和DSC压缩技术的支持。漏洞的核心在于驱动混淆了“命令模式”和“视频模式”的时序处理逻辑。在命令模式下,驱动错误地引入了基于压缩比的时序调整步骤,导致计算出的水平总像素数异常减小。在随后的垂直时序计算过程中,这个极小的值被用作除数或导致中间计算结果(如line_time_us)变为0。当内核尝试执行类似除法操作时,触发除零异常,导致内核恐慌。攻击者需要具备本地低权限,通过触发特定的显示初始化流程即可利用此漏洞造成系统拒绝服务。

攻击链分析

STEP 1
步骤1: 获取本地访问权限
攻击者获得受影响设备的本地低权限账户访问权限(PR:L)。
STEP 2
步骤2: 触发显示驱动加载
攻击者触发系统启动或加载i915驱动程序,特别是在受影响的硬件(如华为Matebook E)上。
STEP 3
步骤3: 进入错误逻辑分支
驱动在DSI命令模式下运行,错误地执行了DSC水平时序调整算法。
STEP 4
步骤4: 触发除零异常
由于时序值过小,计算line_time_us时结果为0,后续计算vtotal时发生除零错误。
STEP 5
步骤5: 系统崩溃
内核捕获到除零异常,触发内核恐慌,导致系统重启或停止响应。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC Simulation for CVE-2026-31767 * This code simulates the logic error leading to a division by zero. * Trigger: Loading the i915 driver on affected hardware (e.g., Huawei Matebook E) * in command mode. */ #include <stdio.h> #include <stdlib.h> // Simulated structure for display timings struct display_timing { int htotal; int pixel_clock; // in kHz }; // Vulnerable function logic simulation void calculate_vtotal(struct display_timing *timing) { // Simulate DSC adjustment in command mode (the bug) // In command mode, this adjustment makes htotal extremely small printf("[+] Applying DSC timing adjustment in Command Mode...\n"); timing->htotal = 10; // Abnormally small value due to bug printf("[+] Adjusted htotal: %d\n", timing->htotal); // Calculate line time in microseconds // Logic: (htotal * 1000) / pixel_clock // If htotal is too small, integer division might result in 0 unsigned int line_time_us = (timing->htotal * 1000) / timing->pixel_clock; printf("[+] Calculated line_time_us: %u\n", line_time_us); // The crash happens here when determining vtotal // vtotal calculation typically involves dividing by line_time_us if (line_time_us == 0) { printf("[!] EXPLOIT TRIGGERED: Division by zero! Kernel Panic.\n"); // int vtotal = 1000000 / line_time_us; // This would crash the kernel } else { int vtotal = 1000000 / line_time_us; printf("[-] Safe execution. vtotal: %d\n", vtotal); } } int main() { printf("CVE-2026-31767 PoC Simulation\n"); printf("-------------------------------\n"); struct display_timing timing; timing.pixel_clock = 150000; // Typical pixel clock // Scenario: System enters command mode calculate_vtotal(&timing); return 0; }

影响范围

Linux Kernel < 6.x (Before fix commit 0b475e91ecc2)

防御指南

临时缓解措施
建议用户尽快更新Linux内核至修复了该漏洞的版本。如果无法立即更新内核,作为临时缓解措施,应避免在受影响的硬件平台上加载i915驱动或禁用相关的显示功能,以防止系统因内核崩溃而不可用。

参考链接

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