Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp2917419pxb; Tue, 24 Aug 2021 10:33:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyvTVBfxWg03KnnSgQ28iwfEodx4q5s0t8AUMBFmLxNcMCo0Oio/Nmo13yzjAeS4gex3W8E X-Received: by 2002:a17:906:c9cb:: with SMTP id hk11mr41395116ejb.544.1629826382061; Tue, 24 Aug 2021 10:33:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629826382; cv=none; d=google.com; s=arc-20160816; b=W1OaZDis9UyvUOgHvq5bRGbDABHlfElQG3tBu/c9OPZb5CLAUH6K1xWlV4T88LZQo+ 0S5sZZetUPXIpYqnk6SEaNDHvjNDyqG3KW1NHywiyFsU/jZ/9qFvCMhzjwbF/f2fEwF2 hnWs01ZtQxFXE2SjpUyk/aOIW79wDZNWEr/QhD1A/Dvc5u9FIqqQmvlRTe5Vaa5HMNCb HG6smS5+XdLqigzQtTKkH7FwAl6P4U4AH+zJ/mV6qqFFvwhowjmLyCrFTL2Nq7lH4vUB My174h3YLBBfiVhsEyJ+OmIZbiRRm0OvJxL7inXIPkQkNYgeuXDZyLBZp49XUGkIkSv7 oJog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=pHrkCZQ4LFCx7kFRjKPSZeMHs8xYb5gXnPmRpdkGjHM=; b=l0AOiQuwq//xNPCGZp3WSVleh3spPaT36NpU9S889tymfL/GSBGPRYdiksC+pZREh7 iHkIUrJExHKp9LyeRfp3pWs4dyssRSR+kYwNeU+fb4/8Dx4RGcq42FRfl024tLzsXiOV 5HQrRsiyh4U5F3efwNRX3nKFFaQ6tfr1d1OEKzpgpqi0CjpSjTQs9hx277mgYPSpONWG NP6E1VhImoetQkObCkrvSkSTIpmPVu2ceduTfBVFXVSXKbqWtiznmBGtsGo7nW193c0z yHI4/oILa7CpP3UcT38BNv7vYUpl++6agHwrsCzYnvTV4pYlaYJqaX3eimaaYPUbjGkA F/Ag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=TOydiVMb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a11si6634622edx.218.2021.08.24.10.32.38; Tue, 24 Aug 2021 10:33:02 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=TOydiVMb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240343AbhHXRcF (ORCPT + 99 others); Tue, 24 Aug 2021 13:32:05 -0400 Received: from mail.kernel.org ([198.145.29.99]:34266 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241462AbhHXR3U (ORCPT ); Tue, 24 Aug 2021 13:29:20 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2367961B3F; Tue, 24 Aug 2021 17:05:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1629824729; bh=Fa86WDYGdFDpxCxBr/hw6G5xC2hZ94PRXSHfBv8/OH0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TOydiVMbgNgF9W7wfYNyHlv6jQodQ6RF00dKh5X/frcxuaHyyKfZ+aqc6lxIOJjz3 wVRQ8h0lTPGvJEC6aPFzW+R24VQW0gCGpwTptuqfncDTjOoso36hbbMnYeoFQMlqQy 0NT5D3nB4UrauBwNUleNm/YBhxR/QYw+ZK99fXM0qMBQmgUjdcnxGsgwgw8Ee5qiVh rG8FnT0dBqU/kv4FBEoMUshuMKPq2fW6M5saRdVFu/mO3G+WdyDfWwYPK+zVUhVmNe 6S2i4RNPMffbqC+bA8EZygp38rJvHM2AA2h5iD9rPjjFTuxWE63n1dnQqaFCPA/Tf8 Dl4eZLkwC26TA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Maxim Levitsky , Paolo Bonzini , Greg Kroah-Hartman Subject: [PATCH 4.14 32/64] KVM: nSVM: avoid picking up unsupported bits from L2 in int_ctl (CVE-2021-3653) Date: Tue, 24 Aug 2021 13:04:25 -0400 Message-Id: <20210824170457.710623-33-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210824170457.710623-1-sashal@kernel.org> References: <20210824170457.710623-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.245-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-4.14.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 4.14.245-rc1 X-KernelTest-Deadline: 2021-08-26T17:04+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Maxim Levitsky [ upstream commit 0f923e07124df069ba68d8bb12324398f4b6b709 ] * Invert the mask of bits that we pick from L2 in nested_vmcb02_prepare_control * Invert and explicitly use VIRQ related bits bitmask in svm_clear_vintr This fixes a security issue that allowed a malicious L1 to run L2 with AVIC enabled, which allowed the L2 to exploit the uninitialized and enabled AVIC to read/write the host physical memory at some offsets. Fixes: 3d6368ef580a ("KVM: SVM: Add VMRUN handler") Signed-off-by: Maxim Levitsky Signed-off-by: Paolo Bonzini Signed-off-by: Greg Kroah-Hartman --- arch/x86/include/asm/svm.h | 2 ++ arch/x86/kvm/svm.c | 15 ++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index 78dd9df88157..2a9e81e93aac 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h @@ -117,6 +117,8 @@ struct __attribute__ ((__packed__)) vmcb_control_area { #define V_IGN_TPR_SHIFT 20 #define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT) +#define V_IRQ_INJECTION_BITS_MASK (V_IRQ_MASK | V_INTR_PRIO_MASK | V_IGN_TPR_MASK) + #define V_INTR_MASKING_SHIFT 24 #define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 0e6e158b8f8f..5ff6c145fdbb 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -1211,12 +1211,7 @@ static __init int svm_hardware_setup(void) } } - if (vgif) { - if (!boot_cpu_has(X86_FEATURE_VGIF)) - vgif = false; - else - pr_info("Virtual GIF supported\n"); - } + vgif = false; /* Disabled for CVE-2021-3653 */ return 0; @@ -3164,7 +3159,13 @@ static bool nested_svm_vmrun(struct vcpu_svm *svm) svm->nested.intercept = nested_vmcb->control.intercept; svm_flush_tlb(&svm->vcpu, true); - svm->vmcb->control.int_ctl = nested_vmcb->control.int_ctl | V_INTR_MASKING_MASK; + + svm->vmcb->control.int_ctl &= + V_INTR_MASKING_MASK | V_GIF_ENABLE_MASK | V_GIF_MASK; + + svm->vmcb->control.int_ctl |= nested_vmcb->control.int_ctl & + (V_TPR_MASK | V_IRQ_INJECTION_BITS_MASK); + if (nested_vmcb->control.int_ctl & V_INTR_MASKING_MASK) svm->vcpu.arch.hflags |= HF_VINTR_MASK; else -- 2.30.2