aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_ipv4.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2017-05-05 09:56:54 -0400
committerDavid S. Miller <davem@davemloft.net>2017-05-05 12:00:11 -0400
commit84b114b98452c431299d99c135f751659e517acb (patch)
tree53778bfd4964bed65ac40a9c1c57a73f21cb9664 /net/ipv4/tcp_ipv4.c
parent9051247dcf9ecee156d2ddac39a4f1ca591f8428 (diff)
tcp: randomize timestamps on syncookies
Whole point of randomization was to hide server uptime, but an attacker can simply start a syn flood and TCP generates 'old style' timestamps, directly revealing server jiffies value. Also, TSval sent by the server to a particular remote address vary depending on syncookies being sent or not, potentially triggering PAWS drops for innocent clients. Lets implement proper randomization, including for SYNcookies. Also we do not need to export sysctl_tcp_timestamps, since it is not used from a module. In v2, I added Florian feedback and contribution, adding tsoff to tcp_get_cookie_sock(). v3 removed one unused variable in tcp_v4_connect() as Florian spotted. Fixes: 95a22caee396c ("tcp: randomize tcp timestamp offsets for each connection") Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Florian Westphal <fw@strlen.de> Tested-by: Florian Westphal <fw@strlen.de> Cc: Yuchung Cheng <ycheng@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r--net/ipv4/tcp_ipv4.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index cbbafe546c0f..3a51582bef55 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -94,12 +94,18 @@ static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key,
94struct inet_hashinfo tcp_hashinfo; 94struct inet_hashinfo tcp_hashinfo;
95EXPORT_SYMBOL(tcp_hashinfo); 95EXPORT_SYMBOL(tcp_hashinfo);
96 96
97static u32 tcp_v4_init_seq_and_tsoff(const struct sk_buff *skb, u32 *tsoff) 97static u32 tcp_v4_init_seq(const struct sk_buff *skb)
98{ 98{
99 return secure_tcp_seq_and_tsoff(ip_hdr(skb)->daddr, 99 return secure_tcp_seq(ip_hdr(skb)->daddr,
100 ip_hdr(skb)->saddr, 100 ip_hdr(skb)->saddr,
101 tcp_hdr(skb)->dest, 101 tcp_hdr(skb)->dest,
102 tcp_hdr(skb)->source, tsoff); 102 tcp_hdr(skb)->source);
103}
104
105static u32 tcp_v4_init_ts_off(const struct sk_buff *skb)
106{
107 return secure_tcp_ts_off(ip_hdr(skb)->daddr,
108 ip_hdr(skb)->saddr);
103} 109}
104 110
105int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp) 111int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp)
@@ -145,7 +151,6 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
145 struct flowi4 *fl4; 151 struct flowi4 *fl4;
146 struct rtable *rt; 152 struct rtable *rt;
147 int err; 153 int err;
148 u32 seq;
149 struct ip_options_rcu *inet_opt; 154 struct ip_options_rcu *inet_opt;
150 struct inet_timewait_death_row *tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row; 155 struct inet_timewait_death_row *tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row;
151 156
@@ -232,13 +237,13 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
232 rt = NULL; 237 rt = NULL;
233 238
234 if (likely(!tp->repair)) { 239 if (likely(!tp->repair)) {
235 seq = secure_tcp_seq_and_tsoff(inet->inet_saddr,
236 inet->inet_daddr,
237 inet->inet_sport,
238 usin->sin_port,
239 &tp->tsoffset);
240 if (!tp->write_seq) 240 if (!tp->write_seq)
241 tp->write_seq = seq; 241 tp->write_seq = secure_tcp_seq(inet->inet_saddr,
242 inet->inet_daddr,
243 inet->inet_sport,
244 usin->sin_port);
245 tp->tsoffset = secure_tcp_ts_off(inet->inet_saddr,
246 inet->inet_daddr);
242 } 247 }
243 248
244 inet->inet_id = tp->write_seq ^ jiffies; 249 inet->inet_id = tp->write_seq ^ jiffies;
@@ -1239,7 +1244,8 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {
1239 .cookie_init_seq = cookie_v4_init_sequence, 1244 .cookie_init_seq = cookie_v4_init_sequence,
1240#endif 1245#endif
1241 .route_req = tcp_v4_route_req, 1246 .route_req = tcp_v4_route_req,
1242 .init_seq_tsoff = tcp_v4_init_seq_and_tsoff, 1247 .init_seq = tcp_v4_init_seq,
1248 .init_ts_off = tcp_v4_init_ts_off,
1243 .send_synack = tcp_v4_send_synack, 1249 .send_synack = tcp_v4_send_synack,
1244}; 1250};
1245 1251