• S
    KVM: x86: avoid calling x86 emulator without a decoded instruction · fee060cd
    Sean Christopherson 提交于
    Whenever x86_decode_emulated_instruction() detects a breakpoint, it
    returns the value that kvm_vcpu_check_breakpoint() writes into its
    pass-by-reference second argument.  Unfortunately this is completely
    bogus because the expected outcome of x86_decode_emulated_instruction
    is an EMULATION_* value.
    
    Then, if kvm_vcpu_check_breakpoint() does "*r = 0" (corresponding to
    a KVM_EXIT_DEBUG userspace exit), it is misunderstood as EMULATION_OK
    and x86_emulate_instruction() is called without having decoded the
    instruction.  This causes various havoc from running with a stale
    emulation context.
    
    The fix is to move the call to kvm_vcpu_check_breakpoint() where it was
    before commit 4aa2691d ("KVM: x86: Factor out x86 instruction
    emulation with decoding") introduced x86_decode_emulated_instruction().
    The other caller of the function does not need breakpoint checks,
    because it is invoked as part of a vmexit and the processor has already
    checked those before executing the instruction that #GP'd.
    
    This fixes CVE-2022-1852.
    Reported-by: NQiuhao Li <qiuhao@sysec.org>
    Reported-by: NGaoning Pan <pgn@zju.edu.cn>
    Reported-by: NYongkang Jia <kangel@zju.edu.cn>
    Fixes: 4aa2691d ("KVM: x86: Factor out x86 instruction emulation with decoding")
    Cc: stable@vger.kernel.org
    Signed-off-by: NSean Christopherson <seanjc@google.com>
    Message-Id: <20220311032801.3467418-2-seanjc@google.com>
    [Rewrote commit message according to Qiuhao's report, since a patch
     already existed to fix the bug. - Paolo]
    Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
    fee060cd
x86.c 342.8 KB