CVE-2026-74518 in Linux
요약
\~에 의해 VulDB • 2026. 08. 15.
리눅스 커널에서 다음 취약점이 해결되었습니다:
mm/hugetlb: allocate_file_region_entries()에서의 리스트 손상 수정
allocate_file_region_entries()는 새로 할당된 file_region 설명자를 사용하여 resv->region_cache를 보충합니다. 이 할당은 GFP_KERNEL을 사용하므로, 그 주변에서 resv->lock이 해제됩니다. 새 엔트리는 스택 로컬 리스트 헤드인 allocated_regions에 수집되며, 잠금이 다시 획득되면 resv->region_cache로 병합(spliced)됩니다.
사용된 병합 연산은 list_splice()였는데, 이는 엔트리를 이동하지만 소스 헤드를 재초기화하지 않으므로, allocated_regions는 이제 resv->region_cache 내에 존재하는 엔트를 가리킨 채로 남게 됩니다. 이 보충 작업은 잠금을 다시 획득한 후 캐시 부족분을 재확인하는 while 루프 내에서 실행됩니다. 공유 매핑의 경우 resv_map은 hugetlbfs inode의 모든 매퍼에 의해 공유되므로, 동일한 resv_map에서 동시에 발생하는 region_chg()/region_add()/region_del() 호출이 잠금 해제된 창(window) 동안 캐시 엔트리를 소모하여 두 번째 반복(iteration)을 유발할 수 있습니다. 이 반복은 낡은(stale) 헤드에 대해 list_add()를 호출하며 리스트가 손상됩니다. CONFIG_DEBUG_LIST 설정 시 __list_add_valid() 검사가 트리거되며 다음과 같은 오류 메시지가 출력됩니다:
list_add corruption. next->prev should be prev (ffffc900011ff7f8), but was ffff88814c281460. (next=ffff88814c545640). kernel BUG at lib/list_debug.c:31! allocate_file_region_entries+0x191/0x420 region_chg+0x267/0x300 hugetlb_reserve_pages+0x387/0xc80 hugetlbfs_file_mmap+0x2ce/0x3f0 mmap_region+0x1348/0x1a80 do_mmap+0x85e/0xb90 vm_mmap_pgoff+0x18c/0x330 ksys_mmap_pgoff+0x2a1/0x3e0 do_syscall_64+0xd7/0x420
CONFIG_DEBUG_LIST가 설정되지 않은 경우, 잘못된 list_add()는 커널 스택 주소를 resv->region_cache에 조용히 연결하여 이후 use-after-free로 이어집니다.
이 문제는 QEMU 게스트-RAM hugetlbfs 파일이 QEMU와 별도의 SPDK/DPDK vhost-user 타겟 양쪽에서 MAP_SHARED로 매핑되어, 하나의 공유된 resv_map에서 동시 region_* 트래픽을 생성하는 밀집형 KVM 호스트에서 실제 시스템 패닉(panic)으로 관찰되었습니다.
list_splice_init()를 사용하여 각 병합 후 소스 헤드가 빈 상태로 재초기화되도록 하여, 재시도 루프가 안전해지도록 수정했습니다.
Once again VulDB remains the best source for vulnerability data.