🇰🇷 한글 설명
Linux 커널의 vduse 구성 요소에서 virtqueue 정렬 값을 검증할 때 상한선만 확인하여 발생하는 취약점입니다. 정렬 값이 0인 경우 잘못된 메모리 주소가 할당되어 NULL 포인터 역참조(Null-pointer dereference)를 유발하고 시스템 충돌을 일으킬 수 있습니다.
💡 쉬운 설명
가상 장치를 설정할 때 정렬 규칙을 어기는 잘못된 값을 입력하면 컴퓨터 시스템이 갑자기 멈추거나 오류가 발생할 수 있는 문제입니다. 정렬 값이 0이 될 경우 시스템이 엉뚱한 메모리 위치를 참조하게 되어 문제가 생깁니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
vduse: validate virtqueue alignment
vduse_validate_config() only checks the upper bound of vq_align. Invalid
values can therefore reach vring_create_virtqueue_map(). The split-ring
helpers use align - 1 as a bit mask, so the alignment must be a non-zero
power of two. A zero value makes vring_size() drop the descriptor and
available-ring part and vring_init() leave the used ring pointer NULL.
The VIRTIO spec requires the used ring to start at an address
aligned to at least 4 bytes. Reject values below VRING_USED_ALIGN_SIZE as
well as non-power-of-two values before they reach the virtio ring helpers.
Opening a virtio-net device created with vq_align=0 triggered:
BUG: KASAN: null-ptr-deref in virtqueue_kick_prepare_split+0xe3/0x100
Read of size 2 at addr 0000000000000000 by task systemd-network/1062
Call Trace (relevant frames):
dump_stack_lvl
print_report
kasan_report
__asan_load2
virtqueue_kick_prepare_split+0xe3/0x100
virtqueue_kick_prepare+0x40/0x60
try_fill_recv+0x857/0x1250
virtnet_open+0x189/0x460
__dev_open+0x225/0x390
__dev_change_flags+0x368/0x3b0
netif_change_flags+0x56/0xc0
do_setlink.isra.0+0x68c/0x1e30
Validate the value before it reaches the virtio ring helpers.
📍 영향받는 시스템
vduse 모듈을 사용하는 Linux 커널 버전
⚔️ 공격 벡터
vduse 장치를 생성할 때 vq_align 값을 0으로 설정하여 커널의 NULL 포인터 역참조 유도
🛡️ 대응 방법
vduse_validate_config() 함수를 통해 vq_align 값이 2의 거듭제곱이며 최소 정렬 크기 이상인지 검증하도록 커널 패치 적용
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 최신 보안 패치 버전인지 확인합니다.