• Vitaly Kuznetsov's avatar
    KVM: nVMX: avoid NULL pointer dereference with incorrect EVMCS GPAs · 95fa1010
    Vitaly Kuznetsov authored
    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: stable@vger.kernel.org
    Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    95fa1010
nested.c 192 KB