All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again
@ 2020-05-25 11:47 Pablo Neira Ayuso
  2020-05-25 11:47 ` [PATCH nf,v2 2/2] netfilter: nfnetlink_cthelper: unbreak userspace helper support Pablo Neira Ayuso
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Pablo Neira Ayuso @ 2020-05-25 11:47 UTC (permalink / raw)
  To: netfilter-devel; +Cc: jacobraz, fw, mkubecek

Florian Westphal says:

"Problem is that after the helper hook was merged back into the confirm
one, the queueing itself occurs from the confirm hook, i.e. we queue
from the last netfilter callback in the hook-list.

Therefore, on return, the packet bypasses the confirm action and the
connection is never committed to the main conntrack table.

Therefore, on return, the packet bypasses the confirm action and the
connection is never committed to the main conntrack table.

To fix this there are several ways:
1. revert the 'Fixes' commit and have a extra helper hook again.
   Works, but has the drawback of adding another indirect call for
   everyone.

2. Special case this: split the hooks only when userspace helper
   gets added, so queueing occurs at a lower priority again,
   and normal nqueue reinject would eventually call the last hook.

3. Extend the existing nf_queue ct update hook to allow a forced
   confirmation (plus run the seqadj code).

This goes for 3)."

Fixes: 827318feb69cb ("netfilter: conntrack: remove helper hook again")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
v2: call __nf_conntrack_update() before ct helper confirmation.

 net/netfilter/nf_conntrack_core.c | 78 ++++++++++++++++++++++++++++---
 1 file changed, 72 insertions(+), 6 deletions(-)

diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index 1d57b95d3481..08e0c19f6b39 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -2016,22 +2016,18 @@ static void nf_conntrack_attach(struct sk_buff *nskb, const struct sk_buff *skb)
 	nf_conntrack_get(skb_nfct(nskb));
 }
 
-static int nf_conntrack_update(struct net *net, struct sk_buff *skb)
+static int __nf_conntrack_update(struct net *net, struct sk_buff *skb,
+				 struct nf_conn *ct)
 {
 	struct nf_conntrack_tuple_hash *h;
 	struct nf_conntrack_tuple tuple;
 	enum ip_conntrack_info ctinfo;
 	struct nf_nat_hook *nat_hook;
 	unsigned int status;
-	struct nf_conn *ct;
 	int dataoff;
 	u16 l3num;
 	u8 l4num;
 
-	ct = nf_ct_get(skb, &ctinfo);
-	if (!ct || nf_ct_is_confirmed(ct))
-		return 0;
-
 	l3num = nf_ct_l3num(ct);
 
 	dataoff = get_l4proto(skb, skb_network_offset(skb), l3num, &l4num);
@@ -2088,6 +2084,76 @@ static int nf_conntrack_update(struct net *net, struct sk_buff *skb)
 	return 0;
 }
 
+/* This packet is coming from userspace via nf_queue, complete the packet
+ * processing after the helper invocation in nf_confirm().
+ */
+static int nf_confirm_cthelper(struct sk_buff *skb, struct nf_conn *ct,
+			       enum ip_conntrack_info ctinfo)
+{
+	const struct nf_conntrack_helper *helper;
+	const struct nf_conn_help *help;
+	unsigned int protoff;
+
+	help = nfct_help(ct);
+	if (!help)
+		return 0;
+
+	helper = rcu_dereference(help->helper);
+	if (!(helper->flags & NF_CT_HELPER_F_USERSPACE))
+		return 0;
+
+	switch (nf_ct_l3num(ct)) {
+	case NFPROTO_IPV4:
+		protoff = skb_network_offset(skb) + ip_hdrlen(skb);
+		break;
+#if IS_ENABLED(CONFIG_IPV6)
+	case NFPROTO_IPV6: {
+		__be16 frag_off;
+		u8 pnum;
+
+		pnum = ipv6_hdr(skb)->nexthdr;
+		protoff = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &pnum,
+					   &frag_off);
+		if (protoff < 0 || (frag_off & htons(~0x7)) != 0)
+			return 0;
+		break;
+	}
+#endif
+	default:
+		return 0;
+	}
+
+	if (test_bit(IPS_SEQ_ADJUST_BIT, &ct->status) &&
+	    !nf_is_loopback_packet(skb)) {
+		if (!nf_ct_seq_adjust(skb, ct, ctinfo, protoff)) {
+			NF_CT_STAT_INC_ATOMIC(nf_ct_net(ct), drop);
+			return -1;
+		}
+	}
+
+	/* We've seen it coming out the other side: confirm it */
+	return nf_conntrack_confirm(skb) == NF_DROP ? - 1 : 0;
+}
+
+static int nf_conntrack_update(struct net *net, struct sk_buff *skb)
+{
+	enum ip_conntrack_info ctinfo;
+	struct nf_conn *ct;
+	int err;
+
+	ct = nf_ct_get(skb, &ctinfo);
+	if (!ct)
+		return 0;
+
+	if (!nf_ct_is_confirmed(ct)) {
+		err = __nf_conntrack_update(net, skb, ct);
+		if (err < 0)
+			return err;
+	}
+
+	return nf_confirm_cthelper(skb, ct, ctinfo);
+}
+
 static bool nf_conntrack_get_tuple_skb(struct nf_conntrack_tuple *dst_tuple,
 				       const struct sk_buff *skb)
 {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH nf,v2 2/2] netfilter: nfnetlink_cthelper: unbreak userspace helper support
  2020-05-25 11:47 [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again Pablo Neira Ayuso
@ 2020-05-25 11:47 ` Pablo Neira Ayuso
  2020-05-25 12:03 ` [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again Florian Westphal
  2020-05-29 22:49 ` [PATCH nf, v2 " kbuild test robot
  2 siblings, 0 replies; 4+ messages in thread
From: Pablo Neira Ayuso @ 2020-05-25 11:47 UTC (permalink / raw)
  To: netfilter-devel; +Cc: jacobraz, fw, mkubecek

Restore helper data size initialization and fix memcopy of the helper
data size.

Fixes: 157ffffeb5dc ("netfilter: nfnetlink_cthelper: reject too large userspace allocation requests")
Reviewed-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
v2: no changes.

 net/netfilter/nfnetlink_cthelper.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/net/netfilter/nfnetlink_cthelper.c b/net/netfilter/nfnetlink_cthelper.c
index a5f294aa8e4c..5b0d0a77379c 100644
--- a/net/netfilter/nfnetlink_cthelper.c
+++ b/net/netfilter/nfnetlink_cthelper.c
@@ -103,7 +103,7 @@ nfnl_cthelper_from_nlattr(struct nlattr *attr, struct nf_conn *ct)
 	if (help->helper->data_len == 0)
 		return -EINVAL;
 
-	nla_memcpy(help->data, nla_data(attr), sizeof(help->data));
+	nla_memcpy(help->data, attr, sizeof(help->data));
 	return 0;
 }
 
