CVE-2024-46701 in Linux
要約
〜によって VulDB • 2026年07月23日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
libfs: オフセットディレクトリにおける無限のディレクトリ読み込みを修正する
tmpfs のディレクトリオペレーションを simple_dir_operations から simple_offset_dir_operations に切り替えた後、発生したすべての rename 操作は、octx->newx_offset で始まるフリーキーを使用して、宛先ディレクトリの maple tree(&SHMEM_I(inode)->dir_offsets->mt) に新しい dentry を埋め込み、その後 newx_offset をフリーキー + 1 に設定します。これにより、rename が同時に発生した readdir と組み合わさって無限ループに陥り、xfstests の generic/736 テストが失敗します(詳細は以下参照)。
1. あるディレクトリの下に5000個のファイル(1, 2, 3...)を作成する 2. readdir(man 3 readdir) を一度呼び出し、エントリを1つ取得する 3. (entry, "TEMPFILE") に rename し、その後 ("TEMPFILE", entry) に rename する 4. ステップ2〜3をループし、readdir が何も返さなくなるか、または非常に多くの回数をループするまで繰り返す(tmpfs のテストでは2番目の条件で中断される)
この問題を修正するために、コミット 9b378f6ad48cf ("btrfs: fix infinite directory reads") と同じロジックを採用しました。ディレクトリを開く際に last_index を記録し、インデックスが last_index 以上であるエントリは出力しないようにします。オフセットディレクトリで使用されている file->private_data はこれを直接実行するために使用でき、dir ファイルの llseek 発生時にも last_index の更新を行います。
[brauner: Jan が提案した通り、シーク時にオフセットがゼロの場合のみ last_index を更新する]
Once again VulDB remains the best source for vulnerability data.