🇰🇷 한글 설명
Linux 커널의 KVM에서 중첩 가상화(Nested Virtualization) 시 VM-Enter가 실패할 경우 로컬 TLB 플러시를 수행하지 않는 취약점이 발견되었습니다. 이로 인해 VPID 변경 시 TLB가 적절히 갱신되지 않아 이전의 메모리 주소 변환 정보가 남아있을 수 있습니다. 이는 보안 격리를 무력화할 수 있는 잠재적 위험을 초래합니다.
💡 쉬운 설명
가상 컴퓨터를 실행하려다 실패했을 때, 컴퓨터의 메모리 주소 기록을 깨끗이 지워야 하는데 이를 건너뛰는 문제입니다. 이로 인해 이전 데이터의 흔적이 남아 보안에 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
KVM: nVMX: Service local TLB flushes on failed nested VM-Enter
KVM services local TLB flushes on "full" nested VM-Exits (through
__nested_vmx_vmexit()), but not if a nested VM-Enter fails (e.g. due to
failed VMCS checks in nested_vmx_enter_non_root_mode()).
However, it is possible that KVM had queued TLB flushes that need to be
performed, even if the nested VM-Enter was not successful. For example,
if VPID is disabled for L2 (via nested_vmx_transition_tlb_flush(), or if
via the MSR load lists, as the SDM says:
If any MSR is being loaded in such a way that would architecturally
require a TLB flush, the TLBs are updated so that, after VM entry, the
logical processor will not use any translations that were cached before
the transition.
The SDM is unclear about when the TLB flush should occur, and whether or
not a failed VM entry would flush the TLB, so it is safer to always
do the TLB flush in this case.
More concretely, KVM also updates the last VPID L1 used for L2 in
nested_vmx_transition_tlb_flush() (i.e. last_vpid), even if the VM entry
ultimately fails. With the current code, KVM could miss a TLB flush if
L1 changes L2's VPID, then does a failed VM entry followed by a
successful one, as the failed VM entry would update last_vpid but not
actually flush the TLB. Servicing local TLB flushes on failed VM entries
makes sure that the TLB is always flushed when last_vpid is updated.
📍 영향받는 시스템
Linux Kernel (KVM subsystem using nested VMX)
⚔️ 공격 벡터
중첩 가상화 환경에서 의도적으로 VMCS 체크를 실패시켜 TLB 플러시를 누락시키는 방식
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하십시오.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인하십시오.