CVE-2026-64322 in Linux
요약
\~에 의해 VulDB • 2026. 07. 25.
리눅스 커널에서 다음 취약점이 해결되었습니다:
udf: sparing 테이블 길이를 바이트 수가 아닌 엔트리 개수로 검증함
udf_load_sparable_map() 함수는 다음과 같은 조건이 거짓일 때 sparing 테이블을 허용합니다.
sizeof(*st) + le16_to_cpu(st->reallocationTableLen) > sb->s_blocksize
즉, reallocationTableLen을 블록에 맞춰야 하는 바이트 수로 취급합니다. 그러나 해당 테이블은 8바이트 sizingEntry 요소의 배열로서 다음과 같이 순회됩니다:
for (i = 0; i < le16_to_cpu(st->realallocationTableLen); 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()에서 경계 밖 읽기(out-of-bounds read)로 이어집니다. 또한 udf_relocate_blocks()는 동일한 길이를 udf_update_tag()에 전달하며, 여기서 crc_itu_t()가 블록을 훨씬 넘어 읽어들이고, st->mapEntry[]를 통한 memmove() 호출은 경계 밖 쓰기(out-of-bounds write)입니다.
struct_size()를 사용하여 reallocationTableLen이 엔트리 개수임을 검증합니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.