Blame SOURCES/CVE-2021-37576.patch

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