Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp4642155ybl; Wed, 22 Jan 2020 01:53:24 -0800 (PST) X-Google-Smtp-Source: APXvYqxTxdwchvySPvIGGv1FJjv3uxeAdSmw80WSwa1OzWnykSlMWBDrgy7xtoRAYge0LpPHajee X-Received: by 2002:a9d:4c81:: with SMTP id m1mr6503105otf.31.1579686804663; Wed, 22 Jan 2020 01:53:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579686804; cv=none; d=google.com; s=arc-20160816; b=RMxVdmmUlzNT7VkRGqds/K/rY2GpUEczqTWiPA2USakEvUnKJVAbfVoCPk8FhXkk/N 0zBtMbV9zNCIkHXPJQk4n4oXiJhiLU9c2LVaBA/jvbvMiXE63W3ZOn5qmjhE/zomh0dL KmkTvOq0ecfaloBJCIoD6AaBXXLEpp1piRQ2S5xGxtKthJ1iEn4n3a0bcH3wShHENqdx pQQb15h8TOD8seX8ZX+riZHtv5dkOn57Ab1ZDs1ulICVfy8l+GUMHTt7pmRqwg+Mmej8 /Fbqdr9+4SVw79hOKfBln6q1xU+MqGvqencqvHEpL+jWcH5YYcmkETeDsE2hx4X/My0F Uycw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=WP/XiYIZK09uMglzTwXfl3CqorJbHLa9o09AOQKAc7o=; b=VGFzGO3r0Lv+ARIj4uj3NvIBMulfawIgn1XQsWm3fkHHMpWcqdEMmsKLTx1I3pADqa OD0Pvgd7jsC0m9LULWXmMi6zAPGuViXpaYjs3WgiweK0xpo5bVgUAodaPn8gtb9G7+wh 85cxeVszX06x8x7pe5jCwvpq++anlR2/ZaE9o6qGL7MWm6D0yTAsnwRvn3LJvsqe0Jbm 6BifmL7QCc8omtwGiyfFPkevx7OJWVFK7NtoBNS5vo7WNxKoj5m1teHUAUTpyzDwLjuZ K2TvgZ3JRxttJnUCD9a6ntzIkWythTVky6Zz08uKqKm396oOHJujSFe46JdgE9xPnMsC KZTQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=vXa3wiHN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e3si24627947otp.286.2020.01.22.01.53.13; Wed, 22 Jan 2020 01:53:24 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=vXa3wiHN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731669AbgAVJwR (ORCPT + 99 others); Wed, 22 Jan 2020 04:52:17 -0500 Received: from mail.kernel.org ([198.145.29.99]:51936 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731815AbgAVJg2 (ORCPT ); Wed, 22 Jan 2020 04:36:28 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DEEA720704; Wed, 22 Jan 2020 09:36:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579685787; bh=oW/nJSRnqwL4LFxYNywdLrAnqSiWfV1hujPdnbzAnjE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vXa3wiHNYlO3beDhzq4pB1PqqcU6d80Hb9zUoGG3fWgGA95H5BKP9yzuFqfk7Q94e 5aZzBDP0iCbWqp0MV/hA1bfUO9dwAijhcoQMRZAyfShEx+Tp4hlKxM1VLeeoGWHnFs NlrWgHATr4n4sefy9K8qBWrmIbE7Ayi8puKcWsHU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, syzbot+91bdd8eece0f6629ec8b@syzkaller.appspotmail.com, Florian Westphal , Pablo Neira Ayuso Subject: [PATCH 4.9 79/97] netfilter: arp_tables: init netns pointer in xt_tgdtor_param struct Date: Wed, 22 Jan 2020 10:29:23 +0100 Message-Id: <20200122092809.057782737@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200122092755.678349497@linuxfoundation.org> References: <20200122092755.678349497@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Florian Westphal commit 212e7f56605ef9688d0846db60c6c6ec06544095 upstream. An earlier commit (1b789577f655060d98d20e, "netfilter: arp_tables: init netns pointer in xt_tgchk_param struct") fixed missing net initialization for arptables, but turns out it was incomplete. We can get a very similar struct net NULL deref during error unwinding: general protection fault: 0000 [#1] PREEMPT SMP KASAN RIP: 0010:xt_rateest_put+0xa1/0x440 net/netfilter/xt_RATEEST.c:77 xt_rateest_tg_destroy+0x72/0xa0 net/netfilter/xt_RATEEST.c:175 cleanup_entry net/ipv4/netfilter/arp_tables.c:509 [inline] translate_table+0x11f4/0x1d80 net/ipv4/netfilter/arp_tables.c:587 do_replace net/ipv4/netfilter/arp_tables.c:981 [inline] do_arpt_set_ctl+0x317/0x650 net/ipv4/netfilter/arp_tables.c:1461 Also init the netns pointer in xt_tgdtor_param struct. Fixes: add67461240c1d ("netfilter: add struct net * to target parameters") Reported-by: syzbot+91bdd8eece0f6629ec8b@syzkaller.appspotmail.com Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Greg Kroah-Hartman --- net/ipv4/netfilter/arp_tables.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -515,12 +515,13 @@ static inline int check_entry_size_and_h return 0; } -static inline void cleanup_entry(struct arpt_entry *e) +static void cleanup_entry(struct arpt_entry *e, struct net *net) { struct xt_tgdtor_param par; struct xt_entry_target *t; t = arpt_get_target(e); + par.net = net; par.target = t->u.kernel.target; par.targinfo = t->data; par.family = NFPROTO_ARP; @@ -612,7 +613,7 @@ static int translate_table(struct net *n xt_entry_foreach(iter, entry0, newinfo->size) { if (i-- == 0) break; - cleanup_entry(iter); + cleanup_entry(iter, net); } return ret; } @@ -939,7 +940,7 @@ static int __do_replace(struct net *net, /* Decrease module usage counts and free resource */ loc_cpu_old_entry = oldinfo->entries; xt_entry_foreach(iter, loc_cpu_old_entry, oldinfo->size) - cleanup_entry(iter); + cleanup_entry(iter, net); xt_free_table_info(oldinfo); if (copy_to_user(counters_ptr, counters, @@ -1003,7 +1004,7 @@ static int do_replace(struct net *net, c free_newinfo_untrans: xt_entry_foreach(iter, loc_cpu_entry, newinfo->size) - cleanup_entry(iter); + cleanup_entry(iter, net); free_newinfo: xt_free_table_info(newinfo); return ret; @@ -1300,7 +1301,7 @@ static int compat_do_replace(struct net free_newinfo_untrans: xt_entry_foreach(iter, loc_cpu_entry, newinfo->size) - cleanup_entry(iter); + cleanup_entry(iter, net); free_newinfo: xt_free_table_info(newinfo); return ret; @@ -1527,7 +1528,7 @@ static int do_arpt_get_ctl(struct sock * return ret; } -static void __arpt_unregister_table(struct xt_table *table) +static void __arpt_unregister_table(struct net *net, struct xt_table *table) { struct xt_table_info *private; void *loc_cpu_entry; @@ -1539,7 +1540,7 @@ static void __arpt_unregister_table(stru /* Decrease module usage counts and free resources */ loc_cpu_entry = private->entries; xt_entry_foreach(iter, loc_cpu_entry, private->size) - cleanup_entry(iter); + cleanup_entry(iter, net); if (private->number > private->initial_entries) module_put(table_owner); xt_free_table_info(private); @@ -1579,7 +1580,7 @@ int arpt_register_table(struct net *net, ret = nf_register_net_hooks(net, ops, hweight32(table->valid_hooks)); if (ret != 0) { - __arpt_unregister_table(new_table); + __arpt_unregister_table(net, new_table); *res = NULL; } @@ -1594,7 +1595,7 @@ void arpt_unregister_table(struct net *n const struct nf_hook_ops *ops) { nf_unregister_net_hooks(net, ops, hweight32(table->valid_hooks)); - __arpt_unregister_table(table); + __arpt_unregister_table(net, table); } /* The built-in targets: standard (NULL) and error. */