Blame SOURCES/CVE-2021-22555.patch

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