* [PATCH 0/3] netfilter fixes for net
@ 2013-06-17 19:34 Pablo Neira Ayuso
2013-06-17 19:34 ` [PATCH 1/3] netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr() Pablo Neira Ayuso
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Pablo Neira Ayuso @ 2013-06-17 19:34 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
Hi David,
The following patchset contains Netfilter fixes. They are targeted to the
TCP option targets, that have receive some scrinity in the last week. The
changes are:
* Fix TCPOPTSTRIP, it stopped working in the forward chain as tcp_hdr
uses skb->transport_header, and we cannot use that in the forwarding
case, from myself.
* Fix default IPv6 MSS in TCPMSS in case of absence of TCP MSS options,
from Phil Oester.
* Fix missing fragmentation handling again in TCPMSS, from Phil Oester.
You can pull these changes from:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git master
Thanks!
----------------------------------------------------------------
The following changes since commit a8241c63517ec0b900695daa9003cddc41c536a1:
ipvs: info leak in __ip_vs_get_dest_entries() (2013-06-10 14:53:00 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git master
for you to fetch changes up to b396966c4688522863572927cb30aa874b3ec504:
netfilter: xt_TCPMSS: Fix missing fragmentation handling (2013-06-12 11:06:19 +0200)
----------------------------------------------------------------
Pablo Neira Ayuso (1):
netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr()
Phil Oester (2):
netfilter: xt_TCPMSS: Fix IPv6 default MSS too
netfilter: xt_TCPMSS: Fix missing fragmentation handling
net/netfilter/xt_TCPMSS.c | 25 ++++++++++++++++++-------
net/netfilter/xt_TCPOPTSTRIP.c | 6 ++++--
2 files changed, 22 insertions(+), 9 deletions(-)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/3] netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr()
2013-06-17 19:34 [PATCH 0/3] netfilter fixes for net Pablo Neira Ayuso
@ 2013-06-17 19:34 ` Pablo Neira Ayuso
2013-06-17 20:30 ` Julian Anastasov
2013-06-17 19:34 ` [PATCH 2/3] netfilter: xt_TCPMSS: Fix IPv6 default MSS too Pablo Neira Ayuso
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Pablo Neira Ayuso @ 2013-06-17 19:34 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
In (bc6bcb5 netfilter: xt_TCPOPTSTRIP: fix possible mangling beyond
packet boundary), the use of tcp_hdr was introduced. However, we
cannot assume that skb->transport_header is set for non-local packets.
Cc: Florian Westphal <fw@strlen.de>
Reported-by: Phil Oester <kernel@linuxace.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/xt_TCPOPTSTRIP.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/net/netfilter/xt_TCPOPTSTRIP.c b/net/netfilter/xt_TCPOPTSTRIP.c
index 1eb1a44..b68fa19 100644
--- a/net/netfilter/xt_TCPOPTSTRIP.c
+++ b/net/netfilter/xt_TCPOPTSTRIP.c
@@ -48,11 +48,13 @@ tcpoptstrip_mangle_packet(struct sk_buff *skb,
return NF_DROP;
len = skb->len - tcphoff;
- if (len < (int)sizeof(struct tcphdr) ||
- tcp_hdr(skb)->doff * 4 > len)
+ if (len < (int)sizeof(struct tcphdr))
return NF_DROP;
tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff);
+ if (tcph->doff * 4 > len)
+ return NF_DROP;
+
opt = (u_int8_t *)tcph;
/*
--
1.7.10.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] netfilter: xt_TCPMSS: Fix IPv6 default MSS too
2013-06-17 19:34 [PATCH 0/3] netfilter fixes for net Pablo Neira Ayuso
2013-06-17 19:34 ` [PATCH 1/3] netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr() Pablo Neira Ayuso
@ 2013-06-17 19:34 ` Pablo Neira Ayuso
2013-06-17 19:34 ` [PATCH 3/3] netfilter: xt_TCPMSS: Fix missing fragmentation handling Pablo Neira Ayuso
2013-06-17 23:14 ` [PATCH 0/3] netfilter fixes for net David Miller
3 siblings, 0 replies; 7+ messages in thread
From: Pablo Neira Ayuso @ 2013-06-17 19:34 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
From: Phil Oester <kernel@linuxace.com>
As a followup to commit 409b545a ("netfilter: xt_TCPMSS: Fix violation
of RFC879 in absence of MSS option"), John Heffner points out that IPv6
has a higher MTU than IPv4, and thus a higher minimum MSS. Update TCPMSS
target to account for this, and update RFC comment.
While at it, point to more recent reference RFC1122 instead of RFC879.
Signed-off-by: Phil Oester <kernel@linuxace.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/xt_TCPMSS.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c
index afaebc7..6640a22 100644
--- a/net/netfilter/xt_TCPMSS.c
+++ b/net/netfilter/xt_TCPMSS.c
@@ -45,11 +45,12 @@ optlen(const u_int8_t *opt, unsigned int offset)
static int
tcpmss_mangle_packet(struct sk_buff *skb,
- const struct xt_tcpmss_info *info,
+ const struct xt_action_param *par,
unsigned int in_mtu,
unsigned int tcphoff,
unsigned int minlen)
{
+ const struct xt_tcpmss_info *info = par->targinfo;
struct tcphdr *tcph;
unsigned int tcplen, i;
__be16 oldval;
@@ -125,11 +126,17 @@ tcpmss_mangle_packet(struct sk_buff *skb,
skb_put(skb, TCPOLEN_MSS);
- /* RFC 879 states that the default MSS is 536 without specific
- * knowledge that the destination host is prepared to accept larger.
- * Since no MSS was provided, we MUST NOT set a value > 536.
+ /*
+ * IPv4: RFC 1122 states "If an MSS option is not received at
+ * connection setup, TCP MUST assume a default send MSS of 536".
+ * IPv6: RFC 2460 states IPv6 has a minimum MTU of 1280 and a minimum
+ * length IPv6 header of 60, ergo the default MSS value is 1220
+ * Since no MSS was provided, we must use the default values
*/
- newmss = min(newmss, (u16)536);
+ if (par->family == NFPROTO_IPV4)
+ newmss = min(newmss, (u16)536);
+ else
+ newmss = min(newmss, (u16)1220);
opt = (u_int8_t *)tcph + sizeof(struct tcphdr);
memmove(opt + TCPOLEN_MSS, opt, tcplen - sizeof(struct tcphdr));
@@ -188,7 +195,7 @@ tcpmss_tg4(struct sk_buff *skb, const struct xt_action_param *par)
__be16 newlen;
int ret;
- ret = tcpmss_mangle_packet(skb, par->targinfo,
+ ret = tcpmss_mangle_packet(skb, par,
tcpmss_reverse_mtu(skb, PF_INET),
iph->ihl * 4,
sizeof(*iph) + sizeof(struct tcphdr));
@@ -217,7 +224,7 @@ tcpmss_tg6(struct sk_buff *skb, const struct xt_action_param *par)
tcphoff = ipv6_skip_exthdr(skb, sizeof(*ipv6h), &nexthdr, &frag_off);
if (tcphoff < 0)
return NF_DROP;
- ret = tcpmss_mangle_packet(skb, par->targinfo,
+ ret = tcpmss_mangle_packet(skb, par,
tcpmss_reverse_mtu(skb, PF_INET6),
tcphoff,
sizeof(*ipv6h) + sizeof(struct tcphdr));
--
1.7.10.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] netfilter: xt_TCPMSS: Fix missing fragmentation handling
2013-06-17 19:34 [PATCH 0/3] netfilter fixes for net Pablo Neira Ayuso
2013-06-17 19:34 ` [PATCH 1/3] netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr() Pablo Neira Ayuso
2013-06-17 19:34 ` [PATCH 2/3] netfilter: xt_TCPMSS: Fix IPv6 default MSS too Pablo Neira Ayuso
@ 2013-06-17 19:34 ` Pablo Neira Ayuso
2013-06-17 21:03 ` Julian Anastasov
2013-06-17 23:14 ` [PATCH 0/3] netfilter fixes for net David Miller
3 siblings, 1 reply; 7+ messages in thread
From: Pablo Neira Ayuso @ 2013-06-17 19:34 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
From: Phil Oester <kernel@linuxace.com>
Similar to commit bc6bcb59 ("netfilter: xt_TCPOPTSTRIP: fix
possible mangling beyond packet boundary"), add safe fragment
handling to xt_TCPMSS.
Signed-off-by: Phil Oester <kernel@linuxace.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/xt_TCPMSS.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c
index 6640a22..7011c71 100644
--- a/net/netfilter/xt_TCPMSS.c
+++ b/net/netfilter/xt_TCPMSS.c
@@ -57,6 +57,10 @@ tcpmss_mangle_packet(struct sk_buff *skb,
u16 newmss;
u8 *opt;
+ /* This is a fragment, no TCP header is available */
+ if (par->fragoff != 0)
+ return XT_CONTINUE;
+
if (!skb_make_writable(skb, skb->len))
return -1;
--
1.7.10.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr()
2013-06-17 19:34 ` [PATCH 1/3] netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr() Pablo Neira Ayuso
@ 2013-06-17 20:30 ` Julian Anastasov
0 siblings, 0 replies; 7+ messages in thread
From: Julian Anastasov @ 2013-06-17 20:30 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: netfilter-devel, davem, netdev
Hello,
On Mon, 17 Jun 2013, Pablo Neira Ayuso wrote:
> In (bc6bcb5 netfilter: xt_TCPOPTSTRIP: fix possible mangling beyond
> packet boundary), the use of tcp_hdr was introduced. However, we
> cannot assume that skb->transport_header is set for non-local packets.
It is hidden also in tcp_hdrlen() which is used here.
> Cc: Florian Westphal <fw@strlen.de>
> Reported-by: Phil Oester <kernel@linuxace.com>
> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
> ---
> net/netfilter/xt_TCPOPTSTRIP.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/net/netfilter/xt_TCPOPTSTRIP.c b/net/netfilter/xt_TCPOPTSTRIP.c
> index 1eb1a44..b68fa19 100644
> --- a/net/netfilter/xt_TCPOPTSTRIP.c
> +++ b/net/netfilter/xt_TCPOPTSTRIP.c
> @@ -48,11 +48,13 @@ tcpoptstrip_mangle_packet(struct sk_buff *skb,
> return NF_DROP;
>
> len = skb->len - tcphoff;
> - if (len < (int)sizeof(struct tcphdr) ||
> - tcp_hdr(skb)->doff * 4 > len)
> + if (len < (int)sizeof(struct tcphdr))
> return NF_DROP;
>
> tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff);
> + if (tcph->doff * 4 > len)
We can save tcph->doff * 4 in a var and use it
instead of tcp_hdrlen.
BTW, optlen() touches opt[offset+1] unsafely
when i == tcp_hdrlen(skb) - 1.
> + return NF_DROP;
> +
> opt = (u_int8_t *)tcph;
>
> /*
> --
> 1.7.10.4
Regards
--
Julian Anastasov <ja@ssi.bg>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] netfilter: xt_TCPMSS: Fix missing fragmentation handling
2013-06-17 19:34 ` [PATCH 3/3] netfilter: xt_TCPMSS: Fix missing fragmentation handling Pablo Neira Ayuso
@ 2013-06-17 21:03 ` Julian Anastasov
0 siblings, 0 replies; 7+ messages in thread
From: Julian Anastasov @ 2013-06-17 21:03 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: netfilter-devel, davem, netdev
Hello,
On Mon, 17 Jun 2013, Pablo Neira Ayuso wrote:
> From: Phil Oester <kernel@linuxace.com>
>
> Similar to commit bc6bcb59 ("netfilter: xt_TCPOPTSTRIP: fix
> possible mangling beyond packet boundary"), add safe fragment
> handling to xt_TCPMSS.
>
> Signed-off-by: Phil Oester <kernel@linuxace.com>
> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
> ---
> net/netfilter/xt_TCPMSS.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c
> index 6640a22..7011c71 100644
> --- a/net/netfilter/xt_TCPMSS.c
> +++ b/net/netfilter/xt_TCPMSS.c
> @@ -57,6 +57,10 @@ tcpmss_mangle_packet(struct sk_buff *skb,
> u16 newmss;
> u8 *opt;
>
> + /* This is a fragment, no TCP header is available */
> + if (par->fragoff != 0)
> + return XT_CONTINUE;
> +
> if (!skb_make_writable(skb, skb->len))
> return -1;
This function needs the same check:
...
+ if (tcplen < (int)sizeof(struct tcphdr))
+ return -1;
+
/* Header cannot be larger than the packet */
if (tcplen < tcph->doff*4)
return -1;
but 'tcplen' should be changed to 'int' for
this to work.
Here we have the same optlen() problem but
I guess in both patches we always have something allocated
after the last byte in header (struct skb_shared_inf),
so crash is not possible.
Regards
--
Julian Anastasov <ja@ssi.bg>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/3] netfilter fixes for net
2013-06-17 19:34 [PATCH 0/3] netfilter fixes for net Pablo Neira Ayuso
` (2 preceding siblings ...)
2013-06-17 19:34 ` [PATCH 3/3] netfilter: xt_TCPMSS: Fix missing fragmentation handling Pablo Neira Ayuso
@ 2013-06-17 23:14 ` David Miller
3 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2013-06-17 23:14 UTC (permalink / raw)
To: pablo; +Cc: netfilter-devel, netdev
From: Pablo Neira Ayuso <pablo@netfilter.org>
Date: Mon, 17 Jun 2013 21:34:36 +0200
> The following patchset contains Netfilter fixes. They are targeted to the
> TCP option targets, that have receive some scrinity in the last week. The
> changes are:
>
> * Fix TCPOPTSTRIP, it stopped working in the forward chain as tcp_hdr
> uses skb->transport_header, and we cannot use that in the forwarding
> case, from myself.
>
> * Fix default IPv6 MSS in TCPMSS in case of absence of TCP MSS options,
> from Phil Oester.
>
> * Fix missing fragmentation handling again in TCPMSS, from Phil Oester.
>
> You can pull these changes from:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git master
Pulled, thanks Pablo.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-06-17 23:14 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-17 19:34 [PATCH 0/3] netfilter fixes for net Pablo Neira Ayuso
2013-06-17 19:34 ` [PATCH 1/3] netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr() Pablo Neira Ayuso
2013-06-17 20:30 ` Julian Anastasov
2013-06-17 19:34 ` [PATCH 2/3] netfilter: xt_TCPMSS: Fix IPv6 default MSS too Pablo Neira Ayuso
2013-06-17 19:34 ` [PATCH 3/3] netfilter: xt_TCPMSS: Fix missing fragmentation handling Pablo Neira Ayuso
2013-06-17 21:03 ` Julian Anastasov
2013-06-17 23:14 ` [PATCH 0/3] netfilter fixes for net David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).