🇰🇷 한글 설명
Linux 커널 KVM x86 구현에서 vcpu_block() 함수가 블로킹 상태에서 깨어난 후 중첩(nested) 이벤트를 확인할 때, -EBUSY 반환값을 무시하도록 수정되었습니다. 사용자 공간이 MP_STATE나 주입된 이벤트를 조작하면 vCPU가 본래 불가능한 상태에 놓일 수 있었으며, 이때 잘못된 사용자 공간 종료로 VM이 중단되는 문제가 있었습니다.
💡 쉬운 설명
가상 머신의 CPU가 잠들었다 깨어날 때 일부 잘못된 상태를 처리하던 코드에 문제가 있었습니다. 이로 인해 가상 머신이 예기치 않게 종료될 수 있었고, 이를 방지하도록 수정되었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
KVM: x86: Ignore -EBUSY when checking nested events from vcpu_block()
Ignore -EBUSY when checking nested events after exiting a blocking state
while L2 is active, as exiting to userspace will generate a spurious
userspace exit, usually with KVM_EXIT_UNKNOWN, and likely lead to the VM's
demise. Continuing with the wakeup isn't perfect either, as *something*
has gone sideways if a vCPU is awakened in L2 with an injected event (or
worse, a nested run pending), but continuing on gives the VM a decent
chance of surviving without any major side effects.
As explained in the Fixes commits, it _should_ be impossible for a vCPU to
be put into a blocking state with an already-injected event (exception,
IRQ, or NMI). Unfortunately, userspace can stuff MP_STATE and/or injected
events, and thus put the vCPU into what should be an impossible state.
Don't bother trying to preserve the WARN, e.g. with an anti-syzkaller
Kconfig, as WARNs can (hopefully) be added in paths where _KVM_ would be
violating x86 architecture, e.g. by WARNing if KVM attempts to inject an
exception or interrupt while the vCPU isn't running.
📍 영향받는 시스템
KVM 기능을 사용하는 x86 기반 Linux 커널 (수정 이전 버전)
⚔️ 공격 벡터
권한이 있는 사용자 공간 프로그램이 KVM 인터페이스로 vCPU 상태(MP_STATE, 주입 이벤트)를 조작하여 가상 머신을 비정상 종료시킬 수 있음
🛡️ 대응 방법
패키지 관리자로 Linux 커널을 최신 보안 업데이트 버전으로 업그레이드하고 재부팅
🔧 검증 코드
출력된 커널 버전을 배포판의 보안 공지에서 해당 CVE 수정이 포함된 버전과 비교하고, 수정 버전 이상이면 패치가 적용된 것입니다.