Juergen Gross ffbe4d
Patch-mainline: v5.6-rc1
Juergen Gross ffbe4d
Git-commit: 25a5edea71b7c154b6a0b8cec14c711cafa31d26
Juergen Gross ffbe4d
From: Marios Pomonis <pomonis@google.com>
Juergen Gross ffbe4d
Date: Wed, 11 Dec 2019 12:47:47 -0800
Juergen Gross ffbe4d
Subject: [PATCH] KVM: x86: Protect MSR-based index computations in
Juergen Gross ffbe4d
 fixed_msr_to_seg_unit() from Spectre-v1/L1TF attacks
Juergen Gross ffbe4d
References: bsc#1164731
Juergen Gross ffbe4d
Juergen Gross ffbe4d
This fixes a Spectre-v1/L1TF vulnerability in fixed_msr_to_seg_unit().
Juergen Gross ffbe4d
This function contains index computations based on the
Juergen Gross ffbe4d
(attacker-controlled) MSR number.
Juergen Gross ffbe4d
Juergen Gross ffbe4d
Fixes: de9aef5e1ad6 ("KVM: MTRR: introduce fixed_mtrr_segment table")
Juergen Gross ffbe4d
Juergen Gross ffbe4d
Signed-off-by: Nick Finco <nifi@google.com>
Juergen Gross ffbe4d
Signed-off-by: Marios Pomonis <pomonis@google.com>
Juergen Gross ffbe4d
Reviewed-by: Andrew Honig <ahonig@google.com>
Juergen Gross ffbe4d
Cc: stable@vger.kernel.org
Juergen Gross ffbe4d
Reviewed-by: Jim Mattson <jmattson@google.com>
Juergen Gross ffbe4d
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Juergen Gross ffbe4d
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross ffbe4d
---
Juergen Gross ffbe4d
 arch/x86/kvm/mtrr.c | 8 ++++++--
Juergen Gross ffbe4d
 1 file changed, 6 insertions(+), 2 deletions(-)
Juergen Gross ffbe4d
Juergen Gross ffbe4d
diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c
Juergen Gross ffbe4d
index 25ce3edd1872..7f0059aa30e1 100644
Juergen Gross ffbe4d
--- a/arch/x86/kvm/mtrr.c
Juergen Gross ffbe4d
+++ b/arch/x86/kvm/mtrr.c
Juergen Gross ffbe4d
@@ -202,11 +202,15 @@ static bool fixed_msr_to_seg_unit(u32 msr, int *seg, int *unit)
Juergen Gross ffbe4d
 		break;
Juergen Gross ffbe4d
 	case MSR_MTRRfix16K_80000 ... MSR_MTRRfix16K_A0000:
Juergen Gross ffbe4d
 		*seg = 1;
Juergen Gross ffbe4d
-		*unit = msr - MSR_MTRRfix16K_80000;
Juergen Gross ffbe4d
+		*unit = array_index_nospec(
Juergen Gross ffbe4d
+			msr - MSR_MTRRfix16K_80000,
Juergen Gross ffbe4d
+			MSR_MTRRfix16K_A0000 - MSR_MTRRfix16K_80000 + 1);
Juergen Gross ffbe4d
 		break;
Juergen Gross ffbe4d
 	case MSR_MTRRfix4K_C0000 ... MSR_MTRRfix4K_F8000:
Juergen Gross ffbe4d
 		*seg = 2;
Juergen Gross ffbe4d
-		*unit = msr - MSR_MTRRfix4K_C0000;
Juergen Gross ffbe4d
+		*unit = array_index_nospec(
Juergen Gross ffbe4d
+			msr - MSR_MTRRfix4K_C0000,
Juergen Gross ffbe4d
+			MSR_MTRRfix4K_F8000 - MSR_MTRRfix4K_C0000 + 1);
Juergen Gross ffbe4d
 		break;
Juergen Gross ffbe4d
 	default:
Juergen Gross ffbe4d
 		return false;
Juergen Gross ffbe4d
-- 
Juergen Gross ffbe4d
2.16.4
Juergen Gross ffbe4d