backport "net/sched: flower: fix possible OOB write in fl_set_geneve_opt()"
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
		
							parent
							
								
									8d9ca43bc9
								
							
						
					
					
						commit
						9dc16d8b59
					
				@ -0,0 +1,41 @@
 | 
			
		||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Hangyu Hua <hbh25y@gmail.com>
 | 
			
		||||
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 <hbh25y@gmail.com>
 | 
			
		||||
Reviewed-by: Simon Horman <simon.horman@corigine.com>
 | 
			
		||||
Reviewed-by: Pieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
 | 
			
		||||
Link: https://lore.kernel.org/r/20230531102805.27090-1-hbh25y@gmail.com
 | 
			
		||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
 | 
			
		||||
(cherry picked from commit 4d56304e5827c8cc8cc18c75343d283af7c4825c)
 | 
			
		||||
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
 | 
			
		||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
 | 
			
		||||
---
 | 
			
		||||
 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;
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user