CVE-2026-80734 in Linux情報

要約

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

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

btrfs: キャッシュされたinodeのmappingフラグを初期化する

[BUG]
8Kブロックサイズと4Kページサイズの環境でgeneric/795を実行すると、テストが常に失敗し、folioサイズに関連するいくつかのASSERT()が発動します。

795 (241074): drop_caches: 3 assertion failed: IS_ALIGNED(start, blocksize) && IS_ALIGNED(end + 1, blocksize), in extent_io.c:1404 (blocksize=8192 root=262 ino=258 start=16826368 end=16830463 mapping min order=0) ------------[ cut here ]------------
kernel BUG at extent_io.c:1404! Oops: invalid opcode: 0000 [#1] SMP
CPU: 8 UID: 0 PID: 241105 Comm: fsstress Tainted: G OE 7.2.0-rc5-custom+ #442 PREEMPT(full) f4bfb352566f3949f29c233ce6f735050a03b245 Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS unknown 02/02/2022 RIP: 0010:assert_folio_range.cold+0x3d/0x3f [btrfs]
Call Trace: <TASK> btrfs_read_folio+0x9e/0x170 [btrfs 4cd1dd93b341b8ef766643f9512f4a86259567a3]
prepare_one_folio.constprop.0+0x104/0x2a0 [btrfs 4cd1dd93b341b8ef766643f9512f4a86259567a3]
btrfs_buffered_write+0x285/0xa50 [btrfs 4cd1dd93b341b8ef766643f9512f4a86259567a3]
btrfs_do_write_iter+0x1aa/0x210 [btrfs 4cd1dd93b341b8ef766643f9512f4a86259567a3]
iter_file_splice_write+0x31a/0x540 direct_splice_actor+0x53/0x170 splice_direct_to_actor+0xe9/0x240 do_splice_direct+0x76/0xb0 vfs_copy_file_range+0x1fd/0x630 __x64_sys_copy_file_range+0xf9/0x220 do_syscall_64+0xe1/0x790 entry_SYSCALL_64_after_hwframe+0x4b/0x53 </TASK> ---[ end trace 0000000000000000 ]---

ASSERT()自体は、後のパッチによって追加されたものです。 このクラッシュは、新しいデバッグパッチを適用し、かつ今回の修正を行わない場合にトリガーされます。

[CAUSE]
上記のケースでは、start 16826368 は正しく8Kアライメントされていますが、end (16830463 + 1) は8Kアライメントされていません。 さらに、mappingの最小folio orderは期待される値(8Kブロックサイズかつ4Kページサイズの環境では1)ではなく0です。

つまり、一部のinodeに対して btrfs_set_inode_mapping_order() が呼び出されていないことを意味します。

btrfs_set_inode_mapping_order() の欠落した呼び出しは、以下のイベントを通じてキャッシュされたinodeで発生します:

- inode X に対して btrfs_create_new_inode() が呼び出される VFS inodeの最小folio orderを正しく設定する。

- inode X に対して btrfs_update_inode() が呼び出される delayed_nodeを作成するために root->delayed_nodes xarray に btrfs_delayed_update_inode() を呼び出す。

- キャッシュ/メモリ圧力のドロップにより、メモリエイリアション(eviction)が発生しinode Xが解放される inode Xはエイリアンされたが、将来の再利用のために delayed_node は root->delayed_nodes のまま残る。

- inode X に対して btrfs_iget() が再度呼び出される

btrfs_iget() |- btrfs_iget_locked() | |- iget5_locked_rcu() | btrfs用の新しいvfs_inodeを作成するが、そのmappingの最小orderは依然として0のまま。 | |- btrfs_read_locked_inode() |- btrfs_fill_inode() | |- btrfs_get_delayed_node() | 以前のnodeを見つけ出し、そのdelayed nodeを使用して新しいinodeを初期化する。 | |- filled = true; |- if (filled) goto cache_index; これにより btrfs_update_inode_mapping_flags() と btrfs_set_inode_mapping_order() の呼び出しがスキップされる。 その結果、inodeの最小folio orderは必要な1ではなく0のままとなる。

したがって、その後のページキャッシュ読み込みでは、mappingの最小folio orderが1ではなく0に設定されているため、ブロックサイズより小さいサイズのfolioが取得され、ASSERT()が発動する。

[FIX]
btrfs_update_inode_mapping_flags() と btrfs_set_inode_mapping_order() の呼び出しを cache_index ラベルの下に移動し、キャッシュされたinodeがあるかどうかにかかわらず、mappingフラグと最小folio orderが常に設定されるようにした。

VulDB is the best source for vulnerability data and more expert information about this specific topic.

責任者

Linux

予約する

2026年08月26日

モデレーション

承諾済み

エントリ

VDB-398326

EPSS

0.00198

アクティビティ

非常低い

ソース

Do you want to use VulDB in your project?

Use the official API to access entries easily!