🇰🇷 한글 설명
리눅스 커널의 NBD(Network Block Device) 모듈에서 nbd_genl_connect 함수 호출 시 설정 잠금 해제 시점이 지연되어 발생하는 Use-After-Free 취약점입니다. NBD_CMD_CONNECT와 NBD_CLEAR_SOCK 명령을 특정 순서로 실행할 경우 참조 횟수(refcount)가 0인 상태에서 증가를 시도하여 시스템 오류를 유발할 수 있습니다.
💡 쉬운 설명
네트워크를 통해 저장 장치를 연결하는 기능에서 메모리 관리 규칙이 어긋나 발생하는 오류입니다. 특정 명령을 빠르게 연속해서 보내면 컴퓨터가 이미 사용이 끝난 메모리 영역을 다시 건드리려다 시스템이 멈추거나 오류가 날 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
nbd: defer config unlock in nbd_genl_connect
There is one use-after-free warning when running NBD_CMD_CONNECT and
NBD_CLEAR_SOCK:
nbd_genl_connect
nbd_alloc_and_init_config // config_refs=1
nbd_start_device // config_refs=2
set NBD_RT_HAS_CONFIG_REF open nbd // config_refs=3
recv_work done // config_refs=2
NBD_CLEAR_SOCK // config_refs=1
close nbd // config_refs=0
refcount_inc -> uaf
------------[ cut here ]------------
refcount_t: addition on 0; use-after-free.
WARNING: CPU: 24 PID: 1014 at lib/refcount.c:25 refcount_warn_saturate+0x12e/0x290
nbd_genl_connect+0x16d0/0x1ab0
genl_family_rcv_msg_doit+0x1f3/0x310
genl_rcv_msg+0x44a/0x790
The issue can be easily reproduced by adding a small delay before
refcount_inc(&nbd->config_refs) in nbd_genl_connect():
mutex_unlock(&nbd->config_lock);
if (!ret) {
set_bit(NBD_RT_HAS_CONFIG_REF, &config->runtime_flags);
+ printk("before sleep\n");
+ mdelay(5 * 1000);
+ printk("after sleep\n");
refcount_inc(&nbd->config_refs);
nbd_connect_reply(info, nbd->index);
}
📍 영향받는 시스템
NBD 모듈을 사용하는 리눅스 커널 버전 (패치 적용 전 버전)
⚔️ 공격 벡터
로컬 또는 네트워크를 통해 특수하게 조작된 NBD 명령(NBD_CMD_CONNECT 및 NBD_CLEAR_SOCK)을 전송
🛡️ 대응 방법
리눅스 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 nbd_genl_connect의 잠금 해제 로직 수정
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 최신 패치 버전인지 확인