Blame SOURCES/CVE-2021-22555.patch

e07557
From: Joel Savitz <jsavitz@redhat.com>
e07557
Subject: [KPATCH 7.9] netfilter: x_tables: kpatch fixes for CVE-2021-22555
e07557
Date: Wed, 28 Jul 2021 12:03:15 -0400
e07557
e07557
Kernels:
e07557
3.10.0-1160.el7
e07557
3.10.0-1160.2.1.el7
e07557
3.10.0-1160.2.2.el7
e07557
3.10.0-1160.6.1.el7
e07557
3.10.0-1160.11.1.el7
e07557
3.10.0-1160.15.2.el7
e07557
3.10.0-1160.21.1.el7
e07557
3.10.0-1160.24.1.el7
e07557
3.10.0-1160.25.1.el7
e07557
3.10.0-1160.31.1.el7
e07557
3.10.0-1160.36.2.el7
e07557
e07557
Changes since last build:
e07557
arches: x86_64 ppc64le
e07557
arp_tables.o: changed function: translate_compat_table
e07557
ip6_tables.o: changed function: translate_compat_table
e07557
ip_tables.o: changed function: translate_compat_table
e07557
x_tables.o: changed function: xt_compat_match_from_user
e07557
x_tables.o: changed function: xt_compat_target_from_user
e07557
---------------------------
e07557
e07557
Kernels:
e07557
3.10.0-1160.el7
e07557
3.10.0-1160.2.1.el7
e07557
3.10.0-1160.2.2.el7
e07557
3.10.0-1160.6.1.el7
e07557
3.10.0-1160.11.1.el7
e07557
3.10.0-1160.15.2.el7
e07557
3.10.0-1160.21.1.el7
e07557
3.10.0-1160.24.1.el7
e07557
3.10.0-1160.25.1.el7
e07557
3.10.0-1160.31.1.el7
e07557
3.10.0-1160.36.2.el7
e07557
e07557
Modifications: none
e07557
e07557
Z-MR: https://gitlab.com/redhat/rhel/src/kernel/rhel-7/-/merge_requests/201
e07557
KT0 test PASS: https://beaker.engineering.redhat.com/jobs/5642298
e07557
for scratch build: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=38448253
e07557
e07557
commit 06215319786b979bed0f5eb3138de0506db9d39f
e07557
Author: Florian Westphal <fwestpha@redhat.com>
e07557
Date:   Fri Jul 9 11:42:55 2021 +0200
e07557
e07557
    netfilter: x_tables: fix compat match/target pad out-of-bound write
e07557
e07557
    Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1980489
e07557
    Upstream Status: commit b29c457a65114
e07557
    CVE: CVE-2021-22555
e07557
e07557
    commit b29c457a6511435960115c0f548c4360d5f4801d
e07557
    Author: Florian Westphal <fw@strlen.de>
e07557
    Date:   Wed Apr 7 21:38:57 2021 +0200
e07557
e07557
        netfilter: x_tables: fix compat match/target pad out-of-bound write
e07557
e07557
        xt_compat_match/target_from_user doesn't check that zeroing the area
e07557
        to start of next rule won't write past end of allocated ruleset blob.
e07557
e07557
        Remove this code and zero the entire blob beforehand.
e07557
e07557
        Reported-by: syzbot+cfc0247ac173f597aaaa@syzkaller.appspotmail.com
e07557
        Reported-by: Andy Nguyen <theflow@google.com>
e07557
        Fixes: 9fa492cdc160c ("[NETFILTER]: x_tables: simplify compat API")
e07557
        Signed-off-by: Florian Westphal <fw@strlen.de>
e07557
        Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
e07557
e07557
    Signed-off-by: Florian Westphal <fwestpha@redhat.com>
e07557
e07557
Signed-off-by: Joel Savitz <jsavitz@redhat.com>
e07557
Acked-by: Joe Lawrence <joe.lawrence@redhat.com>
e07557
Acked-by: Artem Savkov <asavkov@redhat.com>
e07557
Acked-by: Yannick Cote <ycote@redhat.com>
e07557
---
e07557
 net/ipv4/netfilter/arp_tables.c |  2 ++
e07557
 net/ipv4/netfilter/ip_tables.c  |  2 ++
e07557
 net/ipv6/netfilter/ip6_tables.c |  2 ++
e07557
 net/netfilter/x_tables.c        | 10 ++--------
e07557
 4 files changed, 8 insertions(+), 8 deletions(-)
