[PATCH 0/4] nSVM: fix L0 crash if L2 has shutdown condtion which L1 doesn't intercept

From: Maxim Levitsky
Date: Thu Oct 20 2022 - 05:31:22 EST


Recently while trying to fix some unit tests I found another CVE in SVM nested code.

In 'shutdown_interception' vmexit handler we call kvm_vcpu_reset.

However if running nested and L1 doesn't intercept shutdown, we will still end
up running this function and trigger a bug in it.

The bug is that this function resets the 'vcpu->arch.hflags' without properly
leaving the nested state, which leaves the vCPU in inconsistent state, which
later triggers a kernel panic in SVM code.

The same bug can likely be triggered by sending INIT via local apic to a vCPU
which runs a nested guest.

On VMX we are lucky that the issue can't happen because VMX always intercepts
triple faults, thus triple fault in L2 will always be redirected to L1.
Plus the 'handle_triple_fault' of VMX doesn't reset the vCPU.

INIT IPI can't happen on VMX either because INIT events are masked while in
VMX mode.

Best regards,
Maxim Levitsky

Maxim Levitsky (4):
KVM: x86: nSVM: leave nested mode on vCPU free
KVM: x86: nSVM: harden svm_free_nested against freeing vmcb02 while
still in use
KVM: x86: add kvm_leave_nested
KVM: x86: forcibly leave nested mode on vCPU reset

arch/x86/kvm/svm/nested.c | 6 +++---
arch/x86/kvm/svm/svm.c | 1 +
arch/x86/kvm/vmx/nested.c | 3 ---
arch/x86/kvm/x86.c | 9 ++++++++-
4 files changed, 12 insertions(+), 7 deletions(-)

--
2.26.3