@@ -240,6 +240,7 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
 		ret = -ENOMEM;
 		goto err2;
 	}
+	helper->data_len = size;
 
 	helper->flags |= NF_CT_HELPER_F_USERSPACE;
 	memcpy(&helper->tuple, tuple, sizeof(struct nf_conntrack_tuple));
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again
  2020-05-25 11:47 [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again Pablo Neira Ayuso
  2020-05-25 11:47 ` [PATCH nf,v2 2/2] netfilter: nfnetlink_cthelper: unbreak userspace helper support Pablo Neira Ayuso
@ 2020-05-25 12:03 ` Florian Westphal
  2020-05-29 22:49 ` [PATCH nf, v2 " kbuild test robot
  2 siblings, 0 replies; 4+ messages in thread
From: Florian Westphal @ 2020-05-25 12:03 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel, jacobraz, fw, mkubecek

Pablo Neira Ayuso <pablo@netfilter.org> wrote:
> Florian Westphal says:
> 
> "Problem is that after the helper hook was merged back into the confirm
> one, the queueing itself occurs from the confirm hook, i.e. we queue
> from the last netfilter callback in the hook-list.
> 
> Therefore, on return, the packet bypasses the confirm action and the
> connection is never committed to the main conntrack table.
> 
> Therefore, on return, the packet bypasses the confirm action and the
> connection is never committed to the main conntrack table.
> 
> To fix this there are several ways:
> 1. revert the 'Fixes' commit and have a extra helper hook again.
>    Works, but has the drawback of adding another indirect call for
>    everyone.
> 
> 2. Special case this: split the hooks only when userspace helper
>    gets added, so queueing occurs at a lower priority again,
>    and normal nqueue reinject would eventually call the last hook.
> 
> 3. Extend the existing nf_queue ct update hook to allow a forced
>    confirmation (plus run the seqadj code).
> 
> This goes for 3)."
> 
> Fixes: 827318feb69cb ("netfilter: conntrack: remove helper hook again")
> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
> ---
> v2: call __nf_conntrack_update() before ct helper confirmation.

Reviewed-by: Florian Westphal <fw@strlen.de>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH nf, v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again
  2020-05-25 11:47 [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again Pablo Neira Ayuso
  2020-05-25 11:47 ` [PATCH nf,v2 2/2] netfilter: nfnetlink_cthelper: unbreak userspace helper support Pablo Neira Ayuso
  2020-05-25 12:03 ` [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again Florian Westphal
@ 2020-05-29 22:49 ` kbuild test robot
  2 siblings, 0 replies; 4+ messages in thread
From: kbuild test robot @ 2020-05-29 22:49 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 7482 bytes --]

Hi Pablo,

I love your patch! Perhaps something to improve:

