Skip to content

Commit 95fa101

Browse files
vittyvkbonzini
authored andcommitted
KVM: nVMX: avoid NULL pointer dereference with incorrect EVMCS GPAs
When an EVMCS enabled L1 guest on KVM will tries doing enlightened VMEnter with EVMCS GPA = 0 the host crashes because the evmcs_gpa != vmx->nested.hv_evmcs_vmptr condition in nested_vmx_handle_enlightened_vmptrld() will evaluate to false (as nested.hv_evmcs_vmptr is zeroed after init). The crash will happen on vmx->nested.hv_evmcs pointer dereference. Another problematic EVMCS ptr value is '-1' but it only causes host crash after nested_release_evmcs() invocation. The problem is exactly the same as with '0', we mistakenly think that the EVMCS pointer hasn't changed and thus nested.hv_evmcs_vmptr is valid. Resolve the issue by adding an additional !vmx->nested.hv_evmcs check to nested_vmx_handle_enlightened_vmptrld(), this way we will always be trying kvm_vcpu_map() when nested.hv_evmcs is NULL and this is supposed to catch all invalid EVMCS GPAs. Also, initialize hv_evmcs_vmptr to '0' in nested_release_evmcs() to be consistent with initialization where we don't currently set hv_evmcs_vmptr to '-1'. Cc: [email protected] Signed-off-by: Vitaly Kuznetsov <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent a93236f commit 95fa101

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

arch/x86/kvm/vmx/nested.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ static inline void nested_release_evmcs(struct kvm_vcpu *vcpu)
224224
return;
225225

226226
kvm_vcpu_unmap(vcpu, &vmx->nested.hv_evmcs_map, true);
227-
vmx->nested.hv_evmcs_vmptr = -1ull;
227+
vmx->nested.hv_evmcs_vmptr = 0;
228228
vmx->nested.hv_evmcs = NULL;
229229
}
230230

@@ -1923,7 +1923,8 @@ static int nested_vmx_handle_enlightened_vmptrld(struct kvm_vcpu *vcpu,
19231923
if (!nested_enlightened_vmentry(vcpu, &evmcs_gpa))
19241924
return 1;
19251925

1926-
if (unlikely(evmcs_gpa != vmx->nested.hv_evmcs_vmptr)) {
1926+
if (unlikely(!vmx->nested.hv_evmcs ||
1927+
evmcs_gpa != vmx->nested.hv_evmcs_vmptr)) {
19271928
if (!vmx->nested.hv_evmcs)
19281929
vmx->nested.current_vmptr = -1ull;
19291930

0 commit comments

Comments
 (0)