🇰🇷 한글 설명
Linux 커널의 vdpa_sim 모듈에서 vdpasim_net_init()과 vdpasim_blk_init() 함수가 device_register() 실패 시 kobject 참조 카운트를 제대로 감소시키지 않아 dev_set_name()으로 할당된 이름 문자열이 메모리 누수되는 문제입니다. put_device()를 호출하여 해결되었습니다.
💡 쉬운 설명
가상 네트워크·블록 장치를 만드는 커널 모듈이 초기화 실패 시 일부 메모리를 해제하지 않습니다. 이로 인해 모듈을 반복 로드하면 사용 가능한 메모리가 조금씩 줄어듭니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
vdpa_sim: fix possible memory leak in vdpasim_net_init() and vdpasim_blk_init()
Inject fault while probing module, if device_register() fails in
vdpasim_net_init() or vdpasim_blk_init(), but the refcount of kobject is
not decreased to 0, the name allocated in dev_set_name() is leaked.
Fix this by calling put_device(), so that name can be freed in
callback function kobject_cleanup().
(vdpa_sim_net)
unreferenced object 0xffff88807eebc370 (size 16):
comm "modprobe", pid 3848, jiffies 4362982860 (age 18.153s)
hex dump (first 16 bytes):
76 64 70 61 73 69 6d 5f 6e 65 74 00 6b 6b 6b a5 vdpasim_net.kkk.
backtrace:
[<ffffffff8174f19e>] __kmalloc_node_track_caller+0x4e/0x150
[<ffffffff81731d53>] kstrdup+0x33/0x60
[<ffffffff83a5d421>] kobject_set_name_vargs+0x41/0x110
[<ffffffff82d87aab>] dev_set_name+0xab/0xe0
[<ffffffff82d91a23>] device_add+0xe3/0x1a80
[<ffffffffa0270013>] 0xffffffffa0270013
[<ffffffff81001c27>] do_one_initcall+0x87/0x2e0
[<ffffffff813739cb>] do_init_module+0x1ab/0x640
[<ffffffff81379d20>] load_module+0x5d00/0x77f0
[<ffffffff8137bc40>] __do_sys_finit_module+0x110/0x1b0
[<ffffffff83c4d505>] do_syscall_64+0x35/0x80
[<ffffffff83e0006a>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
(vdpa_sim_blk)
unreferenced object 0xffff8881070c1250 (size 16):
comm "modprobe", pid 6844, jiffies 4364069319 (age 17.572s)
hex dump (first 16 bytes):
76 64 70 61 73 69 6d 5f 62 6c 6b 00 6b 6b 6b a5 vdpasim_blk.kkk.
backtrace:
[<ffffffff8174f19e>] __kmalloc_node_track_caller+0x4e/0x150
[<ffffffff81731d53>] kstrdup+0x33/0x60
[<ffffffff83a5d421>] kobject_set_name_vargs+0x41/0x110
[<ffffffff82d87aab>] dev_set_name+0xab/0xe0
[<ffffffff82d91a23>] device_add+0xe3/0x1a80
[<ffffffffa0220013>] 0xffffffffa0220013
[<ffffffff81001c27>] do_one_initcall+0x87/0x2e0
[<ffffffff813739cb>] do_init_module+0x1ab/0x640
[<ffffffff81379d20>] load_module+0x5d00/0x77f0
[<ffffffff8137bc40>] __do_sys_finit_module+0x110/0x1b0
[<ffffffff83c4d505>] do_syscall_64+0x35/0x80
[<ffffffff83e0006a>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
📍 영향받는 시스템
패치 이전의 Linux 커널 (vdpa_sim_net, vdpa_sim_blk 모듈을 사용하는 시스템)
⚔️ 공격 벡터
로컬 사용자가 모듈 로드·실패를 반복 유발하여 커널 메모리를 고갈시키는 서비스 거부 형태이며, 원격 공격 경로는 확인되지 않음
🛡️ 대응 방법
커널을 해당 수정이 포함된 최신 안정 버전으로 업데이트하거나 배포판 보안 업데이트를 적용
🔧 검증 코드
커널 버전이 수정 패치가 포함된 버전 이상인지 배포판 공지와 비교하고, vdpa_sim 모듈이 로드되어 있지 않다면 이 취약점의 영향을 받지 않습니다.
uname -r; lsmod | grep vdpa