Blame SOURCES/CVE-2022-32250.patch

351fcb
From 2f9874af7248b917772c8673054118267b3be415 Mon Sep 17 00:00:00 2001
351fcb
From: Julia Denham <jdenham@redhat.com>
351fcb
Date: Mon, 11 Jul 2022 08:10:32 -0400
351fcb
Subject: [KPATCH CVE-2022-32250] kpatch fixes for CVE-2022-1966
351fcb
Content-type: text/plain
351fcb
351fcb
Kernels:
351fcb
4.18.0-372.9.1.el8
351fcb
351fcb
Changes since last build:
351fcb
arches: x86_64 ppc64le
351fcb
nf_tables_api.o: changed function: nft_expr_init
351fcb
nf_tables_api.o: changed function: nft_set_elem_expr_alloc
351fcb
---------------------------
351fcb
351fcb
Kpatch-MR: https://gitlab.com/redhat/prdsc/rhel/src/kpatch/rhel-8/-/merge_requests/53
351fcb
Approved-by: Joe Lawrence (@joe.lawrence)
351fcb
Approved-by: Yannick Cote (@ycote1)
351fcb
Modifications: none
351fcb
351fcb
commit afeaad78f78f7593e89f540a87b8796e8d705d57
351fcb
Author: Phil Sutter <psutter@redhat.com>
351fcb
Date:   Thu Jun 2 20:58:22 2022 +0200
351fcb
351fcb
    netfilter: nf_tables: disallow non-stateful expression in sets earlier
351fcb
351fcb
    Bugzilla: https://bugzilla.redhat.com/2092986
351fcb
    CVE: CVE-2022-32250
351fcb
    Y-Commit: cfb0d599ec74a88a5f02455616f96946defb849e
351fcb
351fcb
    O-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2092987
351fcb
    Upstream Status: net.git commit 520778042ccca
351fcb
    O-CVE: CVE-2022-32250
351fcb
    Conflicts: Upstream renamed info -> expr_info.
351fcb
351fcb
    commit 520778042ccca019f3ffa136dd0ca565c486cedd
351fcb
    Author: Pablo Neira Ayuso <pablo@netfilter.org>
351fcb
    Date:   Wed May 25 10:36:38 2022 +0200
351fcb
351fcb
        netfilter: nf_tables: disallow non-stateful expression in sets earlier
351fcb
351fcb
        Since 3e135cd499bf ("netfilter: nft_dynset: dynamic stateful expression
351fcb
        instantiation"), it is possible to attach stateful expressions to set
351fcb
        elements.
351fcb
351fcb
        cd5125d8f518 ("netfilter: nf_tables: split set destruction in deactivate
351fcb
        and destroy phase") introduces conditional destruction on the object to
351fcb
        accomodate transaction semantics.
351fcb
351fcb
        nft_expr_init() calls expr->ops->init() first, then check for
351fcb
        NFT_STATEFUL_EXPR, this stills allows to initialize a non-stateful
351fcb
        lookup expressions which points to a set, which might lead to UAF since
351fcb
        the set is not properly detached from the set->binding for this case.
351fcb
        Anyway, this combination is non-sense from nf_tables perspective.
351fcb
351fcb
        This patch fixes this problem by checking for NFT_STATEFUL_EXPR before
351fcb
        expr->ops->init() is called.
351fcb
351fcb
        The reporter provides a KASAN splat and a poc reproducer (similar to
351fcb
        those autogenerated by syzbot to report use-after-free errors). It is
351fcb
        unknown to me if they are using syzbot or if they use similar automated
351fcb
        tool to locate the bug that they are reporting.
351fcb
351fcb
        For the record, this is the KASAN splat.
351fcb
351fcb
        [   85.431824] ==================================================================
351fcb
        [   85.432901] BUG: KASAN: use-after-free in nf_tables_bind_set+0x81b/0xa20
351fcb
        [   85.433825] Write of size 8 at addr ffff8880286f0e98 by task poc/776
351fcb
        [   85.434756]
351fcb
        [   85.434999] CPU: 1 PID: 776 Comm: poc Tainted: G        W         5.18.0+ #2
351fcb
        [   85.436023] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
351fcb
351fcb
        Fixes: 0b2d8a7b638b ("netfilter: nf_tables: add helper functions for expression handling")
351fcb
        Reported-and-tested-by: Aaron Adams <edg-e@nccgroup.com>
351fcb
        Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
351fcb
351fcb
    Signed-off-by: Phil Sutter <psutter@redhat.com>
351fcb
    Signed-off-by: Augusto Caringi <acaringi@redhat.com>
351fcb
351fcb
Signed-off-by: Julia Denham <jdenham@redhat.com>
351fcb
---
351fcb
 net/netfilter/nf_tables_api.c | 19 ++++++++++---------
351fcb
 1 file changed, 10 insertions(+), 9 deletions(-)
351fcb
351fcb
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
351fcb
index aa095db8d0ca..097680c5f914 100644
351fcb
--- a/net/netfilter/nf_tables_api.c
351fcb
+++ b/net/netfilter/nf_tables_api.c
351fcb
@@ -2576,27 +2576,31 @@ static struct nft_expr *nft_expr_init(const struct nft_ctx *ctx,
351fcb
 
351fcb
 	err = nf_tables_expr_parse(ctx, nla, &info;;
351fcb
 	if (err < 0)
351fcb
-		goto err1;
351fcb
+		goto err_expr_parse;
351fcb
+
351fcb
+	err = -EOPNOTSUPP;
351fcb
+	if (!(info.ops->type->flags & NFT_EXPR_STATEFUL))
351fcb
+		goto err_expr_stateful;
351fcb
 
351fcb
 	err = -ENOMEM;
351fcb
 	expr = kzalloc(info.ops->size, GFP_KERNEL);
351fcb
 	if (expr == NULL)
351fcb
-		goto err2;
351fcb
+		goto err_expr_stateful;
351fcb
 
351fcb
 	err = nf_tables_newexpr(ctx, &info, expr);
351fcb
 	if (err < 0)
351fcb
-		goto err3;
351fcb
+		goto err_expr_new;
351fcb
 
351fcb
 	return expr;
351fcb
-err3:
351fcb
+err_expr_new:
351fcb
 	kfree(expr);
351fcb
-err2:
351fcb
+err_expr_stateful:
351fcb
 	owner = info.ops->type->owner;
351fcb
 	if (info.ops->type->release_ops)
351fcb
 		info.ops->type->release_ops(info.ops);
351fcb
 
351fcb
 	module_put(owner);
351fcb
-err1:
351fcb
+err_expr_parse:
351fcb
 	return ERR_PTR(err);
351fcb
 }
351fcb
 
351fcb
@@ -4983,9 +4987,6 @@ struct nft_expr *nft_set_elem_expr_alloc(const struct nft_ctx *ctx,
351fcb
 		return expr;
351fcb
 
351fcb
 	err = -EOPNOTSUPP;
351fcb
-	if (!(expr->ops->type->flags & NFT_EXPR_STATEFUL))
351fcb
-		goto err_set_elem_expr;
351fcb
-
351fcb
 	if (expr->ops->type->flags & NFT_EXPR_GC) {
351fcb
 		if (set->flags & NFT_SET_TIMEOUT)
351fcb
 			goto err_set_elem_expr;
351fcb
-- 
351fcb
2.26.3
351fcb
351fcb