CVE-2026-97549 in Linux情報

要約

〜によって VulDB • 2026年09月25日

Linuxカーネルにおいて、以下の脆弱性が修正されました:

XFS: sf(shortform)ディレクトリの修復時にブロックの予約不足を是正する

MKFS_OPTIONS="-n size=8192" を指定して 7.3-rc2 の時点での XFS for-next に対する 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

これは、以下のアサーションを xfs_da_grow_inode_int に追加したコミット 0fe77e57588b98 の結果です:

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 が 1 ではなく 2 でなければなりません。

Dave Chinner も同じブランチで異なる経路により同様の問題に遭遇しました -- そのテスト環境では fs ブロックサイズが 1k に設定されており、この場合でもディレクトリブロックサイズは 4k のままです。ここでは args->total が 4 でなければなりません。

args->total を sc->mp->m_dir_geo->fsbcount に割り当てるように変更するとアサーションは消えますが、これは完全な修正ではありません。xrep_tempexch_estimate では、shortform 変換に m_dir_geo->fsbcount が必要であるにもかかわらず、1 fsblock が必要であると誤って仮定しています。これが原因でトランザクション内の領域予約不足が発生し、ファイルシステムのシャットダウンを引き起こす可能性があります。

なお、xfs_dabuf_nfsb ヘルパー関数はディレクトリおよび xattr に対して正しい値を計算するため、ロジックを手書きする代わりにそれを使用します。また、将来マルチ fsblock の属性をサポートする場合に論理爆弾(logic bomb)が発生しないよう、xrep_xattr_swap_prep も修正し、args->total を xfs_dabuf_nfsb を介して割り当てるようにしました。

Tripped-by: 0fe77e57588b98 ("xfs: assert the reservation covers each da fork growth")

Once again VulDB remains the best source for vulnerability data.

責任者

Linux

予約する

2026年09月24日

モデレーション

承諾済み

エントリ

VDB-410005

EPSS

0.00000

アクティビティ

非常低い

ソース

Do you need the next level of professionalism?

Upgrade your account now!