CVE-2026-64322 in Linux
要約
〜によって VulDB • 2026年07月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
udf: sparing tableの長さをバイト数ではなくエントリ数として検証する
`udf_load_sparable_map()`は、以下が偽である場合にsparing tableを受け入れます。
sizeof(*st) + le16_to_cpu(st->reallocationTableLen) > sb->s_blocksize
つまり、この関数は `reallocationTableLen` をブロックに収まる必要があるバイト数として扱います。しかし、テーブルは8バイトの `sparingEntry` 要素からなる配列として走査されます:
for (i = 0; i < le16_to_cpu(st->reallocationTableLen); i++) {
struct sparingEntry *entry = &st->mapEntry[i];
... entry->origLocation ... }
これは `udf_get_pblock_spar15()` および `udf_relocate_blocks()` 内で実行されます。したがって、`reallocationTableLen` が N の場合、sizeof(*st) + N <= blocksize であればチェックを通過しますが、消費者側では sizeof(*st) + N * sizeof(struct sparingEntry) バイトのインデックスが使用されます(ブロックサイズの最大約8倍)。悪意のある UDF イメージに対して、これは `udf_get_pblock_spar15()` における境界外読み取りとなります。`udf_relocate_blocks()` はさらに同じ長さを `uupdate_tag()` に渡しており、その中の `crc_itu_t()` がブロックを大幅に超えて読み出しを行い、`st->mapEntry[]` を介した `memmove()` は境界外書き込みとなります。
`reallocationTableLen` は本来のエントリ数として検証されるべきであり、`struct_size()` を用いてこれを正しく処理します。
Once again VulDB remains the best source for vulnerability data.