From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B50F31E0DD8; Mon, 2 Jun 2025 14:21:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748874091; cv=none; b=H02F3IamJTYQt7Db8GORLRJoiiAyNj0/6s35ieY4BeeZBTnHfi7L8dCqPOcoggMakCB6X7muMm8jrcOvB2JqvTNBgAHnL2ikfCa6br8XXamOAt4T5NbIfI4mehym+KTSxB7+F06nlB+qkn1/YFIveKPId7Pm2TD9mtvS/G+8wxA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748874091; c=relaxed/simple; bh=Gw1Zk3T4KF8VZJanfsYbcYpPNCQnaybOlryRGnp3Aoo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d5PXn0uAXsxnhb8WyTrmrwZ07If2wTupx/F1BbD8+DwwORd7arjXRxthg2grp5rehqSHyqJtSiAR/Y7/QdaBP3flD7fLTmaal1MBsseNMCX+VzP9VhOfU82mvmIrDoVgBHtyXwREFuqK9LpCUH4qRDpfps6+PJwXZh4KkfOK33Q= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b=ODr56mNY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b="ODr56mNY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0EE89C4CEEB; Mon, 2 Jun 2025 14:21:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1748874091; bh=Gw1Zk3T4KF8VZJanfsYbcYpPNCQnaybOlryRGnp3Aoo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ODr56mNYMN2svnq/cyuXAdTelkEk1rm4nIQOmjfFZlfzn+rDuQfx0nRcs09TZg2nN uPtUg8dlm0YlIAu1akACkTtkpkL1h8ynavDtDiqqy9bMCERSefHi4suQz4iwL4DEdo CMb2YQpLyVKMxVKOP0HvhQi3kQqj6tOUkh879OAE= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Paul Chaignon , Louis DeLosSantos , Steffen Klassert , Sasha Levin Subject: [PATCH 6.6 337/444] xfrm: Sanitize marks before insert Date: Mon, 2 Jun 2025 15:46:41 +0200 Message-ID: <20250602134354.606753659@linuxfoundation.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250602134340.906731340@linuxfoundation.org> References: <20250602134340.906731340@linuxfoundation.org> User-Agent: quilt/0.68 X-stable: review X-Patchwork-Hint: ignore Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.6-stable review patch. If anyone has any objections, please let me know. ------------------ From: Paul Chaignon [ Upstream commit 0b91fda3a1f044141e1e615456ff62508c32b202 ] Prior to this patch, the mark is sanitized (applying the state's mask to the state's value) only on inserts when checking if a conflicting XFRM state or policy exists. We discovered in Cilium that this same sanitization does not occur in the hot-path __xfrm_state_lookup. In the hot-path, the sk_buff's mark is simply compared to the state's value: if ((mark & x->mark.m) != x->mark.v) continue; Therefore, users can define unsanitized marks (ex. 0xf42/0xf00) which will never match any packet. This commit updates __xfrm_state_insert and xfrm_policy_insert to store the sanitized marks, thus removing this footgun. This has the side effect of changing the ip output, as the returned mark will have the mask applied to it when printed. Fixes: 3d6acfa7641f ("xfrm: SA lookups with mark") Signed-off-by: Paul Chaignon Signed-off-by: Louis DeLosSantos Co-developed-by: Louis DeLosSantos Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- net/xfrm/xfrm_policy.c | 3 +++ net/xfrm/xfrm_state.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 68b3f9e7edffd..2edb0f868c573 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -1603,6 +1603,9 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl) struct xfrm_policy *delpol; struct hlist_head *chain; + /* Sanitize mark before store */ + policy->mark.v &= policy->mark.m; + spin_lock_bh(&net->xfrm.xfrm_policy_lock); chain = policy_hash_bysel(net, &policy->selector, policy->family, dir); if (chain) diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 7222ba50390d6..86029cf5358c7 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -1475,6 +1475,9 @@ static void __xfrm_state_insert(struct xfrm_state *x) list_add(&x->km.all, &net->xfrm.state_all); + /* Sanitize mark before store */ + x->mark.v &= x->mark.m; + h = xfrm_dst_hash(net, &x->id.daddr, &x->props.saddr, x->props.reqid, x->props.family); XFRM_STATE_INSERT(bydst, &x->bydst, net->xfrm.state_bydst + h, -- 2.39.5