e07557
e07557
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
e07557
index 602d92697038..66ad3b4e194c 100644
e07557
--- a/net/ipv4/netfilter/arp_tables.c
e07557
+++ b/net/ipv4/netfilter/arp_tables.c
e07557
@@ -1364,6 +1364,8 @@ static int translate_compat_table(struct xt_table_info **pinfo,
e07557
 	if (!newinfo)
e07557
 		goto out_unlock;
e07557
 
e07557
+	memset(newinfo->entries, 0, size);
e07557
+
e07557
 	newinfo->number = compatr->num_entries;
e07557
 	for (i = 0; i < NF_ARP_NUMHOOKS; i++) {
e07557
 		newinfo->hook_entry[i] = info->hook_entry[i];
e07557
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
e07557
index 3559f7ffa430..d9de653be67e 100644
e07557
--- a/net/ipv4/netfilter/ip_tables.c
e07557
+++ b/net/ipv4/netfilter/ip_tables.c
e07557
@@ -1622,6 +1622,8 @@ translate_compat_table(struct net *net,
e07557
 	if (!newinfo)
e07557
 		goto out_unlock;
e07557
 
e07557
+	memset(newinfo->entries, 0, size);
e07557
+
e07557
 	newinfo->number = compatr->num_entries;
e07557
 	for (i = 0; i < NF_INET_NUMHOOKS; i++) {
e07557
 		newinfo->hook_entry[i] = compatr->hook_entry[i];
e07557
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
e07557
index 1772a1797e79..d112bfc86aac 100644
e07557
--- a/net/ipv6/netfilter/ip6_tables.c
e07557
+++ b/net/ipv6/netfilter/ip6_tables.c
e07557
@@ -1626,6 +1626,8 @@ translate_compat_table(struct net *net,
e07557
 	if (!newinfo)
e07557
 		goto out_unlock;
e07557
 
e07557
+	memset(newinfo->entries, 0, size);
e07557
+
e07557
 	newinfo->number = compatr->num_entries;
e07557
 	for (i = 0; i < NF_INET_NUMHOOKS; i++) {
e07557
 		newinfo->hook_entry[i] = compatr->hook_entry[i];
e07557
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
e07557
index 76e40ff48b10..affd08ce7df8 100644
e07557
--- a/net/netfilter/x_tables.c
e07557
+++ b/net/netfilter/x_tables.c
e07557
@@ -564,7 +564,7 @@ void xt_compat_match_from_user(struct xt_entry_match *m, void **dstptr,
e07557
 {
e07557
 	const struct xt_match *match = m->u.kernel.match;
e07557
 	struct compat_xt_entry_match *cm = (struct compat_xt_entry_match *)m;
e07557
-	int pad, off = xt_compat_match_offset(match);
e07557
+	int off = xt_compat_match_offset(match);
e07557
 	u_int16_t msize = cm->u.user.match_size;
e07557
 	char name[sizeof(m->u.user.name)];
e07557
 
e07557
@@ -574,9 +574,6 @@ void xt_compat_match_from_user(struct xt_entry_match *m, void **dstptr,
e07557
 		match->compat_from_user(m->data, cm->data);
e07557
 	else
e07557
 		memcpy(m->data, cm->data, msize - sizeof(*cm));
e07557
-	pad = XT_ALIGN(match->matchsize) - match->matchsize;
e07557
-	if (pad > 0)
e07557
-		memset(m->data + match->matchsize, 0, pad);
e07557
 
e07557
 	msize += off;
e07557
 	m->u.user.match_size = msize;
e07557
@@ -913,7 +910,7 @@ void xt_compat_target_from_user(struct xt_entry_target *t, void **dstptr,
e07557
 {
e07557
 	const struct xt_target *target = t->u.kernel.target;
e07557
 	struct compat_xt_entry_target *ct = (struct compat_xt_entry_target *)t;
e07557
-	int pad, off = xt_compat_target_offset(target);
e07557
+	int off = xt_compat_target_offset(target);
e07557
 	u_int16_t tsize = ct->u.user.target_size;
e07557
 	char name[sizeof(t->u.user.name)];
e07557
 
e07557
@@ -923,9 +920,6 @@ void xt_compat_target_from_user(struct xt_entry_target *t, void **dstptr,
e07557
 		target->compat_from_user(t->data, ct->data);
e07557
 	else
e07557
 		memcpy(t->data, ct->data, tsize - sizeof(*ct));
e07557
-	pad = XT_ALIGN(target->targetsize) - target->targetsize;
e07557
-	if (pad > 0)
e07557
-		memset(t->data + target->targetsize, 0, pad);
e07557
 
e07557
 	tsize += off;
e07557
 	t->u.user.target_size = tsize;
e07557
-- 
e07557
2.27.0
e07557
e07557