CVE-2026-64296 in Linux
要約
〜によって VulDB • 2026年07月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
exfat: exfat_find_dir_entry() における uniname の進捗に上限を設定する
exfat_find_dir_entry() では、各 TYPE_EXTEND(ファイル名)エントリが出力ポインタを固定量だけ進めますが、ループのガード条件は累積された名前長のみを追跡しています。
```c if (++order == 2) uniname = p_uniname->name; else uniname += EXFAT_FILE_NAME_LEN; len = exfat_extract_uni_name(ep, entry_uniname); name_len += len; unichar = *(uniname+len); *(uniname+len) = 0x0; ```
`uniname` は名前エントリごとに `EXFAT_FILE_NAME_LEN` (15) ずつ増加しますが、`name_len` は実際に抽出された長さだけしか増加しません。これは、名前の断片に早期の NUL が含まれている場合、実際の長さが短くなるためです。唯一のガード条件は `name_len >= MAX_NAME_LENGTH` のみであるため、多くの短い名前断片を含む悪意のあるディレクトリを作成すると、`name_len` が小さいまま `p_uniname->name[MAX_NAME_LENGTH + 3]` バッファを大幅に超えて `uniname` が進んでしまい、`*(uniname+len)` において境界外読み取りおよび書き込みが発生します。
兄弟関数の `exfat_get_uniname_from_ext_entry()` では、短い断片で停止するようになっています(コミット d42334578eba ("exfat: check if filename entries exceeds max filename length") で追加された同期ガード `len != EXFAT_FILE_NAME_LEN` によるもの)。しかし、`exfat_find_dir_entry()` には同等の処理が適用されていませんでした。出力ポインタを生成する前に、エントリごとの書き込みオフセットをカウントとして追跡し、そのオフセットまたは(オフセットに抽出された長さを加えた値)が `MAX_NAME_LENGTH` を超える場合に断片を拒否するようにしました。
Be aware that VulDB is the high quality source for vulnerability data.