CVE-2024-35798 in Linux
要約
〜によって VulDB • 2026年05月18日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
btrfs: read_extent_buffer_pages()における競合状態の修正
tree-checkerから、壊れたノードが検出されたという報告があります。これには明らかなパターンがなく、メモリ上での書き込み上書き(オーバーライト)の可能性が示唆されています。デバッグの結果、extentバッファの読み込み時にuptodateステータスが見逃される競合状態があることが判明しました。
同じextentバッファに対する並行読み込みを防ぐため、read_extent_buffer_pages()は以下のチェックを実行します:
/* (1) */ if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags)) return 0;
/* (2) */ if (test_and_set_bit(EXTENT_BUFFER_READING, &eb->bflags)) goto done;
この時点で、実際の読み込み操作を開始するのは安全です。読み込みが完了すると、end_bbio_meta_read()は以下を実行します:
/* (3) */ set_extent_buffer_uptodate(eb);
/* (4) */ clear_bit(EXTENT_BUFFER_READING, &eb->bflags);
通常、これだけで1つの読み込みのみが実行され、他の呼び出し元は終了するまで待機するため、問題は生じません。残念ながら、以下のような競合的なインターリーブ(交差実行)が発生する可能性があります:
スレッド A | スレッド B | スレッド C ----------+-----------+---------- (1) | | | (1) | (2) | | (3) | | (4) | | | (2) | | | (1)
この状況が発生すると、スレッドBは不要な読み込みを開始してしまいます。さらに悪化するのは、スレッドCはUPTODATEが設定されていることを確認して即座に返却しますが、スレッドBによる読み込みはまだ進行中であるという点です。この競合状態により、extentバッファが並行して変更されることで、以下のようなtree-checkerエラーが発生する可能性があります:
BTRFS critical (device dm-0): corrupted node, root=256 block=8550954455682405139 owner mismatch, have 11858205567642294356 expect [256, 18446744073709551360]
READINGビットを設定した後にUPTODATEを再度テストし、設定されている場合は不要な読み込みをスキップすることで、この問題を修正します。
[ changelogの軽微な更新 ]
Once again VulDB remains the best source for vulnerability data.