Blame SOURCES/CVE-2021-37576.patch

4a250b
From 9ab861c9a630d07a8ac0240f81dd0067b6c57963 Mon Sep 17 00:00:00 2001
4a250b
From: Joel Savitz <jsavitz@redhat.com>
4a250b
Date: Mon, 20 Sep 2021 13:49:09 -0400
4a250b
Subject: [KPATCH CVE-2021-37576] KVM: PPC: kpatch fixes for CVE-2021-37576
4a250b
4a250b
Kernels:
4a250b
3.10.0-1160.el7
4a250b
3.10.0-1160.2.1.el7
4a250b
3.10.0-1160.2.2.el7
4a250b
3.10.0-1160.6.1.el7
4a250b
3.10.0-1160.11.1.el7
4a250b
3.10.0-1160.15.2.el7
4a250b
3.10.0-1160.21.1.el7
4a250b
3.10.0-1160.24.1.el7
4a250b
3.10.0-1160.25.1.el7
4a250b
3.10.0-1160.31.1.el7
4a250b
3.10.0-1160.36.2.el7
4a250b
3.10.0-1160.41.1.el7
4a250b
3.10.0-1160.42.2.el7
4a250b
4a250b
Changes since last build:
4a250b
arches: ppc64le
4a250b
book3s_rtas.o: changed function: kvmppc_rtas_hcall
4a250b
---------------------------
4a250b
4a250b
Kernels:
4a250b
3.10.0-1160.2.1.el7
4a250b
3.10.0-1160.2.2.el7
4a250b
3.10.0-1160.6.1.el7
4a250b
3.10.0-1160.11.1.el7
4a250b
3.10.0-1160.15.2.el7
4a250b
3.10.0-1160.21.1.el7
4a250b
3.10.0-1160.24.1.el7
4a250b
3.10.0-1160.25.1.el7
4a250b
3.10.0-1160.31.1.el7
4a250b
3.10.0-1160.36.2.el7
4a250b
3.10.0-1160.41.1.el7
4a250b
3.10.0-1160.42.2.el7
4a250b
4a250b
Modifications: None
4a250b
Kpatch-MR: https://gitlab.com/kpatch-dev/rhel-7/-/merge_requests/8
4a250b
Approved-by: Artem Savkov (@artem.savkov)
4a250b
Approved-by: Joe Lawrence (@joe.lawrence)
4a250b
Approved-by: Yannick Cote (@ycote1)
4a250b
4a250b
Z-MR: https://gitlab.com/redhat/rhel/src/kernel/rhel-7/-/merge_requests/274
4a250b
4a250b
No reproducer available, tested via manual install and:
4a250b
KT0 test PASS (ppc64le only): https://beaker.engineering.redhat.com/jobs/5809981
4a250b
4a250b
for scratch build: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=39840849
4a250b
4a250b
commit e1b729d6d332cc22fe641edc723324222096bf29
4a250b
Author: Jon Maloy <jmaloy@redhat.com>
4a250b
Date:   Thu Aug 12 19:22:51 2021 -0400
4a250b
4a250b
    KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow
4a250b
4a250b
    Bugzilla: https://bugzilla.redhat.com/1988218
4a250b
    Upstream Status: Merged
4a250b
    Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=39246436
4a250b
    CVE: CVE-2021-37576
4a250b
4a250b
    commit f62f3c20647ebd5fb6ecb8f0b477b9281c44c10a
4a250b
    Author: Nicholas Piggin <npiggin@gmail.com>
4a250b
    Date:   Tue Jul 20 20:43:09 2021 +1000
4a250b
4a250b
        KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow
4a250b
4a250b
        The kvmppc_rtas_hcall() sets the host rtas_args.rets pointer based on
4a250b
        the rtas_args.nargs that was provided by the guest. That guest nargs
4a250b
        value is not range checked, so the guest can cause the host rets pointer
