From patchwork Mon Jul 1 17:02:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bethany Jamison X-Patchwork-Id: 1954855 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=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (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 4WCXQy6Yzvz1xpf for ; Tue, 2 Jul 2024 03:02:34 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1sOKQ2-0002Iu-LR; Mon, 01 Jul 2024 17:02:22 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1sOKQ0-0002IZ-Pb for kernel-team@lists.ubuntu.com; Mon, 01 Jul 2024 17:02:20 +0000 Received: from mail-il1-f200.google.com (mail-il1-f200.google.com [209.85.166.200]) (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-internal-1.canonical.com (Postfix) with ESMTPS id 4D61D3FE1F for ; Mon, 1 Jul 2024 17:02:20 +0000 (UTC) Received: by mail-il1-f200.google.com with SMTP id e9e14a558f8ab-375d2ddeffbso36744845ab.0 for ; Mon, 01 Jul 2024 10:02:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719853339; x=1720458139; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AAGAqSsdu1oBI4fJHLvzrBYwjGjJlchN0V4fMcnlrJc=; b=CTd0bWaWJPz9zovvFkkr2wCMmKPmKZjDd5I2c5S6kAXN4bu/GjLNgPA8d4CynPFpRh 0eriE0WG6vacRHVa0+5WdIhlRan0gsjU5Mwx88HxiGbsUYV5dXbSjrz1IotHNeC18TS6 zx/zivXNkLbc0p1q1hrRPkZyGfWfpjmekZoKbmGetSoHNNDxxg7PspZ8PPv/w2Zc/DHj HtmSClhDzSfLwdslrtUUcdj3aIA1Mj6DwKBJR6YccsTzcJCYMZwuJQDyOG9RaVMPgXbz DeRQDhm05TP169hDRhwAD4u+nt+N8IEKbNNHDic0DaR/I9ipSjuau8+YNGxjHtEzX/ZF nRpg== X-Gm-Message-State: AOJu0YwbU2mJY2rvEzVUlOIXn19VtTwPMWX6jZ97bPiKjmXV1b9o43Lx CMsCwHKSaYlRFGqdfr8mDpBkm9qBYrHKECc0b64Xvosn4PKitkiUAHlXRRjU+pXy1g47CcC12rn hDsefKTP3d0fTny3QdeD4GYPzvHLJDwqW3k56JTbrHU13cT4xU9AE0Uh8eGVQEnrYuQaTc8sM5F dSqDFnctv9gQ== X-Received: by 2002:a05:6e02:1a6d:b0:375:d6c7:e24 with SMTP id e9e14a558f8ab-37cd2bee11bmr82674965ab.27.1719853338661; Mon, 01 Jul 2024 10:02:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE2zuPHUXoPBgX5iveKonVpUtxWQWA+5/zE8lCoYj4aY8FVf3KUsljkFPUhJfu4kOvRk+2CrA== X-Received: by 2002:a05:6e02:1a6d:b0:375:d6c7:e24 with SMTP id e9e14a558f8ab-37cd2bee11bmr82674785ab.27.1719853338312; Mon, 01 Jul 2024 10:02:18 -0700 (PDT) Received: from smtp.gmail.com (167-248-51-36.oa02.lnk04.ne.dynamic.allophone.net. [167.248.51.36]) by smtp.gmail.com with ESMTPSA id e9e14a558f8ab-37ad29814d9sm19744055ab.21.2024.07.01.10.02.17 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Jul 2024 10:02:18 -0700 (PDT) From: Bethany Jamison To: kernel-team@lists.ubuntu.com Subject: [SRU][J][PATCH v2 2/3] netfilter: nft_set_pipapo: walk over current view on netlink dump Date: Mon, 1 Jul 2024 12:02:14 -0500 Message-Id: <20240701170215.17623-3-bethany.jamison@canonical.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240701170215.17623-1-bethany.jamison@canonical.com> References: <20240701170215.17623-1-bethany.jamison@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: Pablo Neira Ayuso The generation mask can be updated while netlink dump is in progress. The pipapo set backend walk iterator cannot rely on it to infer what view of the datastructure is to be used. Add notation to specify if user wants to read/update the set. Based on patch from Florian Westphal. Fixes: 2b84e215f874 ("netfilter: nft_set_pipapo: .walk does not deal with generations") Signed-off-by: Pablo Neira Ayuso (backported from commit 29b359cf6d95fd60730533f7f10464e95bd17c73) [bjamison: context conflict with neighboring function defined in h file, fix change applied as given] CVE-2024-27017 Signed-off-by: Bethany Jamison --- include/net/netfilter/nf_tables.h | 13 +++++++++++++ net/netfilter/nf_tables_api.c | 6 ++++++ net/netfilter/nft_set_pipapo.c | 5 +++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index 518442bf13515..23ac406a336fe 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h @@ -283,9 +283,22 @@ struct nft_set_elem { void *priv; }; +/** + * enum nft_iter_type - nftables set iterator type + * + * @NFT_ITER_READ: read-only iteration over set elements + * @NFT_ITER_UPDATE: iteration under mutex to update set element state + */ +enum nft_iter_type { + NFT_ITER_UNSPEC, + NFT_ITER_READ, + NFT_ITER_UPDATE, +}; + struct nft_set; struct nft_set_iter { u8 genmask; + enum nft_iter_type type:8; unsigned int count; unsigned int skip; int err; diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 70cab61ead086..0973bf20ca011 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -628,6 +628,7 @@ static void nft_map_deactivate(const struct nft_ctx *ctx, struct nft_set *set) { struct nft_set_iter iter = { .genmask = nft_genmask_next(ctx->net), + .type = NFT_ITER_UPDATE, .fn = nft_mapelem_deactivate, }; @@ -5062,6 +5063,7 @@ int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set, } iter.genmask = nft_genmask_next(ctx->net); + iter.type = NFT_ITER_UPDATE; iter.skip = 0; iter.count = 0; iter.err = 0; @@ -5137,6 +5139,7 @@ static void nft_map_activate(const struct nft_ctx *ctx, struct nft_set *set) { struct nft_set_iter iter = { .genmask = nft_genmask_next(ctx->net), + .type = NFT_ITER_UPDATE, .fn = nft_mapelem_activate, }; @@ -5494,6 +5497,7 @@ static int nf_tables_dump_set(struct sk_buff *skb, struct netlink_callback *cb) args.cb = cb; args.skb = skb; args.iter.genmask = nft_genmask_cur(net); + args.iter.type = NFT_ITER_READ; args.iter.skip = cb->args[0]; args.iter.count = 0; args.iter.err = 0; @@ -6819,6 +6823,7 @@ static int nft_set_flush(struct nft_ctx *ctx, struct nft_set *set, u8 genmask) { struct nft_set_iter iter = { .genmask = genmask, + .type = NFT_ITER_UPDATE, .fn = nft_setelem_flush, }; @@ -10113,6 +10118,7 @@ static int nf_tables_check_loops(const struct nft_ctx *ctx, continue; iter.genmask = nft_genmask_next(ctx->net); + iter.type = NFT_ITER_UPDATE; iter.skip = 0; iter.count = 0; iter.err = 0; diff --git a/net/netfilter/nft_set_pipapo.c b/net/netfilter/nft_set_pipapo.c index cde08578722ef..56250c12aefa7 100644 --- a/net/netfilter/nft_set_pipapo.c +++ b/net/netfilter/nft_set_pipapo.c @@ -2038,13 +2038,14 @@ static void nft_pipapo_walk(const struct nft_ctx *ctx, struct nft_set *set, struct nft_set_iter *iter) { struct nft_pipapo *priv = nft_set_priv(set); - struct net *net = read_pnet(&set->net); const struct nft_pipapo_match *m; const struct nft_pipapo_field *f; int i, r; + WARN_ON_ONCE(iter->type == NFT_ITER_UNSPEC); + rcu_read_lock(); - if (iter->genmask == nft_genmask_cur(net)) + if (iter->type == NFT_ITER_READ) m = rcu_dereference(priv->match); else m = priv->clone;