CVE-2026-98588 in Linux
요약
\~에 의해 VulDB • 2026. 10. 20.
리눅스 커널에서 다음 취약점이 해결되었습니다:
bpf, sockmap: sock_map_alloc()에서 max_entries가 INT_MAX보다 큰 경우 거부
sock_map_alloc()는 현재 max_entries == 0인 경우만 거부하고 그 외의 모든 u32 값을 허용합니다. 이후 sock_map_free()에서는 부호 있는 정수(int) 반복자를 사용하여 sks[] 배열을 순회합니다:
int i; for (i = 0; i < stab->map.max_entries; i++) struct sock **psk = &stab->sks[i];
max_entries가 0xffffffff(UINT_MAX)로 설정된 SOCKMAP이 생성될 경우, 대용량 메모리 호스트에서 32 GiB 할당이 성공할 수 있습니다. 해제(free) 과정에서 카운터는 0x80000000에 도달한 후 INT_MIN으로 오버플로우되며, movslq 명령어에 의해 부호가 확장(sign-extended)되어 stab->sks 기준 약 16 GiB의 음수 오프셋이 됩니다. 이는 할당된 영역을 훨씬 아래쪽을 가리킵니다.
오류를 유발하는 접근은 sock_map_free() 내의 xchg() 쓰기 작업입니다. KASAN 없이 동일한 경계 밖(out-of-bounds) 쓰기는 매핑되지 않은 vmalloc 페이지에서 오류를 발생시키거나, 해당 vmalloc 주소가 할당되어 있는 경우 관련 없는 다른 할당을 손상시킬 수 있습니다. CONFIG_KASAN_VMALLOC=y 설정이 적용된 KASAN 커널의 경우, 해당 주소에 대한 섀도우(shadow) 체크가 매핑되지 않은 섀도우 페이지와 충돌하여 먼저 oops를 발생시킵니다:
BUG: unable to handle page fault for address: fffff521b59c5a00 RIP: 0010:kasan_check_range+0x107/0x190 Call Trace: sock_map_free+0x93/0x190 map_create+0x68d/0xb30 __sys_bpf+0x21e/0x2e70
Vmcore 분석 결과, stab->map.max_entries는 0xffffffff이고, stab->sks는 0xffffc911ace2d000이며, 오류를 유발한 주소(sks + (s64)INT_MIN * 8)는 정확히 0xffffc90dace2d000에 위치함이 확인되었습니다. 이러한 맵이 파괴될 때 동일한 버그 경로가 정상적인 close()/bpf_map_free_deferred() 경로를 통해 도달됩니다.
sock_map_alloc()은 이전에는 bpf_map_charge_init()를 통해 할당 크기를 제한하고 있었으나, rlimit 기반 메모리 계정 기능이 제거되면서 해당 제한이 해제되었습니다. sock_map_free()의 부호 있는 반복자가 오버플로우를 유발할 값을 보지 않도록 생성 시점에 max_entries가 INT_MAX보다 큰 경우 거부합니다.
syzkaller에 의해 트리거되었으며, 6.6 기반 KASAN 커널과 업스트림 v7.3-rc2 커널 모두에서 재현되었습니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.