From patchwork Mon Jun 12 17:42:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thadeu Lima de Souza Cascardo X-Patchwork-Id: 1794011 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=FT21ctZH; dkim-atps=neutral Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4QfzZN1Sylz20XR for ; Tue, 13 Jun 2023 03:43:56 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1q8la2-0002Kh-TY; Mon, 12 Jun 2023 17:43:50 +0000 Received: from smtp-relay-canonical-0.internal ([10.131.114.83] helo=smtp-relay-canonical-0.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1q8la1-0002KW-HC for kernel-team@lists.ubuntu.com; Mon, 12 Jun 2023 17:43:49 +0000 Received: from localhost.localdomain (1.general.cascardo.us.vpn [10.172.70.58]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-canonical-0.canonical.com (Postfix) with ESMTPSA id 45DC53F256 for ; Mon, 12 Jun 2023 17:43:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1686591829; bh=L48UJWprVrZwN61OCqqWeF9XeZSHz9MNbdTuulSckz0=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FT21ctZHWqaZN+r0u/k1mzJQzyh6tb1Y4wjvAT+k2RLsQqQMGOKoe/RuFLpRRFaVk DF+kn2YjwvQo9ZMUQ+wL4X+hZb9a6WbepG7BnYyv3ZPw5y4qbd0s63G+URqvBYNJsx x0ZS32BYR0lFK2RWwH/KvdZ9ZxdAz7fk5GXz7Y6rBn/QOH2zDl9brqm1vehf0HDCcx WYYV8TCmj30DJiAh8x9CegK1Mqxmnd7Q39FeczW7OzfgdtEHZqk5LNEand1oQCSLaU YMlYBELwsAIrIlB397SKo6biVavMi6E1KAxkRC3iJI81BnNYtEVTWtjS5J94c7XhVI XJhETjLpM8VwQ== From: Thadeu Lima de Souza Cascardo To: kernel-team@lists.ubuntu.com Subject: [Focal, Jammy, OEM-5.17, Kinetic, OEM-6.0, OEM-6.1, Lunar 1/1] net/sched: flower: fix possible OOB write in fl_set_geneve_opt() Date: Mon, 12 Jun 2023 14:42:12 -0300 Message-Id: <20230612174212.3173660-2-cascardo@canonical.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230612174212.3173660-1-cascardo@canonical.com> References: <20230612174212.3173660-1-cascardo@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Hangyu Hua 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 --- 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 007fbc199352..63f53aa8460a 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c @@ -870,6 +870,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;