[auto build test WARNING on nf/master]
[also build test WARNING on nf-next/master v5.7-rc7]
[cannot apply to next-20200529]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/Pablo-Neira-Ayuso/netfilter-conntrack-make-conntrack-userspace-helpers-work-again/20200525-194929
base:   https://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git master
config: x86_64-randconfig-a013-20200529 (attached as .config)
compiler: clang version 11.0.0 (https://github.com/llvm/llvm-project 2d068e534f1671459e1b135852c1b3c10502e929)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>

All warnings (new ones prefixed by >>, old ones prefixed by <<):

>> net/netfilter/nf_conntrack_core.c:2068:21: warning: variable 'ctinfo' is uninitialized when used here [-Wuninitialized]
nf_ct_set(skb, ct, ctinfo);
^~~~~~
net/netfilter/nf_conntrack_core.c:2024:2: note: variable 'ctinfo' is declared here
enum ip_conntrack_info ctinfo;
^
1 warning generated.

vim +/ctinfo +2068 net/netfilter/nf_conntrack_core.c

9fb9cbb1082d6b Yasuyuki Kozakai  2005-11-09  2018  
5d417ce363ff2d Pablo Neira Ayuso 2020-05-25  2019  static int __nf_conntrack_update(struct net *net, struct sk_buff *skb,
5d417ce363ff2d Pablo Neira Ayuso 2020-05-25  2020  				 struct nf_conn *ct)
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2021  {
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2022  	struct nf_conntrack_tuple_hash *h;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2023  	struct nf_conntrack_tuple tuple;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2024  	enum ip_conntrack_info ctinfo;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2025  	struct nf_nat_hook *nat_hook;
6816d931cab009 Florian Westphal  2018-06-29  2026  	unsigned int status;
6816d931cab009 Florian Westphal  2018-06-29  2027  	int dataoff;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2028  	u16 l3num;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2029  	u8 l4num;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2030  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2031  	l3num = nf_ct_l3num(ct);
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2032  
6816d931cab009 Florian Westphal  2018-06-29  2033  	dataoff = get_l4proto(skb, skb_network_offset(skb), l3num, &l4num);
6816d931cab009 Florian Westphal  2018-06-29  2034  	if (dataoff <= 0)
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2035  		return -1;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2036  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2037  	if (!nf_ct_get_tuple(skb, skb_network_offset(skb), dataoff, l3num,
303e0c5589592e Florian Westphal  2019-01-15  2038  			     l4num, net, &tuple))
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2039  		return -1;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2040  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2041  	if (ct->status & IPS_SRC_NAT) {
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2042  		memcpy(tuple.src.u3.all,
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2043  		       ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.all,
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2044  		       sizeof(tuple.src.u3.all));
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2045  		tuple.src.u.all =
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2046  			ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.all;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2047  	}
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2048  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2049  	if (ct->status & IPS_DST_NAT) {
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2050  		memcpy(tuple.dst.u3.all,
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2051  		       ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.all,
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2052  		       sizeof(tuple.dst.u3.all));
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2053  		tuple.dst.u.all =
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2054  			ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u.all;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2055  	}
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2056  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2057  	h = nf_conntrack_find_get(net, nf_ct_zone(ct), &tuple);
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2058  	if (!h)
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2059  		return 0;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2060  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2061  	/* Store status bits of the conntrack that is clashing to re-do NAT
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2062  	 * mangling according to what it has been done already to this packet.
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2063  	 */
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2064  	status = ct->status;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2065  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2066  	nf_ct_put(ct);
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2067  	ct = nf_ct_tuplehash_to_ctrack(h);
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23 @2068  	nf_ct_set(skb, ct, ctinfo);
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2069  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2070  	nat_hook = rcu_dereference(nf_nat_hook);
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2071  	if (!nat_hook)
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2072  		return 0;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2073  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2074  	if (status & IPS_SRC_NAT &&
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2075  	    nat_hook->manip_pkt(skb, ct, NF_NAT_MANIP_SRC,
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2076  				IP_CT_DIR_ORIGINAL) == NF_DROP)
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2077  		return -1;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2078  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2079  	if (status & IPS_DST_NAT &&
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2080  	    nat_hook->manip_pkt(skb, ct, NF_NAT_MANIP_DST,
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2081  				IP_CT_DIR_ORIGINAL) == NF_DROP)
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2082  		return -1;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2083  
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2084  	return 0;
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2085  }
368982cd7d1bd4 Pablo Neira Ayuso 2018-05-23  2086  

:::::: The code at line 2068 was first introduced by commit
:::::: 368982cd7d1bd41cd39049c794990aca3770db44 netfilter: nfnetlink_queue: resolve clash for unconfirmed conntracks

:::::: TO: Pablo Neira Ayuso <pablo@netfilter.org>
:::::: CC: Pablo Neira Ayuso <pablo@netfilter.org>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 37687 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-05-29 22:49 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-05-25 11:47 [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again Pablo Neira Ayuso
2020-05-25 11:47 ` [PATCH nf,v2 2/2] netfilter: nfnetlink_cthelper: unbreak userspace helper support Pablo Neira Ayuso
2020-05-25 12:03 ` [PATCH nf,v2 1/2] netfilter: conntrack: make conntrack userspace helpers work again Florian Westphal
2020-05-29 22:49 ` [PATCH nf, v2 " kbuild test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.