Message ID | 20210903163020.13741-2-pablo@netfilter.org |
---|---|
State | New |
Headers | show |
Series | Netfilter fixes for net | expand |
Hello: This series was applied to netdev/net.git (refs/heads/master): On Fri, 3 Sep 2021 18:30:16 +0200 you wrote: > From: Pavel Skripkin <paskripkin@gmail.com> > > Syzbot hit use-after-free in nf_tables_dump_sets. The problem was in > missing lock protection for nft_ct_pcpu_template_refcnt. > > Before commit f102d66b335a ("netfilter: nf_tables: use dedicated > mutex to guard transactions") all transactions were serialized by global > mutex, but then global mutex was changed to local per netnamespace > commit_mutex. > > [...] Here is the summary with links: - [net,1/5] netfilter: nft_ct: protect nft_ct_pcpu_template_refcnt with mutex https://git.kernel.org/netdev/net/c/e3245a7b7b34 - [net,2/5] netfilter: conntrack: sanitize table size default settings https://git.kernel.org/netdev/net/c/d532bcd0b269 - [net,3/5] netfilter: conntrack: switch to siphash https://git.kernel.org/netdev/net/c/dd6d2910c5e0 - [net,4/5] netfilter: refuse insertion if chain has grown too large https://git.kernel.org/netdev/net/c/d7e7747ac5c2 - [net,5/5] netfilter: socket: icmp6: fix use-after-scope https://git.kernel.org/netdev/net/c/730affed24bf You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html
diff --git a/net/netfilter/nft_ct.c b/net/netfilter/nft_ct.c index 337e22d8b40b..99b1de14ff7e 100644 --- a/net/netfilter/nft_ct.c +++ b/net/netfilter/nft_ct.c @@ -41,6 +41,7 @@ struct nft_ct_helper_obj { #ifdef CONFIG_NF_CONNTRACK_ZONES static DEFINE_PER_CPU(struct nf_conn *, nft_ct_pcpu_template); static unsigned int nft_ct_pcpu_template_refcnt __read_mostly; +static DEFINE_MUTEX(nft_ct_pcpu_mutex); #endif static u64 nft_ct_get_eval_counter(const struct nf_conn_counter *c, @@ -525,8 +526,10 @@ static void __nft_ct_set_destroy(const struct nft_ctx *ctx, struct nft_ct *priv) #endif #ifdef CONFIG_NF_CONNTRACK_ZONES case NFT_CT_ZONE: + mutex_lock(&nft_ct_pcpu_mutex); if (--nft_ct_pcpu_template_refcnt == 0) nft_ct_tmpl_put_pcpu(); + mutex_unlock(&nft_ct_pcpu_mutex); break; #endif default: @@ -564,9 +567,13 @@ static int nft_ct_set_init(const struct nft_ctx *ctx, #endif #ifdef CONFIG_NF_CONNTRACK_ZONES case NFT_CT_ZONE: - if (!nft_ct_tmpl_alloc_pcpu()) + mutex_lock(&nft_ct_pcpu_mutex); + if (!nft_ct_tmpl_alloc_pcpu()) { + mutex_unlock(&nft_ct_pcpu_mutex); return -ENOMEM; + } nft_ct_pcpu_template_refcnt++; + mutex_unlock(&nft_ct_pcpu_mutex); len = sizeof(u16); break; #endif