🇰🇷 한글 설명
Linux 커널의 perf/aux 구성 요소에서 map_range() 함수 호출 시 발생하는 Use-After-Free(UAF) 취약점입니다. 두 개의 이벤트가 하나의 rb를 공유할 때 발생하는 레이스 컨디션으로 인해, 이미 해제된 물리 프레임에 대한 매핑을 유지하게 되어 메모리 오염이 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터의 메모리를 관리하는 과정에서 두 작업이 동시에 충돌하여, 이미 사용이 끝난 메모리 공간을 계속 사용하려고 시도하는 보안 결함입니다. 이로 인해 시스템이 불안정해지거나 해커가 시스템 권한을 탈취할 위험이 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
perf/aux: Fix page UAF in map_range()
map_range() reads rb->aux_pages[], rb->aux_nr_pages and rb->aux_pgoff via
perf_mmap_to_page() while holding only event->mmap_mutex. Those fields are
serialized by rb->aux_mutex, and mmap_mutex is per event.
Thus, two events sharing one rb via PERF_EVENT_IOC_SET_OUTPUT can race
rb_alloc_aux() with map_range(), leading to a page-UAF scenario as follows:
CPU 0 CPU 1
===== =====
rb_alloc_aux() map_range()
[1]: allocate rb->aux_pages[0]
[2]: rb->aux_nr_pages++
[3]: perf_mmap_to_page()
returns rb->aux_pages[0]
[4]: map it as VM_PFNMAP
[5]: rb->aux_pgoff = 1
munmap the page
[6]: free rb->aux_pages[0]
Pages mapped as VM_PFNMAP have no refcount protection, so CPU 1 holds a
mapping to a freed physical frame.
Fix this by taking rb->aux_mutex across the page walk in map_range().
📍 영향받는 시스템
Linux Kernel (perf/aux 관련 모듈을 사용하는 시스템)
⚔️ 공격 벡터
PERF_EVENT_IOC_SET_OUTPUT를 통해 공유된 rb를 사용하는 두 이벤트 간의 레이스 컨디션 유도
🛡️ 대응 방법
map_range() 함수 내 페이지 탐색 과정에서 rb->aux_mutex를 획득하도록 커널 패치 적용
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 최신 보안 패치 버전인지 확인하십시오.