Blame SOURCES/CVE-2021-37576.patch

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