Commit Message

From: Eric Dumazet <edumazet@google.com>
In commit 96e0bf4b5193d (tcp: Discard segments that ack data not yet
sent) John Dykstra enforced a check against ack sequences.
In commit 354e4aa391ed5 (tcp: RFC 5961 5.2 Blind Data Injection Attack
Mitigation) I added more safety tests.
But we missed fact that these tests are not performed if ACK bit is
not set.
RFC 793 3.9 mandates TCP should drop a frame without ACK flag set.
" fifth check the ACK field,
if the ACK bit is off drop the segment and return"
Not doing so permits an attacker to only guess an acceptable sequence
number, evading stronger checks.
Many thanks to Zhiyun Qian for bringing this issue to our attention.
See : http://web.eecs.umich.edu/~zhiyunq/pub/ccs12_TCP_sequence_number_inference.pdf
Reported-by: Zhiyun Qian <zhiyunq@umich.edu>
Signed-off-by: Eric Dumazet <edumazet@google.com>Acked-by: Nandita Dukkipati <nanditad@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: John Dykstra <john.dykstra1@gmail.com>
---
Notes
- I left a "if (true)" block that I'll remove in a cleanup patch in
linux-3.9, to permit this patch being easily back-ported to stable
branches.
- A followup patch will be sent (in net-next) to have stronger checks
before sending dupack
net/ipv4/tcp_input.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Comments

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Wed, 26 Dec 2012 09:10:01 -0800
> @@ -5540,6 +5540,9 @@ no_ack:> }> > slow_path:> + if (!th->ack)> + goto discard;
One too many tabs there on that last line :-)
> +> if (len < (th->doff << 2) || tcp_checksum_complete_user(sk, skb))> goto csum_error;> > @@ -5551,7 +5554,7 @@ slow_path:
Also, I would say that this checksum test should come first, because
that takes priority since you could be testing the ACK bit of a
corrupted packet.
Better to get the statistic bump on the bad checksum then a silent
drop on the ACK being cleared.
> @@ -5984,11 +5987,15 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,> if (tcp_check_req(sk, skb, req, NULL, true) == NULL)> goto discard;> }> +> + if (!th->ack)> + goto discard;> +
And that is effectively what is going to happen in this case since
the caller has already done the checksum checks.
Thanks.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html