🇰🇷 한글 설명
Linux 커널의 vhost/vdpa 구성 요소에서 장치가 지원하는 최대 큐 크기보다 큰 VRING_NUM을 허용하는 취약점이 발견되었습니다. 이로 인해 공격자가 장치에 설정된 범위를 벗어난 메모리에 접근하여 16바이트 크기의 Out-of-bounds Read를 유발할 수 있습니다.
💡 쉬운 설명
장치가 처리할 수 있는 데이터 양보다 더 많은 양을 처리하라고 명령을 내릴 수 있는 오류입니다. 이로 인해 시스템이 허용되지 않은 메모리 영역을 읽으려 시도하여 오류가 발생하거나 보안 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
vhost/vdpa: reject VRING_NUM larger than device max
vhost_vring_set_num() accepts any non-zero power-of-two queue size that
fits in 16 bits. vhost-vdpa then passes that value to set_vq_num()
without comparing it with get_vq_num_max().
A process with access to /dev/vhost-vdpa-* can therefore configure a
queue larger than the device advertises. With vdpa_sim, the worker can
walk descriptors beyond the mapped descriptor ring. KASAN reports a
16-byte out-of-bounds read, corresponding to one vring_desc, in the
vringh IOTLB path:
BUG: KASAN: out-of-bounds in _copy_from_iter
Read of size 16
copy_from_iotlb
copydesc_iotlb
vringh_getdesc_iotlb
vdpasim_net_work
Cache get_vq_num_max() immediately after reset. Some backends derive
it from writable queue-size state, so querying it after SET_NUM may
return the current size instead of the device capability. Invalidate
the cached value before reset so a failed reset leaves SET_NUM
disabled.
For VHOST_SET_VRING_NUM, copy the complete vring state once and use
the same index and size for validation, vq->num, and set_vq_num().
This ensures that validation and use operate on the same copied values.
📍 영향받는 시스템
vhost/vdpa를 사용하는 Linux 커널 버전
⚔️ 공격 벡터
/dev/vhost-vdpa-* 장치에 접근 권한이 있는 프로세스를 통한 비정상적인 VRING_NUM 설정
🛡️ 대응 방법
vhost/vdpa의 큐 크기 검증 로직이 포함된 최신 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 취약점이 패치된 최신 보안 업데이트 버전인지 확인합니다.