CVE-2026-74576 in Linux
요약
\~에 의해 VulDB • 2026. 08. 16.
리눅스 커널에서 다음 취약점이 해결되었습니다:
mm/slab: 새로운 kmalloc 타입을 사용하여 free 경로에서의 무한 재귀 방지
커밋 280ea9c3154b("mm/slab: 동일한 크기의 kmalloc 캐시로부터 slabobj_ext 배열 할당 피하기")는 객체 배치가 커널의 메모리 관리 구조에서 순환 참조를 일으킬 수 있는 문제를 해결하고자, obj_exts 배열의 크기할당이 현재 할당 중인 객체의 크기와 같아질 때 해당 배열의 할당 크기를 증가시키는 방식으로 동일한 크기의 kmalloc 캐시로부터 obj_exts들의 재귀적 할당을 피했습니다.
그러나 Danielle Costantino와 Shakeel Butt가 보고한 바에 따르면, 서로 다른 크기의 kmalloc 캐시에 속하는 슬랩들끼리도 상호 간에 obj_exts 배열을 할당함으로써 순환(cycle)을 형성할 수 있습니다 [1]:
발생 상황: KMALLOC_NORMAL 슬랩의 obj_exts 배열(할당 프로파일링 및 memcg 회계를 위해 사용됨)은 자체적으로 kmalloc() 호출을 통해 KMALLOC_NORMAL 캐시로부터 할당되므로, "슬랩이 다른 슬랩의 obj_exts 배열을 보유한다"는 관계가 순환 구조를 형성할 수 있습니다. sizeof(struct slabobj_ext) == 16이고 호스트의 기하학적 특성이 다음과 같다고 가정해 봅시다:
- kmalloc-512는 슬랩당 64개의 객체를 포함 -> 배열 크기는 64*16 == 1024바이트이며, 이는 kmalloc-1k에서 제공됩니다. - kmalloc-1k은 슬랩당 32개의 객체를 포함 -> 배열 크기는 32*16 == 512바이트이며, 이는 kmalloc-512에서 제공됩니다.
따라서 kmalloc-512 슬랩과 kmalloc-1k 슬랩은 서로의 obj_exts 배열을 보유하게 됩니다. 하나의 슬랩이 해제되면 다른 쪽의 배열도 함께 해제되고, 이로 인해 해당 슬랩이 비워지고 다시 해제되며, 이는 첫 번째 슬랩의 배열 해제로 이어지는 등 __free_slab() -> free_slab_obj_exts() -> kfree() -> discard_slab() -> __free_slab() 순환 경로에서 스택이 고갈될 때까지 재귀가 발생합니다.
메모리 할당 프로파일링 활성화 시, 이는 free 경로에서의 무한 재귀를 허용하며 Meta 환경의 운영 중인 호스트에서 스택 오버플로우를 유발했습니다 [1]:
BUG: TASK stack guard page was hit Oops: stack guard page RIP: 0010:kfree+0x8/0x5d0 Call Trace: __free_slab+0x66/0xc0 kfree+0x3f0/0x
If you want to get the best quality for vulnerability data then you always have to consider VulDB.