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

CVE-2026-43118 Linux内核btrfs日志回放大小不一致漏洞

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

漏洞信息

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

相关标签

Linux KernelbtrfsFilesystemLogic ErrorDoS

漏洞概述

Linux内核中的btrfs文件系统存在一个安全漏洞,该问题源于日志回放机制中的逻辑缺陷。当记录inode的存在(例如由于新建名称或记录目录条目)时,系统会将日志中inode项的生成号设置为0,意在告知日志回放函数保留子卷树中的i_size。然而,如果inode已在当前事务中记录过或创建于旧事务且大小为0,随后因硬链接或重命名再次记录时,会记录i_size为0且生成号为0。在日志回放时,系统检测到生成号为0,错误地跳过了将i_size从旧值更新为0的操作。这导致在断电恢复后,本应被截断的文件保留了原始数据大小,造成文件系统状态不一致。

技术细节

该漏洞的核心在于btrfs文件系统日志功能的`overwrite_item()`函数处理逻辑。正常情况下,当仅记录inode存在(LOG_INODE_EXISTS)而不记录数据范围时,系统将生成号设为0,以指示回放过程不应覆盖子卷树中的i_size。但在特定场景下:首先创建文件并写入数据(如64K),同步后将其截断为0并fsync;接着创建硬链接或重命名并fsync目录。此时,inode被再次以“存在模式”记录,携带i_size=0和generation=0。当系统崩溃重启进行日志回放时,`overwrite_item()`发现日志项的generation为0,误判需保留子卷树中的旧i_size(64K),从而忽略了日志中记录的i_size(0)。这导致文件恢复后大小错误,破坏了文件系统的一致性。修复方案修改了`fill_inode_item()`,确保如果inode在当前事务中已记录过i_size,则记录真实生成号;对于旧事务的inode,则从提交根中获取正确的i_size,以确保回放逻辑能正确更新文件大小。

攻击链分析

STEP 1
步骤1
攻击者需要拥有本地系统的低权限访问能力(AV:L/PR:L)。
STEP 2
步骤2
在btrfs文件系统上创建目录和文件,并向文件写入数据(如64K)。
STEP 3
步骤3
执行sync操作,然后使用xfs_io将文件截断为0大小并执行fsync。
STEP 4
步骤4
为该文件创建硬链接或重命名,并对父目录执行fsync,触发inode以LOG_INODE_EXISTS模式记录。
STEP 5
步骤5
触发系统崩溃或断电(或模拟此场景)。
STEP 6
步骤6
系统重启并进行日志回放,由于漏洞逻辑,文件大小未更新为0,导致文件系统数据不一致(可用性/完整性受损)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/bin/bash # PoC for CVE-2026-43118: btrfs log replay size inconsistency # Requires a mounted btrfs filesystem at /mnt mkdir -p /mnt/dir # Create a file and write 64K data xfs_io -f -c "pwrite 0 64K" /mnt/dir/foo # Sync to ensure data is on disk sync # Truncate file to 0 and fsync xfs_io -c "truncate 0" -c "fsync" /mnt/dir/foo # Create a hard link (triggers LOG_INODE_EXISTS) ln /mnt/dir/foo /mnt/dir/bar # Fsync the directory to persist the link xfs_io -c "fsync" /mnt/dir # Simulate power fail / crash (e.g., echo b > /proc/sysrq-trigger) # After reboot and log replay, check file size ls -l /mnt/dir/foo # Expected: 0 bytes # Vulnerable result: 64K bytes

影响范围

Linux Kernel (版本需参考Git提交修复记录)

防御指南

临时缓解措施
建议尽快升级Linux内核至修复该漏洞的版本。在升级前,避免在关键操作流程中执行截断文件后立即创建硬链接并同步目录的操作,以降低触发日志回放错误的风险。

参考链接

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