🇰🇷 한글 설명
Linux 커널의 pktgen 모듈에서 proc entry 사용 후 해제(Use-After-Free) 취약점이 발견되었습니다. pktgen_change_name 함수와 pktgen_remove_device 함수 간의 잠금(lock) 순서 불일치로 인해 레이스 컨디션이 발생하여 메모리 오류를 유발할 수 있습니다.
💡 쉬운 설명
컴퓨터의 네트워크 테스트 도구가 이름을 바꾸는 작업과 삭제하는 작업을 동시에 할 때, 이미 삭제된 메모리 주소를 다시 참조하여 시스템이 충돌하거나 오류가 발생하는 문제입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: pktgen: fix proc entry use-after-free
pktgen_change_name() replaces pkt_dev->entry while holding t->if_lock.
pktgen_remove_device() removes the same entry before
_rem_dev_from_if_list() takes that lock.
This allows the following interleaving:
CPU 0 (NETDEV_CHANGENAME) CPU 1 (kpktgend)
if_lock(t)
proc_remove(pkt_dev->entry)
proc_remove(pkt_dev->entry)
pkt_dev->entry = proc_create_data(...)
if_unlock(t)
The kthread can pass the stale proc_dir_entry to proc_remove() after the
rename path has freed it. A reproducer with a widened race window reports:
BUG: KASAN: slab-use-after-free in proc_remove+0x78/0x80
Read of size 8 at addr ffff8881478fea70 by task kpktgend_0/67
Call Trace:
proc_remove+0x78/0x80
pktgen_remove_device.isra.0+0x11c/0x4c0
pktgen_thread_worker+0x1214/0x6bc0
kthread+0x2c6/0x3b0
Allocated by task 95:
__proc_create+0x204/0x790
proc_create_data+0x72/0xe0
pktgen_thread_write+0xd61/0x1510
Freed by task 28:
kmem_cache_free+0xcb/0x3d0
proc_free_inode+0x5b/0x80
rcu_core+0x50a/0x1850
The buggy address belongs to the object at ffff8881478fea00
which belongs to the cache proc_dir_entry of size 192
Move proc_remove() into the if_lock-protected list removal helper. Keep it
before list_del_rcu() to preserve the ordering required by add_device().
The rename path must then finish replacing the entry before removal, or
it observes that the device is no longer on the list.
📍 영향받는 시스템
Linux Kernel (pktgen 모듈을 사용하는 버전)
⚔️ 공격 벡터
로컬 권한을 가진 공격자가 특정 네트워크 장치 이름을 변경하고 삭제하는 과정을 동시에 수행하여 레이스 컨디션을 유발
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 proc_remove() 호출 순서를 수정해야 함
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 버전인지 확인