* Is TCP vulneribility patch (as in RFC 5961) done in linux? @ 2012-07-13 6:18 Kiran (Kiran Kumar) Kella 2012-07-16 7:06 ` Kiran (Kiran Kumar) Kella 0 siblings, 1 reply; 10+ messages in thread From: Kiran (Kiran Kumar) Kella @ 2012-07-13 6:18 UTC (permalink / raw) To: netdev@vger.kernel.org Hi, I just now checked in the kernel archives if the patch in section 3.2 mentioned in RFC 5961 for RST attacks with predictable sequence numbers. I see some discussion happened in 2004 timeframe. I was just wondering if in the latest linux source, the patch is made available. Appreciate your quick response in this regard. Thanks, Kiran ^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? 2012-07-13 6:18 Is TCP vulneribility patch (as in RFC 5961) done in linux? Kiran (Kiran Kumar) Kella @ 2012-07-16 7:06 ` Kiran (Kiran Kumar) Kella 2012-07-16 8:33 ` Eric Dumazet 0 siblings, 1 reply; 10+ messages in thread From: Kiran (Kiran Kumar) Kella @ 2012-07-16 7:06 UTC (permalink / raw) To: netdev@vger.kernel.org Looking into the file tcp_input.c in the latest stable linux release 3.4.4 source, I understand the fix for this recommendation is not implemented in Linux. Any reason why it was not addressed? Regards, Kiran -----Original Message----- From: netdev-owner@vger.kernel.org [mailto:netdev-owner@vger.kernel.org] On Behalf Of Kiran (Kiran Kumar) Kella Sent: Friday, July 13, 2012 11:48 AM To: netdev@vger.kernel.org Subject: Is TCP vulneribility patch (as in RFC 5961) done in linux? Hi, I just now checked in the kernel archives if the patch in section 3.2 mentioned in RFC 5961 for RST attacks with predictable sequence numbers. I see some discussion happened in 2004 timeframe. I was just wondering if in the latest linux source, the patch is made available. Appreciate your quick response in this regard. Thanks, Kiran ^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? 2012-07-16 7:06 ` Kiran (Kiran Kumar) Kella @ 2012-07-16 8:33 ` Eric Dumazet 2012-07-16 8:35 ` Eric Dumazet 2012-07-16 13:46 ` Eric Dumazet 0 siblings, 2 replies; 10+ messages in thread From: Eric Dumazet @ 2012-07-16 8:33 UTC (permalink / raw) To: Kiran (Kiran Kumar) Kella; +Cc: netdev@vger.kernel.org On Mon, 2012-07-16 at 07:06 +0000, Kiran (Kiran Kumar) Kella wrote: > Looking into the file tcp_input.c in the latest stable linux release 3.4.4 source, I understand the fix for this recommendation is not implemented in Linux. > Any reason why it was not addressed? Nobody cared ? Are you planning to send a patch ? ^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? 2012-07-16 8:33 ` Eric Dumazet @ 2012-07-16 8:35 ` Eric Dumazet 2012-07-16 13:46 ` Eric Dumazet 1 sibling, 0 replies; 10+ messages in thread From: Eric Dumazet @ 2012-07-16 8:35 UTC (permalink / raw) To: Kiran (Kiran Kumar) Kella; +Cc: netdev@vger.kernel.org On Mon, 2012-07-16 at 10:33 +0200, Eric Dumazet wrote: > On Mon, 2012-07-16 at 07:06 +0000, Kiran (Kiran Kumar) Kella wrote: > > Looking into the file tcp_input.c in the latest stable linux release 3.4.4 source, I understand the fix for this recommendation is not implemented in Linux. > > Any reason why it was not addressed? > > Nobody cared ? > > Are you planning to send a patch ? > By the way, if the attacker replaces the RST bit by FIN bit, how are we going to deal with the problem ? Also many middleboxes will drop the challenge ACK... ^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? 2012-07-16 8:33 ` Eric Dumazet 2012-07-16 8:35 ` Eric Dumazet @ 2012-07-16 13:46 ` Eric Dumazet 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella 1 sibling, 2 replies; 10+ messages in thread From: Eric Dumazet @ 2012-07-16 13:46 UTC (permalink / raw) To: Kiran (Kiran Kumar) Kella; +Cc: netdev@vger.kernel.org On Mon, 2012-07-16 at 10:33 +0200, Eric Dumazet wrote: > On Mon, 2012-07-16 at 07:06 +0000, Kiran (Kiran Kumar) Kella wrote: > > Looking into the file tcp_input.c in the latest stable linux release 3.4.4 source, I understand the fix for this recommendation is not implemented in Linux. > > Any reason why it was not addressed? > > Nobody cared ? > > Are you planning to send a patch ? > Here is an RFC patch implementing RFC 5961 3.2 [PATCH net-next] tcp: implement RFC 5961 3.2 Implement the RFC 5691 mitigation against Blind Reset attack using RST bit. Add a new sysctl, tcp_challengeack_limit, to limit number of challenge ACK sent per second. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Kiran Kumar Kella <kkiran@broadcom.com> --- Documentation/networking/ip-sysctl.txt | 5 +++ include/linux/snmp.h | 1 include/net/tcp.h | 1 net/ipv4/proc.c | 1 net/ipv4/sysctl_net_ipv4.c | 7 +++++ net/ipv4/tcp_input.c | 31 ++++++++++++++++++++++- 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index e20c17a..f785fd1 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt @@ -565,6 +565,11 @@ tcp_limit_output_bytes - INTEGER reduce the size of individual GSO packet (64KB being the max) Default: 131072 +tcp_challengeack_limit - INTEGER + Limits number of Challenge ACK sent per second, as recommended + in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks) + Default: 100 + UDP variables: udp_mem - vector of 3 INTEGERs: min, pressure, max diff --git a/include/linux/snmp.h b/include/linux/snmp.h index 2e68f5b..594638e 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h @@ -234,6 +234,7 @@ enum LINUX_MIB_TCPREQQFULLDROP, /* TCPReqQFullDrop */ LINUX_MIB_TCPRETRANSFAIL, /* TCPRetransFail */ LINUX_MIB_TCPRCVCOALESCE, /* TCPRcvCoalesce */ + LINUX_MIB_TCPCHALLENGEACK, /* TCPChallengeACK */ __LINUX_MIB_MAX }; diff --git a/include/net/tcp.h b/include/net/tcp.h index 439984b..fc14419 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -254,6 +254,7 @@ extern int sysctl_tcp_thin_linear_timeouts; extern int sysctl_tcp_thin_dupack; extern int sysctl_tcp_early_retrans; extern int sysctl_tcp_limit_output_bytes; +extern int sysctl_tcp_challengeack_limit; extern atomic_long_t tcp_memory_allocated; extern struct percpu_counter tcp_sockets_allocated; diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index 8af0d44..d589468 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c @@ -258,6 +258,7 @@ static const struct snmp_mib snmp4_net_list[] = { SNMP_MIB_ITEM("TCPReqQFullDrop", LINUX_MIB_TCPREQQFULLDROP), SNMP_MIB_ITEM("TCPRetransFail", LINUX_MIB_TCPRETRANSFAIL), SNMP_MIB_ITEM("TCPRcvCoalesce", LINUX_MIB_TCPRCVCOALESCE), + SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK), SNMP_MIB_SENTINEL }; diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 70730f7..12df8e8 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -605,6 +605,13 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, + { + .procname = "tcp_challengeack_limit", + .data = &sysctl_tcp_challengeack_limit, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, #ifdef CONFIG_NET_DMA { .procname = "tcp_dma_copybreak", diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 055ac49..8e7edff 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -88,6 +88,9 @@ int sysctl_tcp_app_win __read_mostly = 31; int sysctl_tcp_adv_win_scale __read_mostly = 1; EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); +/* rfc5961 challenge ack rate limiting */ +int sysctl_tcp_challengeack_limit = 100; + int sysctl_tcp_stdurg __read_mostly; int sysctl_tcp_rfc1337 __read_mostly; int sysctl_tcp_max_orphans __read_mostly = NR_FILE; @@ -5244,6 +5247,23 @@ out: } #endif /* CONFIG_NET_DMA */ +static void tcp_send_challenge_ack(struct sock *sk) +{ + /* unprotected vars, we dont care of overwrites */ + static u32 challenge_time; + static unsigned int challenge_count; + u32 now = tcp_time_stamp / HZ; + + if (now != challenge_time) { + challenge_time = now; + challenge_count = 0; + } + if (++challenge_count <= sysctl_tcp_challengeack_limit) { + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK); + tcp_send_ack(sk); + } +} + /* Does PAWS and seqno based validation of an incoming segment, flags will * play significant role here. */ @@ -5280,7 +5300,16 @@ static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, /* Step 2: check RST bit */ if (th->rst) { - tcp_reset(sk); + /* RFC 5961 3.2 : + * If sequence number exactly matches RCV.NXT, then + * RESET the connection + * else + * Send a challenge ACK + */ + if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt) + tcp_reset(sk); + else + tcp_send_challenge_ack(sk); goto discard; } ^ permalink raw reply related [flat|nested] 10+ messages in thread
* RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? 2012-07-16 13:46 ` Eric Dumazet @ 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella 2012-07-17 5:20 ` David Miller 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella 1 sibling, 1 reply; 10+ messages in thread From: Kiran (Kiran Kumar) Kella @ 2012-07-16 13:50 UTC (permalink / raw) To: Eric Dumazet; +Cc: netdev@vger.kernel.org Thanks a lot Eric for the patch. I shall try it out. Regards, Kiran -----Original Message----- From: Eric Dumazet [mailto:eric.dumazet@gmail.com] Sent: Monday, July 16, 2012 7:17 PM To: Kiran (Kiran Kumar) Kella Cc: netdev@vger.kernel.org Subject: RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? On Mon, 2012-07-16 at 10:33 +0200, Eric Dumazet wrote: > On Mon, 2012-07-16 at 07:06 +0000, Kiran (Kiran Kumar) Kella wrote: > > Looking into the file tcp_input.c in the latest stable linux release 3.4.4 source, I understand the fix for this recommendation is not implemented in Linux. > > Any reason why it was not addressed? > > Nobody cared ? > > Are you planning to send a patch ? > Here is an RFC patch implementing RFC 5961 3.2 [PATCH net-next] tcp: implement RFC 5961 3.2 Implement the RFC 5691 mitigation against Blind Reset attack using RST bit. Add a new sysctl, tcp_challengeack_limit, to limit number of challenge ACK sent per second. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Kiran Kumar Kella <kkiran@broadcom.com> --- Documentation/networking/ip-sysctl.txt | 5 +++ include/linux/snmp.h | 1 include/net/tcp.h | 1 net/ipv4/proc.c | 1 net/ipv4/sysctl_net_ipv4.c | 7 +++++ net/ipv4/tcp_input.c | 31 ++++++++++++++++++++++- 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index e20c17a..f785fd1 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt @@ -565,6 +565,11 @@ tcp_limit_output_bytes - INTEGER reduce the size of individual GSO packet (64KB being the max) Default: 131072 +tcp_challengeack_limit - INTEGER + Limits number of Challenge ACK sent per second, as recommended + in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks) + Default: 100 + UDP variables: udp_mem - vector of 3 INTEGERs: min, pressure, max diff --git a/include/linux/snmp.h b/include/linux/snmp.h index 2e68f5b..594638e 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h @@ -234,6 +234,7 @@ enum LINUX_MIB_TCPREQQFULLDROP, /* TCPReqQFullDrop */ LINUX_MIB_TCPRETRANSFAIL, /* TCPRetransFail */ LINUX_MIB_TCPRCVCOALESCE, /* TCPRcvCoalesce */ + LINUX_MIB_TCPCHALLENGEACK, /* TCPChallengeACK */ __LINUX_MIB_MAX }; diff --git a/include/net/tcp.h b/include/net/tcp.h index 439984b..fc14419 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -254,6 +254,7 @@ extern int sysctl_tcp_thin_linear_timeouts; extern int sysctl_tcp_thin_dupack; extern int sysctl_tcp_early_retrans; extern int sysctl_tcp_limit_output_bytes; +extern int sysctl_tcp_challengeack_limit; extern atomic_long_t tcp_memory_allocated; extern struct percpu_counter tcp_sockets_allocated; diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index 8af0d44..d589468 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c @@ -258,6 +258,7 @@ static const struct snmp_mib snmp4_net_list[] = { SNMP_MIB_ITEM("TCPReqQFullDrop", LINUX_MIB_TCPREQQFULLDROP), SNMP_MIB_ITEM("TCPRetransFail", LINUX_MIB_TCPRETRANSFAIL), SNMP_MIB_ITEM("TCPRcvCoalesce", LINUX_MIB_TCPRCVCOALESCE), + SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK), SNMP_MIB_SENTINEL }; diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 70730f7..12df8e8 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -605,6 +605,13 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, + { + .procname = "tcp_challengeack_limit", + .data = &sysctl_tcp_challengeack_limit, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, #ifdef CONFIG_NET_DMA { .procname = "tcp_dma_copybreak", diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 055ac49..8e7edff 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -88,6 +88,9 @@ int sysctl_tcp_app_win __read_mostly = 31; int sysctl_tcp_adv_win_scale __read_mostly = 1; EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); +/* rfc5961 challenge ack rate limiting */ +int sysctl_tcp_challengeack_limit = 100; + int sysctl_tcp_stdurg __read_mostly; int sysctl_tcp_rfc1337 __read_mostly; int sysctl_tcp_max_orphans __read_mostly = NR_FILE; @@ -5244,6 +5247,23 @@ out: } #endif /* CONFIG_NET_DMA */ +static void tcp_send_challenge_ack(struct sock *sk) +{ + /* unprotected vars, we dont care of overwrites */ + static u32 challenge_time; + static unsigned int challenge_count; + u32 now = tcp_time_stamp / HZ; + + if (now != challenge_time) { + challenge_time = now; + challenge_count = 0; + } + if (++challenge_count <= sysctl_tcp_challengeack_limit) { + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK); + tcp_send_ack(sk); + } +} + /* Does PAWS and seqno based validation of an incoming segment, flags will * play significant role here. */ @@ -5280,7 +5300,16 @@ static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, /* Step 2: check RST bit */ if (th->rst) { - tcp_reset(sk); + /* RFC 5961 3.2 : + * If sequence number exactly matches RCV.NXT, then + * RESET the connection + * else + * Send a challenge ACK + */ + if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt) + tcp_reset(sk); + else + tcp_send_challenge_ack(sk); goto discard; } ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: Is TCP vulneribility patch (as in RFC 5961) done in linux? 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella @ 2012-07-17 5:20 ` David Miller 0 siblings, 0 replies; 10+ messages in thread From: David Miller @ 2012-07-17 5:20 UTC (permalink / raw) To: kkiran; +Cc: eric.dumazet, netdev Please do not top-post. Please do not quote an entire patch in a reply because it: 1) Wastes bandwidth, everyone on the list now has to receive another copy of the patch. Actually, because you did this twice, people have to receive 3 total copies. 2) It causes confusion in our patch management database, because now I have to sift through and remove the two extra copies of this patch your emails added. ^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? 2012-07-16 13:46 ` Eric Dumazet 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella @ 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella 2012-07-16 14:47 ` Eric Dumazet 1 sibling, 1 reply; 10+ messages in thread From: Kiran (Kiran Kumar) Kella @ 2012-07-16 13:50 UTC (permalink / raw) To: Eric Dumazet; +Cc: netdev@vger.kernel.org Eric, Thanks a lot for the patch. I shall try it out and let you know if I see any issues. Regards, Kiran -----Original Message----- From: Eric Dumazet [mailto:eric.dumazet@gmail.com] Sent: Monday, July 16, 2012 7:17 PM To: Kiran (Kiran Kumar) Kella Cc: netdev@vger.kernel.org Subject: RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? On Mon, 2012-07-16 at 10:33 +0200, Eric Dumazet wrote: > On Mon, 2012-07-16 at 07:06 +0000, Kiran (Kiran Kumar) Kella wrote: > > Looking into the file tcp_input.c in the latest stable linux release 3.4.4 source, I understand the fix for this recommendation is not implemented in Linux. > > Any reason why it was not addressed? > > Nobody cared ? > > Are you planning to send a patch ? > Here is an RFC patch implementing RFC 5961 3.2 [PATCH net-next] tcp: implement RFC 5961 3.2 Implement the RFC 5691 mitigation against Blind Reset attack using RST bit. Add a new sysctl, tcp_challengeack_limit, to limit number of challenge ACK sent per second. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Kiran Kumar Kella <kkiran@broadcom.com> --- Documentation/networking/ip-sysctl.txt | 5 +++ include/linux/snmp.h | 1 include/net/tcp.h | 1 net/ipv4/proc.c | 1 net/ipv4/sysctl_net_ipv4.c | 7 +++++ net/ipv4/tcp_input.c | 31 ++++++++++++++++++++++- 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index e20c17a..f785fd1 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt @@ -565,6 +565,11 @@ tcp_limit_output_bytes - INTEGER reduce the size of individual GSO packet (64KB being the max) Default: 131072 +tcp_challengeack_limit - INTEGER + Limits number of Challenge ACK sent per second, as recommended + in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks) + Default: 100 + UDP variables: udp_mem - vector of 3 INTEGERs: min, pressure, max diff --git a/include/linux/snmp.h b/include/linux/snmp.h index 2e68f5b..594638e 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h @@ -234,6 +234,7 @@ enum LINUX_MIB_TCPREQQFULLDROP, /* TCPReqQFullDrop */ LINUX_MIB_TCPRETRANSFAIL, /* TCPRetransFail */ LINUX_MIB_TCPRCVCOALESCE, /* TCPRcvCoalesce */ + LINUX_MIB_TCPCHALLENGEACK, /* TCPChallengeACK */ __LINUX_MIB_MAX }; diff --git a/include/net/tcp.h b/include/net/tcp.h index 439984b..fc14419 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -254,6 +254,7 @@ extern int sysctl_tcp_thin_linear_timeouts; extern int sysctl_tcp_thin_dupack; extern int sysctl_tcp_early_retrans; extern int sysctl_tcp_limit_output_bytes; +extern int sysctl_tcp_challengeack_limit; extern atomic_long_t tcp_memory_allocated; extern struct percpu_counter tcp_sockets_allocated; diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index 8af0d44..d589468 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c @@ -258,6 +258,7 @@ static const struct snmp_mib snmp4_net_list[] = { SNMP_MIB_ITEM("TCPReqQFullDrop", LINUX_MIB_TCPREQQFULLDROP), SNMP_MIB_ITEM("TCPRetransFail", LINUX_MIB_TCPRETRANSFAIL), SNMP_MIB_ITEM("TCPRcvCoalesce", LINUX_MIB_TCPRCVCOALESCE), + SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK), SNMP_MIB_SENTINEL }; diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 70730f7..12df8e8 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -605,6 +605,13 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, + { + .procname = "tcp_challengeack_limit", + .data = &sysctl_tcp_challengeack_limit, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, #ifdef CONFIG_NET_DMA { .procname = "tcp_dma_copybreak", diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 055ac49..8e7edff 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -88,6 +88,9 @@ int sysctl_tcp_app_win __read_mostly = 31; int sysctl_tcp_adv_win_scale __read_mostly = 1; EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); +/* rfc5961 challenge ack rate limiting */ +int sysctl_tcp_challengeack_limit = 100; + int sysctl_tcp_stdurg __read_mostly; int sysctl_tcp_rfc1337 __read_mostly; int sysctl_tcp_max_orphans __read_mostly = NR_FILE; @@ -5244,6 +5247,23 @@ out: } #endif /* CONFIG_NET_DMA */ +static void tcp_send_challenge_ack(struct sock *sk) +{ + /* unprotected vars, we dont care of overwrites */ + static u32 challenge_time; + static unsigned int challenge_count; + u32 now = tcp_time_stamp / HZ; + + if (now != challenge_time) { + challenge_time = now; + challenge_count = 0; + } + if (++challenge_count <= sysctl_tcp_challengeack_limit) { + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK); + tcp_send_ack(sk); + } +} + /* Does PAWS and seqno based validation of an incoming segment, flags will * play significant role here. */ @@ -5280,7 +5300,16 @@ static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, /* Step 2: check RST bit */ if (th->rst) { - tcp_reset(sk); + /* RFC 5961 3.2 : + * If sequence number exactly matches RCV.NXT, then + * RESET the connection + * else + * Send a challenge ACK + */ + if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt) + tcp_reset(sk); + else + tcp_send_challenge_ack(sk); goto discard; } ^ permalink raw reply related [flat|nested] 10+ messages in thread
* RE: Is TCP vulneribility patch (as in RFC 5961) done in linux? 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella @ 2012-07-16 14:47 ` Eric Dumazet 0 siblings, 0 replies; 10+ messages in thread From: Eric Dumazet @ 2012-07-16 14:47 UTC (permalink / raw) To: Kiran (Kiran Kumar) Kella; +Cc: netdev@vger.kernel.org On Mon, 2012-07-16 at 13:50 +0000, Kiran (Kiran Kumar) Kella wrote: > Eric, > > Thanks a lot for the patch. > I shall try it out and let you know if I see any issues. Please note followup patches are needed to address RFC 5961 Sections 4 & 5 (4 Blind Reset Attack Using the SYN Bit) (5 Blind Data Injection Attack) ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <68700EDA775E5E47B5EBA9FF8AC0F15C07506A@SJEXCHMB09.corp.ad.broadcom.com>]
* Re: Is TCP vulneribility patch (as in RFC 5961) done in linux? [not found] <68700EDA775E5E47B5EBA9FF8AC0F15C07506A@SJEXCHMB09.corp.ad.broadcom.com> @ 2012-07-12 14:37 ` Randy Dunlap 0 siblings, 0 replies; 10+ messages in thread From: Randy Dunlap @ 2012-07-12 14:37 UTC (permalink / raw) To: Kiran (Kiran Kumar) Kella; +Cc: linux-kernel@vger.kernel.org, netdev On 07/12/2012 05:40 AM, Kiran (Kiran Kumar) Kella wrote: > Hi, > > I just now checked in the kernel archives if the patch in section 3.2 mentioned in RFC 5961 for RST attacks with predictable sequence numbers. > I see some discussion happened in 2004 timeframe. > I was just wondering if in the latest linux source, the patch is made available. > > Appreciate your quick response in this regard. > > Thanks, > Kiran You should ask this question on the netdev mailing list (cc-ed). -- ~Randy ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2012-07-17 5:20 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-07-13 6:18 Is TCP vulneribility patch (as in RFC 5961) done in linux? Kiran (Kiran Kumar) Kella 2012-07-16 7:06 ` Kiran (Kiran Kumar) Kella 2012-07-16 8:33 ` Eric Dumazet 2012-07-16 8:35 ` Eric Dumazet 2012-07-16 13:46 ` Eric Dumazet 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella 2012-07-17 5:20 ` David Miller 2012-07-16 13:50 ` Kiran (Kiran Kumar) Kella 2012-07-16 14:47 ` Eric Dumazet [not found] <68700EDA775E5E47B5EBA9FF8AC0F15C07506A@SJEXCHMB09.corp.ad.broadcom.com> 2012-07-12 14:37 ` Randy Dunlap
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).