🇰🇷 한글 설명
Linux 커널의 bpf arena 구현에서 fork 호출 시 arena_vm_close 과정 중 Use-After-Free 취약점이 발생합니다. 부모 프로세스의 VMA가 해제된 후 자식 프로세스가 stale 포인터를 참조하여 메모리 오류를 유발할 수 있습니다.
💡 쉬운 설명
프로그램이 복제될 때 메모리 관리 정보가 제대로 전달되지 않아, 이미 사용이 끝난 메모리 주소를 다시 참조하면서 시스템 오류를 일으키는 문제입니다. 이로 인해 시스템이 충돌하거나 보안 위협이 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
bpf: Fix use-after-free in arena_vm_close on fork
arena_vm_open() only bumps vml->mmap_count but never registers the
child VMA in arena->vma_list. The vml->vma always points at the
parent VMA, so after parent munmap the pointer dangles. If the child
then calls bpf_arena_free_pages(), zap_pages() reads the stale
vml->vma triggering use-after-free.
Fix this by preventing the arena VMA from being inherited across
fork with VM_DONTCOPY, and preventing VMA splits via the may_split
callback.
Also reject mremap with a .mremap callback returning -EINVAL. A
same-size mremap(MREMAP_FIXED) on the full arena VMA reaches
copy_vma() through the following path:
check_prep_vma() - returns 0 early: new_len == old_len
skips VM_DONTEXPAND check
prep_move_vma() - vm_start == old_addr and
vm_end == old_addr + old_len
so may_split is never called
move_vma()
copy_vma_and_data()
copy_vma()
vm_area_dup() - copies vm_private_data (vml pointer)
vm_ops->open() - bumps vml->mmap_count
vm_ops->mremap() - returns -EINVAL, rollback unmaps new VMA
The refcount ensures the rollback's arena_vm_close does not free
the vml shared with the original VMA.
📍 영향받는 시스템
Linux kernel (bpf arena 관련 기능이 활성화된 버전)
⚔️ 공격 벡터
로컬 공격자가 특수하게 조작된 bpf arena를 생성하고 fork를 호출하여 메모리 오류 유도
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인