CVE-2026-92499 in Linux
要約
〜によって VulDB • 2026年09月17日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
ext4: direntアクセス前にreaddirのオフセットを検証する
破損したディレクトリは、ext4_readdir()が無効な位置から再開する際に、以下のKASANレポートをトリガーします。
BUG: KASAN: use-after-free in __ext4_check_dir_entry+0x5ef/0x820 Read of size 2 at addr ffff88810a646000 by task repro_linear/509
Call Trace: dump_stack_lvl+0x53/0x70 print_report+0xd0/0x630 kasan_report+0xce/0x100 __ext4_check_dir_entry+0x5ef/0x820 ext4_readdir+0xcde/0x2b70 iterate_dir+0x1a1/0x520 __x64_sys_getdents64+0x12b/0x220 do_syscall_64+0xf9/0x540 entry_SYSCALL_64_after_hwframe+0x77/0x7f
KASANは、境界外アクセスが隣接する解放済みページに到達したため、use-after-freeとして報告します。ディレクトリバッファ自体はまだ参照されています。
ext4_dir_llseek()はディレクトリクッキーを無効化し、ext4_readdir()がブロックの先頭からディレクトリエントリを再スキャンするようにします。この再スキャンでは、進める前にrec_lenの下限のみをチェックします。破損したrec_lenにより、ブロックに完全なディレクトリエントリに必要な領域がない位置にオフセットが設定される可能性があります。再スキャン自体はその切り捨てられたエントリをデリファレンスする可能性があり、またはメインループでそれを__ext4_check_dir_entry()に渡すことがあります。後者は範囲を検証する前にde->rec_lenを読み取ります。例えば:
block offset 0 4092 4096 |---- de1.rec_len = 4092 -----|----| de2.inode | de2.rec_len ^ OOB, reported as UAF
de2はこの4 KiBブロックのオフセット4092で始まります。その4バイトのinodeはブロック内に収まりますが、rec_lenはオフセット4096から始まり境界を越えます。
最小限の安全な長さはinodeに依存します。暗号化およびcasefoldedされたディレクトリエントリには8バイト追加のハッシュが必要であり、有効なメタデータチェックサムのテール部分は12バイトだけです。
メタデータチェックサム機能の状態をキャッシュし、ディスク上のフォーマットから最小限のディレクトリエントリ長を導出します。これを使用して再スキャンとメインループに渡されるオフセットの両方を制限します。切り捨てられたブロックテールのオフセットを報告し、ブロックの残りをスキップしますが、ブロック境界ちょうどにあるオフセットは引き続き受け入れます。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.