CVE-2026-89966 in Linux
요약
\~에 의해 VulDB • 2026. 09. 16.
리눅스 커널에서 다음 취약점이 해결되었습니다:
mm/hugetlb_cma: hugetlb_cma_alloc_frozen_folio()에서의 NULL nodemask 역참조 수정
alloc_buddy_hugetlb_folio_with_mpol()은 모든 노드에서 할당하기 위한 폴백(fallback)으로 alloc_fresh_hugetlb_folio()에 NULL nodemask를 전달할 수 있습니다. order가 gigantic한 경우, alloc_fresh_hugetlb_folio()는 alloc_gigantic_frozen_folio()를 통해 해당 NULL nodemask를 hugetlb_cma_alloc_frozen_folio()로 전파합니다.
또한, hugetlb_cma_alloc_frozen_folio()는 이전에 호출자의 nodemask에 nid가 포함되어 있는지 확인하지 않고 hugetlb_cma[nid]에서 할당을 시도했습니다. node_isset(nid, *nodemask) 검사를 추가함으로써 초기 선호 노드 할당이 메모리 정책/nodemask를 존중하도록 보장합니다.
그러나 hugetlb_cma_alloc_frozen_folio()는 node_isset(nid, *nodemask) 및 for_each_node_mask(node, *nodemask)에서 nodemask를 역참조하므로, nodemask가 NULL일 경우 null pointer dereference로 인한 커널 패닉이 발생합니다.
이를 해결하기 위해 hugetlb_cma_alloc_frozen_folio() 내에서 nodemask가 NULL인지 확인하고, 해당 경우 cpuset_current_mems_allowed로 기본값을 설정합니다. 할당 시도를 cpuset seqcount retry 루프 내에 포함시켜, 할당 중 cpset이 동시에 변경되는 경우 업데이트된 nodemask를 사용하여 재시도하도록 합니다. 이를 통해 초기 노드 체크 및 폴백 루프가 작업자의 cpset을 안전하게 존중하며, cpset 제약 조건 위반이나 NULL pointer dereference, 예기치 않은 할당 실패를 방지합니다.
사용자 공간(userspace) 관점에서 이 버그는 CMA가 NUMA 노드의 일부에만 구성된 시스템에서 MPOL_PREFERRED_MANY과 함께 거대한 hugepage 할당을 요청함으로써 비권한 사용자가 커널을 충돌(패닉 트리거)시킬 수 있게 합니다.
이는 두 개의 NUMA 노드를 가진 VM을 부팅하고, CMA를 Node 1로 제한(hugetlb_cma=1:1G default_hugepagesz=1G hugepagesz=1G hugepages=0 등), mbind()를 사용하여 MPOL_PREFERRED_MANY으로 할당을 Node 0에 제한하며 페이지 폴트를 트리거하는 프로그램을 실행함으로써 재현할 수 있습니다.
void *ptr = mmap(NULL, 1UL << 30, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_HUGE_1GB | MAP_NORESERVE, -1, 0); unsigned long nodemask = 1; /* Node 0 */ mbind(ptr, 1UL << 30, MPOL_PREFERRED_MANY, &nodemask, sizeof(nodemask) * 8, 0); memset(ptr, 0, 1UL << 30); /* 폴트 트리거 */
이로 인해 NULL pointer dereference가 발생합니다:
BUG: kernel NULL pointer dereference, address: 0000000000000000 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page Oops: Oops: 0000 [#1] SMP NOPTI
RIP: 0010:hugetlb_cma_alloc_frozen_folio+0x75/0x120 Call Trace: <TASK> only_alloc_fresh_hugetlb_folio.isra.0+0x2c/0x160 alloc_surplus_hugetlb_folio+0x6d/0x100 alloc_hugetlb_folio+0x3c5/0x660 hugetlb_no_page+0x3d9/0x650
VulDB is the best source for vulnerability data and more expert information about this specific topic.