4a250b
        to be pointed outside the args array. The individual rtas function
4a250b
        handlers check the nargs and nrets values to ensure they are correct,
4a250b
        but if they are not, the handlers store a -3 (0xfffffffd) failure
4a250b
        indication in rets[0] which corrupts host memory.
4a250b
4a250b
        Fix this by testing up front whether the guest supplied nargs and nret
4a250b
        would exceed the array size, and fail the hcall directly without storing
4a250b
        a failure indication to rets[0].
4a250b
4a250b
        Also expand on a comment about why we kill the guest and try not to
4a250b
        return errors directly if we have a valid rets[0] pointer.
4a250b
4a250b
        Fixes: 8e591cb72047 ("KVM: PPC: Book3S: Add infrastructure to implement kernel-side RTAS calls")
4a250b
        Cc: stable@vger.kernel.org # v3.10+
4a250b
        Reported-by: Alexey Kardashevskiy <aik@ozlabs.ru>
4a250b
        Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
4a250b
        Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
4a250b
4a250b
    Signed-off-by: Jon Maloy <jmaloy@redhat.com>
4a250b
4a250b
Signed-off-by: Joel Savitz <jsavitz@redhat.com>
4a250b
---
4a250b
 arch/powerpc/kvm/book3s_rtas.c | 25 ++++++++++++++++++++++---
4a250b
 1 file changed, 22 insertions(+), 3 deletions(-)
4a250b
4a250b
diff --git a/arch/powerpc/kvm/book3s_rtas.c b/arch/powerpc/kvm/book3s_rtas.c
4a250b
index ef27fbd5d9c5..d896c6854abc 100644
4a250b
--- a/arch/powerpc/kvm/book3s_rtas.c
4a250b
+++ b/arch/powerpc/kvm/book3s_rtas.c
4a250b
@@ -230,6 +230,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
4a250b
 	 * value so we can restore it on the way out.
4a250b
 	 */
4a250b
 	orig_rets = args.rets;
4a250b
+	if (be32_to_cpu(args.nargs) >= ARRAY_SIZE(args.args)) {
4a250b
+		/*
4a250b
+		 * Don't overflow our args array: ensure there is room for
4a250b
+		 * at least rets[0] (even if the call specifies 0 nret).
4a250b
+		 *
4a250b
+		 * Each handler must then check for the correct nargs and nret
4a250b
+		 * values, but they may always return failure in rets[0].
4a250b
+		 */
4a250b
+		rc = -EINVAL;
4a250b
+		goto fail;
4a250b
+	}
4a250b
 	args.rets = &args.args[be32_to_cpu(args.nargs)];
4a250b
 
4a250b
 	mutex_lock(&vcpu->kvm->lock);
4a250b
@@ -257,9 +268,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
4a250b
 fail:
4a250b
 	/*
4a250b
 	 * We only get here if the guest has called RTAS with a bogus
4a250b
-	 * args pointer. That means we can't get to the args, and so we
4a250b
-	 * can't fail the RTAS call. So fail right out to userspace,
4a250b
-	 * which should kill the guest.
4a250b
+	 * args pointer or nargs/nret values that would overflow the
4a250b
+	 * array. That means we can't get to the args, and so we can't
4a250b
+	 * fail the RTAS call. So fail right out to userspace, which
4a250b
+	 * should kill the guest.
4a250b
+	 *
4a250b
+	 * SLOF should actually pass the hcall return value from the
4a250b
+	 * rtas handler call in r3, so enter_rtas could be modified to
4a250b
+	 * return a failure indication in r3 and we could return such
4a250b
+	 * errors to the guest rather than failing to host userspace.
4a250b
+	 * However old guests that don't test for failure could then
4a250b
+	 * continue silently after errors, so for now we won't do this.
4a250b
 	 */
4a250b
 	return rc;
4a250b
 }
4a250b
-- 
4a250b
2.26.3
4a250b
4a250b