From 85f85b6fba5a573f66eef3c11e1e939dab23d019 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Tue, 13 Jun 2023 15:23:24 +0200 Subject: [PATCH] backport "net/sched: flower: fix possible OOB write in fl_set_geneve_opt()" Signed-off-by: Thomas Lamprecht --- ...-fix-possible-OOB-write-in-fl_set_ge.patch | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 patches/kernel/0009-net-sched-flower-fix-possible-OOB-write-in-fl_set_ge.patch diff --git a/patches/kernel/0009-net-sched-flower-fix-possible-OOB-write-in-fl_set_ge.patch b/patches/kernel/0009-net-sched-flower-fix-possible-OOB-write-in-fl_set_ge.patch new file mode 100644 index 0000000..702fa23 --- /dev/null +++ b/patches/kernel/0009-net-sched-flower-fix-possible-OOB-write-in-fl_set_ge.patch @@ -0,0 +1,41 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Hangyu Hua +Date: Mon, 12 Jun 2023 14:42:12 -0300 +Subject: [PATCH] net/sched: flower: fix possible OOB write in + fl_set_geneve_opt() + +BugLink: https://bugs.launchpad.net/bugs/2023577 + +If we send two TCA_FLOWER_KEY_ENC_OPTS_GENEVE packets and their total +size is 252 bytes(key->enc_opts.len = 252) then +key->enc_opts.len = opt->length = data_len / 4 = 0 when the third +TCA_FLOWER_KEY_ENC_OPTS_GENEVE packet enters fl_set_geneve_opt. This +bypasses the next bounds check and results in an out-of-bounds. + +Fixes: 0a6e77784f49 ("net/sched: allow flower to match tunnel options") +Signed-off-by: Hangyu Hua +Reviewed-by: Simon Horman +Reviewed-by: Pieter Jansen van Vuuren +Link: https://lore.kernel.org/r/20230531102805.27090-1-hbh25y@gmail.com +Signed-off-by: Paolo Abeni +(cherry picked from commit 4d56304e5827c8cc8cc18c75343d283af7c4825c) +Signed-off-by: Thadeu Lima de Souza Cascardo +Signed-off-by: Thomas Lamprecht +--- + net/sched/cls_flower.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c +index 0b15698b3531..73fdd47dee30 100644 +--- a/net/sched/cls_flower.c ++++ b/net/sched/cls_flower.c +@@ -1149,6 +1149,9 @@ static int fl_set_geneve_opt(const struct nlattr *nla, struct fl_flow_key *key, + if (option_len > sizeof(struct geneve_opt)) + data_len = option_len - sizeof(struct geneve_opt); + ++ if (key->enc_opts.len > FLOW_DIS_TUN_OPTS_MAX - 4) ++ return -ERANGE; ++ + opt = (struct geneve_opt *)&key->enc_opts.data[key->enc_opts.len]; + memset(opt, 0xff, option_len); + opt->length = data_len / 4;