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.

来源

Might our Artificial Intelligence support you?

Check our Alexa App!