Patch "KVM: nVMX: Fix memory corruption when using VMCS shadowing" has been added to the 4.4-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
KVM: nVMX: Fix memory corruption when using VMCS shadowing
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kvm-nvmx-fix-memory-corruption-when-using-vmcs-shadowing.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
2f1fe81123f59271bddda673b60116bde9660385Mon Sep 17 00:00:00 2001
From: Jim Mattson <[email protected]>
Date: Fri, 8 Jul 2016 15:36:06 -0700
Subject: KVM: nVMX: Fix memory corruption when using VMCS shadowing
From: Jim Mattson <[email protected]>
commit 2f1fe81123f59271bddda673b60116bde9660385 upstream.
When freeing the nested resources of a vcpu, there is an assumption that the vcpu's vmcs01 is the current VMCS on the CPU that executes nested_release_vmcs12(). If this assumption is violated, the vcpu's vmcs01 may be made active on multiple CPUs at the same time, in violation of Intel's specification. Moreover, since the vcpu's vmcs01 is not VMCLEARed on every CPU on which it is active, it can linger in a CPU's VMCS cache after it has been freed and potentially repurposed. Subsequent eviction from the CPU's VMCS cache on a capacity miss can result in memory corruption.
It is not sufficient for vmx_free_vcpu() to call vmx_load_vmcs01(). If the vcpu in question was last loaded on a different CPU, it must be migrated to the current CPU before calling vmx_load_vmcs01().
--- arch/x86/kvm/vmx.c | 19 +++++++++++++++++-- virt/kvm/kvm_main.c | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-)
arch/x86/kvm/vmx.c +17 -2
@@ -8737,6 +8737,22 @@ static void vmx_load_vmcs01(struct kvm_vput_cpu (); } +/* +* Ensure that the current vmcs of the logical processor is the +* vmcs01 of the vcpu before calling free_nested(). +*/ +static void vmx_free_vcpu_nested (struct kvm_vcpu *vcpu) +{ +struct vcpu_vmx *vmx =to_vmx (vcpu); +int r; + + r =vcpu_load (vcpu); +BUG_ON (r); +vmx_load_vmcs01 (vcpu); +free_nested (vmx); +vcpu_put (vcpu); +} +static void vmx_free_vcpu (struct kvm_vcpu *vcpu) {struct vcpu_vmx *vmx =to_vmx (vcpu);
@@ -8745,8 +8761,7 @@ static void vmx_free_vcpu(struct kvm_vcpvmx_destroy_pml_buffer (vmx);free_vpid (vmx->vpid);leave_guest_mode (vcpu); -vmx_load_vmcs01 (vcpu); -free_nested (vmx); +vmx_free_vcpu_nested (vcpu);free_loaded_vmcs (vmx->loaded_vmcs);kfree (vmx->guest_msrs);kvm_vcpu_uninit (vcpu);
virt/kvm/kvm_main.c +2 -0
@@ -142,6 +142,7 @@ int vcpu_load(struct kvm_vcpu *vcpu)put_cpu ();return 0 ; } +EXPORT_SYMBOL_GPL (vcpu_load);void vcpu_put (struct kvm_vcpu *vcpu) {
@@ -151,6 +152,7 @@ void vcpu_put(struct kvm_vcpu *vcpu)preempt_enable ();mutex_unlock (&vcpu->mutex); } +EXPORT_SYMBOL_GPL (vcpu_put);static void ack_flush (void *_completed) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/kvm-nvmx-fix-memory-corruption-when-using-vmcs-shadowing.patch