Blame SOURCES/CVE-2021-37576.patch

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