• Jim Mattson's avatar
    KVM: VMX: Execute IBPB on emulated VM-exit when guest has IBRS · 2e7eab81
    Jim Mattson authored
    According to Intel's document on Indirect Branch Restricted
    Speculation, "Enabling IBRS does not prevent software from controlling
    the predicted targets of indirect branches of unrelated software
    executed later at the same predictor mode (for example, between two
    different user applications, or two different virtual machines). Such
    isolation can be ensured through use of the Indirect Branch Predictor
    Barrier (IBPB) command." This applies to both basic and enhanced IBRS.
    
    Since L1 and L2 VMs share hardware predictor modes (guest-user and
    guest-kernel), hardware IBRS is not sufficient to virtualize
    IBRS. (The way that basic IBRS is implemented on pre-eIBRS parts,
    hardware IBRS is actually sufficient in practice, even though it isn't
    sufficient architecturally.)
    
    For virtual CPUs that support IBRS, add an indirect branch prediction
    barrier on emulated VM-exit, to ensure that the predicted targets of
    indirect branches executed in L1 cannot be controlled by software that
    was executed in L2.
    
    Since we typically don't intercept guest writes to IA32_SPEC_CTRL,
    perform the IBPB at emulated VM-exit regardless of the current
    IA32_SPEC_CTRL.IBRS value, even though the IBPB could technically be
    deferred until L1 sets IA32_SPEC_CTRL.IBRS, if IA32_SPEC_CTRL.IBRS is
    clear at emulated VM-exit.
    
    This is CVE-2022-2196.
    
    Fixes: 5c911bef ("KVM: nVMX: Skip IBPB when switching between vmcs01 and vmcs02")
    Cc: Sean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarJim Mattson <jmattson@google.com>
    Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
    Link: https://lore.kernel.org/r/20221019213620.1953281-3-jmattson@google.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    2e7eab81
vmx.c 243 KB