From: <abe...@us...> - 2016-08-12 16:23:18
|
Revision: 7795 http://sourceforge.net/p/astlinux/code/7795 Author: abelbeck Date: 2016-08-12 16:23:17 +0000 (Fri, 12 Aug 2016) Log Message: ----------- linux kernel, security fix: CVE-2016-5696 - Off-path TCP attack, make challenge acks less predictable Ref: Ref: https://git.kernel.org/cgit/linux/kernel/git/bwh/linux-stable-queue.git/plain/queue-3.2/tcp-make-challenge-acks-less-predictable.patch?id=4da02c7fa853f92087e972f6b821bc7b7f7d4a99 Added Paths: ----------- branches/1.0/project/astlinux/kernel-patches/linux-800-tcp-make-challenge-acks-less-predictable.patch Added: branches/1.0/project/astlinux/kernel-patches/linux-800-tcp-make-challenge-acks-less-predictable.patch =================================================================== --- branches/1.0/project/astlinux/kernel-patches/linux-800-tcp-make-challenge-acks-less-predictable.patch (rev 0) +++ branches/1.0/project/astlinux/kernel-patches/linux-800-tcp-make-challenge-acks-less-predictable.patch 2016-08-12 16:23:17 UTC (rev 7795) @@ -0,0 +1,76 @@ +From: Eric Dumazet <edu...@go...> +Date: Sun, 10 Jul 2016 10:04:02 +0200 +Subject: tcp: make challenge acks less predictable + +commit 75ff39ccc1bd5d3c455b6822ab09e533c551f758 upstream. + +Yue Cao claims that current host rate limiting of challenge ACKS +(RFC 5961) could leak enough information to allow a patient attacker +to hijack TCP sessions. He will soon provide details in an academic +paper. + +This patch increases the default limit from 100 to 1000, and adds +some randomization so that the attacker can no longer hijack +sessions without spending a considerable amount of probes. + +Based on initial analysis and patch from Linus. + +Note that we also have per socket rate limiting, so it is tempting +to remove the host limit in the future. + +v2: randomize the count of challenge acks per second, not the period. + +Fixes: 282f23c6ee34 ("tcp: implement RFC 5961 3.2") +Reported-by: Yue Cao <yc...@uc...> +Signed-off-by: Eric Dumazet <edu...@go...> +Suggested-by: Linus Torvalds <tor...@li...> +Cc: Yuchung Cheng <yc...@go...> +Cc: Neal Cardwell <nca...@go...> +Acked-by: Neal Cardwell <nca...@go...> +Acked-by: Yuchung Cheng <yc...@go...> +Signed-off-by: David S. Miller <da...@da...> +[bwh: Backported to 3.2: + - Adjust context + - Use ACCESS_ONCE() instead of {READ,WRITE}_ONCE() + - Open-code prandom_u32_max()] +Signed-off-by: Ben Hutchings <be...@de...> +--- + net/ipv4/tcp_input.c | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -87,7 +87,7 @@ int sysctl_tcp_adv_win_scale __read_most + EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); + + /* rfc5961 challenge ack rate limiting */ +-int sysctl_tcp_challenge_ack_limit = 100; ++int sysctl_tcp_challenge_ack_limit = 1000; + + int sysctl_tcp_stdurg __read_mostly; + int sysctl_tcp_rfc1337 __read_mostly; +@@ -3715,13 +3715,20 @@ static void tcp_send_challenge_ack(struc + /* unprotected vars, we dont care of overwrites */ + static u32 challenge_timestamp; + static unsigned int challenge_count; +- u32 now = jiffies / HZ; ++ u32 count, now = jiffies / HZ; + + if (now != challenge_timestamp) { ++ u32 half = (sysctl_tcp_challenge_ack_limit + 1) >> 1; ++ + challenge_timestamp = now; +- challenge_count = 0; +- } +- if (++challenge_count <= sysctl_tcp_challenge_ack_limit) { ++ ACCESS_ONCE(challenge_count) = ++ half + (u32)( ++ ((u64) random32() * sysctl_tcp_challenge_ack_limit) ++ >> 32); ++ } ++ count = ACCESS_ONCE(challenge_count); ++ if (count > 0) { ++ ACCESS_ONCE(challenge_count) = count - 1; + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK); + tcp_send_ack(sk); + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |