linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] net: sched: Fix memory exposure from short TCA_U32_SEL
@ 2018-08-26  5:58 Kees Cook
  2018-08-26  6:15 ` Al Viro
  2018-08-26 21:22 ` David Miller
  0 siblings, 2 replies; 28+ messages in thread
From: Kees Cook @ 2018-08-26  5:58 UTC (permalink / raw)
  To: linux-kernel
  Cc: Al Viro, Jamal Hadi Salim, Cong Wang, Jiri Pirko,
	David S. Miller, netdev

Via u32_change(), TCA_U32_SEL has an unspecified type in the netlink
policy, so max length isn't enforced, only minimum. This means nkeys
(from userspace) was being trusted without checking the actual size of
nla_len(), which could lead to a memory over-read, and ultimately an
exposure via a call to u32_dump(). Reachability is CAP_NET_ADMIN within
a namespace.

Reported-by: Al Viro <viro@zeniv.linux.org.uk>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Cong Wang <xiyou.wangcong@gmail.com>
Cc: Jiri Pirko <jiri@resnulli.us>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
---
This should go through -stable please, but I have left off the "Cc:
stable" as per netdev patch policy. Note that use of struct_size()
will need manual expansion in backports, such as:
	sel_size = sizeof(*s) + sizeof(*s->keys) * s->nkeys;
---
 net/sched/cls_u32.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index d5d2a6dc3921..f218ccf1e2d9 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -914,6 +914,7 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
 	struct nlattr *opt = tca[TCA_OPTIONS];
 	struct nlattr *tb[TCA_U32_MAX + 1];
 	u32 htid, flags = 0;
+	size_t sel_size;
 	int err;
 #ifdef CONFIG_CLS_U32_PERF
 	size_t size;
@@ -1076,8 +1077,13 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
 	}
 
 	s = nla_data(tb[TCA_U32_SEL]);
+	sel_size = struct_size(s, keys, s->nkeys);
+	if (nla_len(tb[TCA_U32_SEL]) < sel_size) {
+		err = -EINVAL;
+		goto erridr;
+	}
 
-	n = kzalloc(sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key), GFP_KERNEL);
+	n = kzalloc(offsetof(typeof(*n), sel) + sel_size, GFP_KERNEL);
 	if (n == NULL) {
 		err = -ENOBUFS;
 		goto erridr;
@@ -1092,7 +1098,7 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
 	}
 #endif
 
-	memcpy(&n->sel, s, sizeof(*s) + s->nkeys*sizeof(struct tc_u32_key));
+	memcpy(&n->sel, s, sel_size);
 	RCU_INIT_POINTER(n->ht_up, ht);
 	n->handle = handle;
 	n->fshift = s->hmask ? ffs(ntohl(s->hmask)) - 1 : 0;
-- 
2.17.1


-- 
Kees Cook
Pixel Security

^ permalink raw reply related	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2018-08-31  4:03 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-26  5:58 [PATCH] net: sched: Fix memory exposure from short TCA_U32_SEL Kees Cook
2018-08-26  6:15 ` Al Viro
2018-08-26  6:19   ` Kees Cook
2018-08-26 17:30     ` Jamal Hadi Salim
2018-08-26 21:56       ` Kees Cook
2018-08-27 11:46         ` Jamal Hadi Salim
2018-08-27 14:08           ` Kees Cook
2018-08-27 14:26             ` Roman Mashak
2018-08-26 17:32     ` Al Viro
2018-08-26 18:57       ` Joe Perches
2018-08-26 21:24         ` Al Viro
2018-08-26 22:26           ` Joe Perches
2018-08-26 22:43             ` Al Viro
2018-08-27  2:00               ` Julia Lawall
2018-08-27  2:35                 ` Al Viro
2018-08-27  3:35                   ` Julia Lawall
2018-08-27  4:04                     ` Al Viro
2018-08-27  4:41                       ` Julia Lawall
2018-08-27  1:59             ` Julia Lawall
2018-08-26 22:57       ` Al Viro
2018-08-27 11:57         ` Jamal Hadi Salim
2018-08-27 21:31           ` Cong Wang
2018-08-28  0:03             ` Al Viro
2018-08-28 15:59               ` Al Viro
2018-08-31  4:03                 ` Al Viro
2018-08-29 19:07               ` Cong Wang
2018-08-29 21:33                 ` Al Viro
2018-08-26 21:22 ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).