CVE-2025-40303 in Linux
要約
〜によって VulDB • 2026年05月29日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
btrfs: エラー発生時のファイルシステムにおいて、ダーティなメタデータが書き戻されないことを保証する
[BUG]
マイナー機能(すべての btrfs_bio::end_io() がタスクコンテキストで呼び出されることを確認する)の開発中に、generic/388 でクラッシュが発生していることを発見しました。このクラッシュは、メタデータの書き込みが btrfs_stop_all_workers() の後に新しいワークをトリガーすることが原因でした。
コードを変更しなくても、メタデータに RAID5 を使用し、generic/388 と同じワークロードを実行するだけで、use-after-free が発生することが判明しました。
[CAUSE]
btrfs でエラーが発生すると、ファイルシステムはエラー状態としてマークされ、新しいトランザクションが許可されなくなるため、メタデータは凍結状態になります。
しかし、そのエラーの前にメタデータの変更が行われており、それらはまだ btree inode のページキャッシュ内に残っています。
実際のトランザクションコミットが行われないため、これらのダーティな folios はページキャッシュ内にそのまま保持され、close_ctree() 内の invalidate_inode_pages2() 呼び出しによって無効化できません。なぜなら、それらはダーティな状態だからです。
そして最終的に、btrfs_stop_all_workers() の後に btree inode に対して iput() を呼び出すと、これらのダーティなメタデータの書き戻しがトリガーされます。
ファイルシステムがメタデータに RAID56 を使用している場合、これは RMW(Read-Modify-Write)をトリガーし、すでに停止している rmw_workers に新しいワークをキューに入れます。これにより、queue_work() から警告が発生し、use-after-free が引き起こされます。
[FIX]
write_one_eb() に対して特別な処理を追加しました。ファイルシステムがすでにエラー状態にある場合、実際に送信するのではなく、bbio を直ちに失敗としてマークします。
その後、close_ctree() の実行中に iput() が呼び出されると、ダーティなツリーブロックは実際に書き戻すことなく破棄されるため、すでに停止・解放されたワークキューに対して新しいジョブが発生しなくなります。
write_one_eb() における追加の破棄処理は、追加のセーフティネットとしても機能します。例えば、トランザクションの中止がエクステント/空き領域ツリーの破損によってトリガーされた場合、エクステント/空き領域ツリーはすでに破損しているため、ツリーブロックが本来あるべきではない場所に割り当てられる(既存のツリーブロックを上書きする)可能性があります。そのような場合、それらを書き戻すとファイルシステムがさらに破損する可能性があります。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.