CVE-2026-97549 in Linux
摘要
由 VulDB • 2026-09-26
在 Linux 内核中,已修复以下漏洞:
XFS:修复在修复短格式(sf)目录时块预留不足的问题
在使用 MKFS_OPTIONS="-n size=8192" 对 XFS for-next (截至 7.3-rc2) 进行 QA 测试期间,我观察到以下(经截断的)dmesg 崩溃信息:
XFS: Assertion failed: args->total >= dp->i_nblocks - nblks, file: fs/xfs/libxfs/xfs_da_btree.c, line: 2387 WARNING: fs/xfs/xfs_message.c:104 at assfail+0x46/0x4a [xfs], CPU#0: xfs_scrub/1426511
CPU: 0 UID: 0 PID: 1426511 Comm: xfs_scrub Tainted: G W 7.3.0-rc2-djwx #rc2 PREEMPT(lazy) 6e418570b606a39783b0e7e7b30dc407b965f9e8 Tainted: [W]=WARN
RIP: 0010:assfail+0x46/0x4a [xfs]
RSP: 0018:ffffc900010d7890 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 00000000ffffffd1 RDX: 0000000000000000 RSI: 0000000000000021 RDI: ffffffffa059fd38 RBP: 0000000000000002 R08: 0000000000000000 R09: 0000000000000000 R10: 000000000000000a R11: 000000007fffffff R12: ffffc900010d7940 R13: ffff888368d8f980 R14: ffffc900010d7a48 R15: ffffc900010d78d0 FS: 00007f445c5ce680(0000) GS:ffff8884a97ea000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f443803b9a8 CR3: 0000000107a4b000 CR4: 00000000003506f0 Call Trace: <TASK> xfs_da_grow_inode_int+0x2e0/0x300 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_dir2_grow_inode+0x6e/0x150 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_dir2_sf_to_block+0x149/0x870 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_dir_swap_prep+0xe2/0x110 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_dir_swap+0xfb/0x2f0 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_dir_rebuild_tree+0x99/0x100 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_directory+0x83/0x1c0 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_attempt+0x4f/0x1e0 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_scrub_metadata+0x393/0x5b0 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_ioc_scrubv_metadata+0x306/0x570 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_file_ioctl+0xa4f/0x1150 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
__x64_sys_ioctl+0x76/0xc0 do_syscall_64+0x7a/0x3b0 entry_SYSCALL_64_after_hwframe+0x4b/0x53
这是 commit 0fe77e57588b98 的后果,该提交向 xfs_da_grow_inode_int 添加了以下断言:
ASSERT(args->total >= dp->i_nblocks - nblks);
追溯至 xrep_dir_swap_prep,我注意到传递给 xfs_dir2_sf_to_block 的 xfs_da_args 对象将 args->total 设置为 1。这是不正确的,因为 mkfs 将目录块大小设置为 8k,而文件系统块大小为 4k。换句话说,此处 args->total 应为 2,而不是 1。
Dave Chinner 通过不同的渠道在同一分支上遇到了相同的问题——他的测试设置将 fs 块大小设置为 1k,在这种情况下,目录块大小仍设置为 4k。在此情况下,args->total 应为 4。
虽然将 args->total 的赋值更改为 sc->mp->m_dir_geo->fsbcount 可以使断言消失,但这并不是完整的修复方案。在 xrep_tempexch_estimate 中,我们也错误地假设短格式转换需要 1 个 fsblock,而实际上应为 m_dir_geo->fsbcount。如果不这样做,我们可能会在事务中预留空间不足,从而导致文件系统关闭(shutdown)。
请注意,xfs_dabuf_nfsb 辅助函数将为目录和 xattr 计算正确的值,因此我们使用它来替代硬编码逻辑。此外,修复 xrep_xattr_swap_prep 以通过 xfs_dabuf_nfsb 分配 args->total,以避免如果我们将来支持多 fsblock attr 时出现逻辑炸弹(logic bomb)。
Tripped-by: 0fe77e57588b98 ("xfs: assert the reservation covers each da fork growth")
If you want to get best quality of vulnerability data, you may have to visit VulDB.