|
|
ecb67e |
From bdeb7f1c4651240043b0b8a2a5432fc9760cfadf Mon Sep 17 00:00:00 2001
|
|
|
ecb67e |
From: Joe Lawrence <joe.lawrence@redhat.com>
|
|
|
ecb67e |
Date: Wed, 15 Jun 2022 16:10:31 -0400
|
|
|
ecb67e |
Subject: [KPATCH CVE-2022-1966] kpatch fixes for CVE-2022-1966
|
|
|
ecb67e |
|
|
|
ecb67e |
Kernels:
|
|
|
ecb67e |
3.10.0-1160.36.2.el7
|
|
|
ecb67e |
3.10.0-1160.41.1.el7
|
|
|
ecb67e |
3.10.0-1160.42.2.el7
|
|
|
ecb67e |
3.10.0-1160.45.1.el7
|
|
|
ecb67e |
3.10.0-1160.49.1.el7
|
|
|
ecb67e |
3.10.0-1160.53.1.el7
|
|
|
ecb67e |
3.10.0-1160.59.1.el7
|
|
|
ecb67e |
3.10.0-1160.62.1.el7
|
|
|
ecb67e |
3.10.0-1160.66.1.el7
|
|
|
ecb67e |
|
|
|
ecb67e |
Changes since last build:
|
|
|
ecb67e |
arches: x86_64 ppc64le
|
|
|
ecb67e |
nf_tables_api.o: changed function: nft_expr_init
|
|
|
ecb67e |
nft_dynset.o: changed function: nft_dynset_init
|
|
|
ecb67e |
---------------------------
|
|
|
ecb67e |
|
|
|
ecb67e |
Kpatch-MR: https://gitlab.com/redhat/prdsc/rhel/src/kpatch/rhel-7/-/merge_requests/42
|
|
|
ecb67e |
Approved-by: Yannick Cote (@ycote1)
|
|
|
ecb67e |
Modifications: none
|
|
|
ecb67e |
|
|
|
ecb67e |
commit c511e60bebd0546f8ec47a3c1691ab01d262b8e4
|
|
|
ecb67e |
Author: Phil Sutter <psutter@redhat.com>
|
|
|
ecb67e |
Date: Fri Jun 3 16:54:42 2022 +0200
|
|
|
ecb67e |
|
|
|
ecb67e |
netfilter: nf_tables: fix memory leak if expr init fails
|
|
|
ecb67e |
|
|
|
ecb67e |
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2093000
|
|
|
ecb67e |
Upstream Status: commit 6cafaf4764a32
|
|
|
ecb67e |
|
|
|
ecb67e |
commit 6cafaf4764a32597c2195aa5411b87728e1fde8a
|
|
|
ecb67e |
Author: Liping Zhang <liping.zhang@spreadtrum.com>
|
|
|
ecb67e |
Date: Mon Jun 20 21:11:45 2016 +0800
|
|
|
ecb67e |
|
|
|
ecb67e |
netfilter: nf_tables: fix memory leak if expr init fails
|
|
|
ecb67e |
|
|
|
ecb67e |
If expr init fails then we need to free it.
|
|
|
ecb67e |
|
|
|
ecb67e |
So when the user add a nft rule as follows:
|
|
|
ecb67e |
|
|
|
ecb67e |
# nft add rule filter input tcp dport 22 flow table ssh \
|
|
|
ecb67e |
{ ip saddr limit rate 0/second }
|
|
|
ecb67e |
|
|
|
ecb67e |
memory leak will happen.
|
|
|
ecb67e |
|
|
|
ecb67e |
Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
|
|
|
ecb67e |
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
|
ecb67e |
|
|
|
ecb67e |
Signed-off-by: Phil Sutter <psutter@redhat.com>
|
|
|
ecb67e |
|
|
|
ecb67e |
commit 4a4cc18bcf8f43c93dbf39cb52308dfaea4ec346
|
|
|
ecb67e |
Author: Phil Sutter <psutter@redhat.com>
|
|
|
ecb67e |
Date: Fri Jun 3 16:54:43 2022 +0200
|
|
|
ecb67e |
|
|
|
ecb67e |
netfilter: nf_tables: disallow non-stateful expression in sets earlier
|
|
|
ecb67e |
|
|
|
ecb67e |
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2093000
|
|
|
ecb67e |
Upstream Status: net.git commit 520778042ccca
|
|
|
ecb67e |
CVE: CVE-2022-1966
|
|
|
ecb67e |
Conflicts:
|
|
|
ecb67e |
* RHEL7 does not have nft_set_elem_expr_alloc(), remove
|
|
|
ecb67e |
NFT_EXPR_STATEFUL check from nft_dynset_init() instead
|
|
|
ecb67e |
* Context change in nft_expr_init() as RHEL7 does not have .release_ops
|
|
|
ecb67e |
* Adjusted new NFT_EXPR_STATEFUL check as upstream renamed 'info' into
|
|
|
ecb67e |
'expr_info'
|
|
|
ecb67e |
|
|
|
ecb67e |
commit 520778042ccca019f3ffa136dd0ca565c486cedd
|
|
|
ecb67e |
Author: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
|
ecb67e |
Date: Wed May 25 10:36:38 2022 +0200
|
|
|
ecb67e |
|
|
|
ecb67e |
netfilter: nf_tables: disallow non-stateful expression in sets earlier
|
|
|
ecb67e |
|
|
|
ecb67e |
Since 3e135cd499bf ("netfilter: nft_dynset: dynamic stateful expression
|
|
|
ecb67e |
instantiation"), it is possible to attach stateful expressions to set
|
|
|
ecb67e |
elements.
|
|
|
ecb67e |
|
|
|
ecb67e |
cd5125d8f518 ("netfilter: nf_tables: split set destruction in deactivate
|
|
|
ecb67e |
and destroy phase") introduces conditional destruction on the object to
|
|
|
ecb67e |
accomodate transaction semantics.
|
|
|
ecb67e |
|
|
|
ecb67e |
nft_expr_init() calls expr->ops->init() first, then check for
|
|
|
ecb67e |
NFT_STATEFUL_EXPR, this stills allows to initialize a non-stateful
|
|
|
ecb67e |
lookup expressions which points to a set, which might lead to UAF since
|
|
|
ecb67e |
the set is not properly detached from the set->binding for this case.
|
|
|
ecb67e |
Anyway, this combination is non-sense from nf_tables perspective.
|
|
|
ecb67e |
|
|
|
ecb67e |
This patch fixes this problem by checking for NFT_STATEFUL_EXPR before
|
|
|
ecb67e |
expr->ops->init() is called.
|
|
|
ecb67e |
|
|
|
ecb67e |
The reporter provides a KASAN splat and a poc reproducer (similar to
|
|
|
ecb67e |
those autogenerated by syzbot to report use-after-free errors). It is
|
|
|
ecb67e |
unknown to me if they are using syzbot or if they use similar automated
|
|
|
ecb67e |
tool to locate the bug that they are reporting.
|
|
|
ecb67e |
|
|
|
ecb67e |
For the record, this is the KASAN splat.
|
|
|
ecb67e |
|
|
|
ecb67e |
[ 85.431824] ==================================================================
|
|
|
ecb67e |
[ 85.432901] BUG: KASAN: use-after-free in nf_tables_bind_set+0x81b/0xa20
|
|
|
ecb67e |
[ 85.433825] Write of size 8 at addr ffff8880286f0e98 by task poc/776
|
|
|
ecb67e |
[ 85.434756]
|
|
|
ecb67e |
[ 85.434999] CPU: 1 PID: 776 Comm: poc Tainted: G W 5.18.0+ #2
|
|
|
ecb67e |
[ 85.436023] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
|
|
|
ecb67e |
|
|
|
ecb67e |
Fixes: 0b2d8a7b638b ("netfilter: nf_tables: add helper functions for expression handling")
|
|
|
ecb67e |
Reported-and-tested-by: Aaron Adams <edg-e@nccgroup.com>
|
|
|
ecb67e |
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
|
ecb67e |
|
|
|
ecb67e |
Signed-off-by: Phil Sutter <psutter@redhat.com>
|
|
|
ecb67e |
|
|
|
ecb67e |
Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
|
|
|
ecb67e |
---
|
|
|
ecb67e |
net/netfilter/nf_tables_api.c | 16 +++++++++++-----
|
|
|
ecb67e |
net/netfilter/nft_dynset.c | 4 ----
|
|
|
ecb67e |
2 files changed, 11 insertions(+), 9 deletions(-)
|
|
|
ecb67e |
|
|
|
ecb67e |
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
|
|
|
ecb67e |
index 0f46d90715a3..44738b987690 100644
|
|
|
ecb67e |
--- a/net/netfilter/nf_tables_api.c
|
|
|
ecb67e |
+++ b/net/netfilter/nf_tables_api.c
|
|
|
ecb67e |
@@ -1739,21 +1739,27 @@ struct nft_expr *nft_expr_init(const struct nft_ctx *ctx,
|
|
|
ecb67e |
|
|
|
ecb67e |
err = nf_tables_expr_parse(ctx, nla, &info;;
|
|
|
ecb67e |
if (err < 0)
|
|
|
ecb67e |
- goto err1;
|
|
|
ecb67e |
+ goto err_expr_parse;
|
|
|
ecb67e |
+
|
|
|
ecb67e |
+ err = -EOPNOTSUPP;
|
|
|
ecb67e |
+ if (!(info.ops->type->flags & NFT_EXPR_STATEFUL))
|
|
|
ecb67e |
+ goto err_expr_stateful;
|
|
|
ecb67e |
|
|
|
ecb67e |
err = -ENOMEM;
|
|
|
ecb67e |
expr = kzalloc(info.ops->size, GFP_KERNEL);
|
|
|
ecb67e |
if (expr == NULL)
|
|
|
ecb67e |
- goto err2;
|
|
|
ecb67e |
+ goto err_expr_stateful;
|
|
|
ecb67e |
|
|
|
ecb67e |
err = nf_tables_newexpr(ctx, &info, expr);
|
|
|
ecb67e |
if (err < 0)
|
|
|
ecb67e |
- goto err2;
|
|
|
ecb67e |
+ goto err_expr_new;
|
|
|
ecb67e |
|
|
|
ecb67e |
return expr;
|
|
|
ecb67e |
-err2:
|
|
|
ecb67e |
+err_expr_new:
|
|
|
ecb67e |
+ kfree(expr);
|
|
|
ecb67e |
+err_expr_stateful:
|
|
|
ecb67e |
module_put(info.ops->type->owner);
|
|
|
ecb67e |
-err1:
|
|
|
ecb67e |
+err_expr_parse:
|
|
|
ecb67e |
return ERR_PTR(err);
|
|
|
ecb67e |
}
|
|
|
ecb67e |
|
|
|
ecb67e |
diff --git a/net/netfilter/nft_dynset.c b/net/netfilter/nft_dynset.c
|
|
|
ecb67e |
index 3f9f8e82716e..0cf187230050 100644
|
|
|
ecb67e |
--- a/net/netfilter/nft_dynset.c
|
|
|
ecb67e |
+++ b/net/netfilter/nft_dynset.c
|
|
|
ecb67e |
@@ -174,10 +174,6 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
|
|
|
ecb67e |
priv->expr = nft_expr_init(ctx, tb[NFTA_DYNSET_EXPR]);
|
|
|
ecb67e |
if (IS_ERR(priv->expr))
|
|
|
ecb67e |
return PTR_ERR(priv->expr);
|
|
|
ecb67e |
-
|
|
|
ecb67e |
- err = -EOPNOTSUPP;
|
|
|
ecb67e |
- if (!(priv->expr->ops->type->flags & NFT_EXPR_STATEFUL))
|
|
|
ecb67e |
- goto err1;
|
|
|
ecb67e |
} else if (set->flags & NFT_SET_EVAL)
|
|
|
ecb67e |
return -EINVAL;
|
|
|
ecb67e |
|
|
|
ecb67e |
--
|
|
|
ecb67e |
2.34.3
|
|
|
ecb67e |
|
|
|
ecb67e |
|