🇰🇷 한글 설명
Linux 커널의 UP(Uniprocessor) 환경에서 NMI(Non-Maskable Interrupt) 컨텍스트를 통해 alloc_frozen_pages_nolock()이 호출될 때 발생하는 취약점입니다. spin_trylock()이 UP 커널에서 항상 성공하는 특성 때문에 zone lock을 중복 획득하게 되어 프리리스트(freelist)가 손상될 수 있습니다.
💡 쉬운 설명
컴퓨터의 핵심 운영체제인 리눅스에서 특정 상황에 메모리를 관리하는 규칙이 어긋나 데이터가 깨질 수 있는 문제입니다. 이로 인해 시스템이 예상치 못하게 멈추거나 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
mm/page_alloc: return NULL early from alloc_frozen_pages_nolock() in NMI on UP
On UP kernels (!CONFIG_SMP), spin_trylock() is a no-op that
unconditionally succeeds even when the lock is already held. As a
result, alloc_frozen_pages_nolock() called from NMI context can
re-enter rmqueue() and acquire the zone lock that the interrupted
context is already holding, corrupting the freelists.
With CONFIG_DEBUG_SPINLOCK on UP, the following BUG is triggered with
the slub_kunit test module:
BUG: spinlock trylock failure on UP on CPU#0, kunit_try_catch/243
[...]
Call Trace:
<NMI>
dump_stack_lvl+0x3f/0x60
do_raw_spin_trylock+0x41/0x50
_raw_spin_trylock+0x24/0x50
rmqueue.isra.0+0x2a9/0xa70
get_page_from_freelist+0xeb/0x450
alloc_frozen_pages_nolock_noprof+0x111/0x1e0
allocate_slab+0x42a/0x500
___slab_alloc+0xa7/0x4c0
kmalloc_nolock_noprof+0x164/0x310
[...]
</NMI>
Fix this by returning NULL early when invoked from NMI on a UP kernel.
📍 영향받는 시스템
CONFIG_SMP가 설정되지 않은(UP) Linux Kernel
⚔️ 공격 벡터
NMI 컨텍스트를 유발하는 특정 하드웨어 인터럽트 또는 커널 동작을 통한 메모리 관리 로직 재진입
🛡️ 대응 방법
NMI 컨텍스트에서 호출될 경우 NULL을 조기에 반환하도록 수정된 최신 리눅스 커널로 업데이트
🔧 검증 코드
출력 결과에서 CONFIG_SMP가 설정되어 있지 않고(또는 !CONFIG_SMP), 커널 버전이 취약점이 수정되기 전 버전인지 확인합니다.
uname -a && grep -E 'CONFIG_SMP|CONFIG_DEBUG_SPINLOCK' /boot/config-$(uname -r)