Blame SOURCES/CVE-2021-37576.patch

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