Commit 4dfa9b43 authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski

tcp: resalt the secret every 10 seconds

In order to limit the ability for an observer to recognize the source
ports sequence used to contact a set of destinations, we should
periodically shuffle the secret. 10 seconds looks effective enough
without causing particular issues.

Cc: Moshe Kol <moshe.kol@mail.huji.ac.il>
Cc: Yossi Gilad <yossi.gilad@mail.huji.ac.il>
Cc: Amit Klein <aksecurity@gmail.com>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Tested-by: default avatarWilly Tarreau <w@1wt.eu>
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9e9b70ae
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
static siphash_aligned_key_t net_secret; static siphash_aligned_key_t net_secret;
static siphash_aligned_key_t ts_secret; static siphash_aligned_key_t ts_secret;
#define EPHEMERAL_PORT_SHUFFLE_PERIOD (10 * HZ)
static __always_inline void net_secret_init(void) static __always_inline void net_secret_init(void)
{ {
net_get_random_once(&net_secret, sizeof(net_secret)); net_get_random_once(&net_secret, sizeof(net_secret));
...@@ -100,11 +102,13 @@ u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, ...@@ -100,11 +102,13 @@ u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
const struct { const struct {
struct in6_addr saddr; struct in6_addr saddr;
struct in6_addr daddr; struct in6_addr daddr;
unsigned int timeseed;
__be16 dport; __be16 dport;
} __aligned(SIPHASH_ALIGNMENT) combined = { } __aligned(SIPHASH_ALIGNMENT) combined = {
.saddr = *(struct in6_addr *)saddr, .saddr = *(struct in6_addr *)saddr,
.daddr = *(struct in6_addr *)daddr, .daddr = *(struct in6_addr *)daddr,
.dport = dport .timeseed = jiffies / EPHEMERAL_PORT_SHUFFLE_PERIOD,
.dport = dport,
}; };
net_secret_init(); net_secret_init();
return siphash(&combined, offsetofend(typeof(combined), dport), return siphash(&combined, offsetofend(typeof(combined), dport),
...@@ -145,8 +149,10 @@ EXPORT_SYMBOL_GPL(secure_tcp_seq); ...@@ -145,8 +149,10 @@ EXPORT_SYMBOL_GPL(secure_tcp_seq);
u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport)
{ {
net_secret_init(); net_secret_init();
return siphash_3u32((__force u32)saddr, (__force u32)daddr, return siphash_4u32((__force u32)saddr, (__force u32)daddr,
(__force u16)dport, &net_secret); (__force u16)dport,
jiffies / EPHEMERAL_PORT_SHUFFLE_PERIOD,
&net_secret);
} }
EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral); EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral);
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment