IPBUF安全漏洞报告
English
CVE-2025-71074 CVSS 4.7 中危

CVE-2025-71074 Linux内核functionfs竞态条件导致UAF漏洞

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

漏洞信息

漏洞编号
CVE-2025-71074
漏洞类型
竞态条件漏洞
CVSS评分
4.7 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel functionfs

相关标签

Linux Kernelfunctionfs竞态条件UAFUse-After-FreeCVE-2025-71074本地提权内核漏洞USB Gadget多线程竞态

漏洞概述

CVE-2025-71074是Linux内核functionfs子系统中的一个高危竞态条件漏洞。该漏洞存在于ffs_epfile_open()函数中,当文件打开操作与文件移除操作同时发生时,会产生竞争条件,导致file->private_data指向已释放的内存对象,从而引发Use-After-Free(UAF)漏洞。攻击者可通过精心设计的时间窗口,在文件计数降至零时触发动态文件移除,而此时另一个线程正在执行打开操作但尚未增加计数,最终导致打开成功但持有已释放对象的引用。后续对该文件的read()或write()操作将访问已释放内存,可能造成系统崩溃或潜在的权限提升。

技术细节

漏洞根本原因在于ffs->opened计数器的误用:atomic_dec_and_test()与atomic_add_return()不是原子配对操作,而文件对象在移除过程中始终保持可见状态。具体攻击条件如下:1) 当functionfs上打开的文件总数降至零时,动态文件会被移除;2) 移除操作可能在另一线程执行ffs_epfile_open()但尚未增加计数时发生;3) 此时打开操作仍会成功,导致UAF。修复方案包括:在ffs->mutex上序列化所有打开操作(针对ep0和动态文件);动态文件使用atomic_inc_not_zero(),若opened计数为零则打开失败并标记文件为注定删除;移除时通过simple_recursive_removal()回调标记inode并清除i_private指针;打开时验证文件状态为FFS_ACTIVE且未被移除。攻击者需在本地环境通过多线程并发操作触发竞争条件,成功利用可导致内核崩溃或代码执行。

攻击链分析

STEP 1
1
攻击者获得本地低权限访问,在Linux系统上识别functionfs设备节点
STEP 2
2
创建两个并发线程:一个执行打开操作,一个执行文件移除操作
STEP 3
3
通过usleep()等时序控制手段,在remover线程将opened计数归零的瞬间,opener线程恰好执行ffs_epfile_open()但尚未增加计数
STEP 4
4
remover线程检测到计数为零,开始执行simple_recursive_removal()移除动态文件,释放file->private_data对象
STEP 5
5
opener线程完成打开操作,返回成功但持有指向已释放对象的file->private_data指针
STEP 6
6
攻击者对打开的文件描述符执行read()或write()系统调用,触发对已释放内存的访问,导致UAF
STEP 7
7
成功利用可导致内核崩溃(DoS)或在特定条件下实现权限提升

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC概念验证代码(模拟竞态条件) #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <fcntl.h> #define VULN_DEVICE "/dev/usb_functionfs" void* opener_thread(void* arg) { // 线程1: 尝试打开functionfs设备 int fd = open(VULN_DEVICE, O_RDWR); if (fd >= 0) { // 在文件描述符上执行操作,触发UAF char buf[64]; read(fd, buf, sizeof(buf)); // 可能访问已释放内存 write(fd, "test", 4); close(fd); } return NULL; } void* remover_thread(void* arg) { // 线程2: 触发文件移除(等待计数归零) usleep(100); // 微调时序 // 模拟移除操作,使opened计数归零 // 在实际漏洞中,这会导致ffs_epfile_io_release被调用 return NULL; } int main() { pthread_t t1, t2; // 创建竞态条件 pthread_create(&t1, NULL, opener_thread, NULL); pthread_create(&t2, NULL, remover_thread, NULL); pthread_join(t1, NULL); pthread_join(t2, NULL); printf("PoC执行完成\n"); return 0; }

影响范围

Linux Kernel < 6.12 (未修复版本)
Linux Kernel 6.x分支受影响
使用functionfs子系统的USB Gadget配置受影响

防御指南

临时缓解措施
在官方补丁发布前,可通过以下措施临时缓解:1) 审查系统是否实际使用functionfs USB Gadget功能,如无必要可在内核配置中禁用CONFIG_USB_GADGET_FUNCTIONFS;2) 限制非特权用户访问/dev/usb_functionfs设备节点;3) 使用seccomp或AppArmor/SELinux策略限制相关系统调用;4) 监控内核日志中的functionfs相关错误信息;5) 考虑使用内核参数usb.urb.num=0临时禁用USB请求块以减少攻击面。

参考链接

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