🇰🇷 한글 설명
Linux 커널의 KVM 구성 요소에서 vCPU가 온라인 상태인지 확인하는 과정의 결함으로 인해 발생합니다. 잘못된 인덱스 요청 시 NULL 대신 vCPU0를 반환하게 되어, vCPU 생성 실패 시 vCPU0를 참조하는 Use-After-Free 취약점이 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터 가상화 기술(KVM)에서 존재하지 않는 가상 CPU를 요청했을 때, 시스템이 실수로 0번 CPU를 넘겨주어 발생하는 오류입니다. 이로 인해 시스템이 이미 삭제된 메모리 영역을 다시 사용하려다가 충돌하거나 보안 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
KVM: Explicitly verify target vCPU is online in kvm_get_vcpu()
Explicitly verify the target vCPU is fully online _prior_ to clamping the
index in kvm_get_vcpu(). If the index is "bad", the nospec clamping will
generate '0', i.e. KVM will return vCPU0 instead of NULL.
In practice, the bug is unlikely to cause problems, as it will only come
into play if userspace or the guest is buggy or misbehaving, e.g. KVM may
send interrupts to vCPU0 instead of dropping them on the floor.
However, returning vCPU0 when it shouldn't exist per online_vcpus is
problematic now that KVM uses an xarray for the vCPUs array, as KVM needs
to insert into the xarray before publishing the vCPU to userspace (see
commit c5b077549136 ("KVM: Convert the kvm->vcpus array to a xarray")),
i.e. before vCPU creation is guaranteed to succeed.
As a result, incorrectly providing access to vCPU0 will trigger a
use-after-free if vCPU0 is dereferenced and kvm_vm_ioctl_create_vcpu()
bails out of vCPU creation due to an error and frees vCPU0. Commit
afb2acb2e3a3 ("KVM: Fix vcpu_array[0] races") papered over that issue, but
in doing so introduced an unsolvable teardown conundrum. Preventing
accesses to vCPU0 before it's fully online will allow reverting commit
afb2acb2e3a3, without re-introducing the vcpu_array[0] UAF race.
📍 영향받는 시스템
Linux Kernel (KVM 모듈을 사용하는 시스템)
⚔️ 공격 벡터
버그가 있는 사용자 공간 애플리케이션이나 게스트 OS를 통한 잘못된 vCPU 인덱스 요청
🛡️ 대응 방법
KVM의 vCPU 온라인 상태 검증 로직이 포함된 최신 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 보안 업데이트 버전인지 확인합니다.