Blame SOURCES/CVE-2021-22555.patch

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