linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/9] nSVM: Security and correctness fixes
@ 2022-11-03 14:13 Maxim Levitsky
  2022-11-03 14:13 ` [PATCH v2 1/9] KVM: x86: nSVM: leave nested mode on vCPU free Maxim Levitsky
                   ` (9 more replies)
  0 siblings, 10 replies; 23+ messages in thread
From: Maxim Levitsky @ 2022-11-03 14:13 UTC (permalink / raw)
  To: kvm
  Cc: Paolo Bonzini, Thomas Gleixner, linux-kernel, Chenyi Qiang,
	Yang Zhong, x86, Shuah Khan, Dave Hansen, H. Peter Anvin,
	Maxim Levitsky, Colton Lewis, Borislav Petkov, Peter Xu,
	Sean Christopherson, Jim Mattson, linux-kselftest, Ingo Molnar,
	Wei Wang, David Matlack

Recently while trying to fix some unit tests I found a 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.

First 4 patches in this series address the above issue, and are
already posted on the list with title,
('nSVM: fix L0 crash if L2 has shutdown condtion which L1 doesn't intercept')
I addressed the review feedback and also added a unit test to hit this issue.

In addition to these patches I noticed that KVM doesn't honour SHUTDOWN intercept bit
of L1 on SVM, and I included a fix to do so - its only for correctness
as a normal hypervisor should always intercept SHUTDOWN.
A unit test on the other hand might want to not do so.
I also extendted the triple_fault_test selftest to hit this issue.

Finaly I found another security issue, I found a way to
trigger a kernel non rate limited printk on SVM from the guest, and
last patch in the series fixes that.

A unit test I posted to kvm-unit-tests project hits this issue, so
no selftest was added.

Best regards,
	Maxim Levitsky

Maxim Levitsky (9):
  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
  KVM: selftests: move idt_entry to header
  kvm: selftests: add svm nested shutdown test
  KVM: x86: allow L1 to not intercept triple fault
  KVM: selftests: add svm part to triple_fault_test
  KVM: x86: remove exit_int_info warning in svm_handle_exit

 arch/x86/kvm/svm/nested.c                     | 12 ++-
 arch/x86/kvm/svm/svm.c                        | 10 +--
 arch/x86/kvm/vmx/nested.c                     |  4 +-
 arch/x86/kvm/x86.c                            | 29 ++++++--
 tools/testing/selftests/kvm/.gitignore        |  1 +
 tools/testing/selftests/kvm/Makefile          |  1 +
 .../selftests/kvm/include/x86_64/processor.h  | 13 ++++
 .../selftests/kvm/lib/x86_64/processor.c      | 13 ----
 .../kvm/x86_64/svm_nested_shutdown_test.c     | 67 +++++++++++++++++
 .../kvm/x86_64/triple_fault_event_test.c      | 73 ++++++++++++++-----
 10 files changed, 172 insertions(+), 51 deletions(-)
 create mode 100644 tools/testing/selftests/kvm/x86_64/svm_nested_shutdown_test.c

-- 
2.34.3



^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2022-11-21 16:37 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-03 14:13 [PATCH v2 0/9] nSVM: Security and correctness fixes Maxim Levitsky
2022-11-03 14:13 ` [PATCH v2 1/9] KVM: x86: nSVM: leave nested mode on vCPU free Maxim Levitsky
2022-11-21 16:30   ` Liam Merwick
2022-11-03 14:13 ` [PATCH v2 2/9] KVM: x86: nSVM: harden svm_free_nested against freeing vmcb02 while still in use Maxim Levitsky
2022-11-21 16:30   ` Liam Merwick
2022-11-03 14:13 ` [PATCH v2 3/9] KVM: x86: add kvm_leave_nested Maxim Levitsky
2022-11-21 16:31   ` Liam Merwick
2022-11-03 14:13 ` [PATCH v2 4/9] KVM: x86: forcibly leave nested mode on vCPU reset Maxim Levitsky
2022-11-21 16:31   ` Liam Merwick
2022-11-03 14:13 ` [PATCH v2 5/9] KVM: selftests: move idt_entry to header Maxim Levitsky
2022-11-21 16:32   ` Liam Merwick
2022-11-03 14:13 ` [PATCH v2 6/9] kvm: selftests: add svm nested shutdown test Maxim Levitsky
2022-11-03 14:28   ` Maxim Levitsky
2022-11-21 16:33     ` Liam Merwick
2022-11-03 14:13 ` [PATCH v2 7/9] KVM: x86: allow L1 to not intercept triple fault Maxim Levitsky
2022-11-21 16:33   ` Liam Merwick
2022-11-03 14:13 ` [PATCH v2 8/9] KVM: selftests: add svm part to triple_fault_test Maxim Levitsky
2022-11-21 16:34   ` Liam Merwick
2022-11-03 14:13 ` [PATCH v2 9/9] KVM: x86: remove exit_int_info warning in svm_handle_exit Maxim Levitsky
2022-11-06 15:53   ` Liam Merwick
2022-11-09  9:15     ` Maxim Levitsky
2022-11-21 16:34       ` Liam Merwick
2022-11-15 14:55 ` [PATCH v2 0/9] nSVM: Security and correctness fixes Maxim Levitsky

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).