ACK: [PATCH] KVM: SVM: load control fields from VMCB12 before checking them
Stefan Bader
stefan.bader at canonical.com
Fri Apr 9 12:18:08 UTC 2021
On 08.04.21 21:36, Tim Gardner wrote:
> From: Paolo Bonzini <pbonzini at redhat.com>
>
> CVE-2021-29657
>
> Avoid races between check and use of the nested VMCB controls. This
> for example ensures that the VMRUN intercept is always reflected to the
> nested hypervisor, instead of being processed by the host. Without this
> patch, it is possible to end up with svm->nested.hsave pointing to
> the MSR permission bitmap for nested guests.
>
> This bug is CVE-2021-29657.
>
> Reported-by: Felix Wilhelm <fwilhelm at google.com>
> Cc: stable at vger.kernel.org
> Fixes: 2fcf4876ada ("KVM: nSVM: implement on demand allocation of the nested state")
> Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
> (cherry picked from commit a58d9166a756a0f4a6618e4f593232593d6df134)
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---
> arch/x86/kvm/svm/nested.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c
> index 1008cc6cb66c..dd318ca6c722 100644
> --- a/arch/x86/kvm/svm/nested.c
> +++ b/arch/x86/kvm/svm/nested.c
> @@ -246,7 +246,7 @@ static bool nested_vmcb_check_controls(struct vmcb_control_area *control)
> return true;
> }
>
> -static bool nested_vmcb_checks(struct vcpu_svm *svm, struct vmcb *vmcb12)
> +static bool nested_vmcb_check_save(struct vcpu_svm *svm, struct vmcb *vmcb12)
> {
> struct kvm_vcpu *vcpu = &svm->vcpu;
> bool vmcb12_lma;
> @@ -271,7 +271,7 @@ static bool nested_vmcb_checks(struct vcpu_svm *svm, struct vmcb *vmcb12)
> if (kvm_valid_cr4(&svm->vcpu, vmcb12->save.cr4))
> return false;
>
> - return nested_vmcb_check_controls(&vmcb12->control);
> + return true;
> }
>
> static void load_nested_vmcb_control(struct vcpu_svm *svm,
> @@ -454,7 +454,6 @@ int enter_svm_guest_mode(struct vcpu_svm *svm, u64 vmcb12_gpa,
> int ret;
>
> svm->nested.vmcb12_gpa = vmcb12_gpa;
> - load_nested_vmcb_control(svm, &vmcb12->control);
> nested_prepare_vmcb_save(svm, vmcb12);
> nested_prepare_vmcb_control(svm);
>
> @@ -501,7 +500,10 @@ int nested_svm_vmrun(struct vcpu_svm *svm)
> if (WARN_ON_ONCE(!svm->nested.initialized))
> return -EINVAL;
>
> - if (!nested_vmcb_checks(svm, vmcb12)) {
> + load_nested_vmcb_control(svm, &vmcb12->control);
> +
> + if (!nested_vmcb_check_save(svm, vmcb12) ||
> + !nested_vmcb_check_controls(&svm->nested.ctl)) {
> vmcb12->control.exit_code = SVM_EXIT_ERR;
> vmcb12->control.exit_code_hi = 0;
> vmcb12->control.exit_info_1 = 0;
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20210409/86a2e619/attachment.sig>
More information about the kernel-team
mailing list