Blame SOURCES/CVE-2021-22555.patch

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