| From 6a546addcb6c5dd140dd6f5de888528118a1fa61 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 2 May 2022 10:46:10 +0200 |
| Subject: tcp: resalt the secret every 10 seconds |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| [ Upstream commit 4dfa9b438ee34caca4e6a4e5e961641807367f6f ] |
| |
| 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: Willy Tarreau <w@1wt.eu> |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/core/secure_seq.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| diff --git a/net/core/secure_seq.c b/net/core/secure_seq.c |
| index 444cce0184c3..7131cd1fb2ad 100644 |
| --- a/net/core/secure_seq.c |
| +++ b/net/core/secure_seq.c |
| @@ -22,6 +22,8 @@ |
| static siphash_key_t net_secret __read_mostly; |
| static siphash_key_t ts_secret __read_mostly; |
| |
| +#define EPHEMERAL_PORT_SHUFFLE_PERIOD (10 * HZ) |
| + |
| static __always_inline void net_secret_init(void) |
| { |
| net_get_random_once(&net_secret, sizeof(net_secret)); |
| @@ -100,11 +102,13 @@ u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, |
| const struct { |
| struct in6_addr saddr; |
| struct in6_addr daddr; |
| + unsigned int timeseed; |
| __be16 dport; |
| } __aligned(SIPHASH_ALIGNMENT) combined = { |
| .saddr = *(struct in6_addr *)saddr, |
| .daddr = *(struct in6_addr *)daddr, |
| - .dport = dport |
| + .timeseed = jiffies / EPHEMERAL_PORT_SHUFFLE_PERIOD, |
| + .dport = dport, |
| }; |
| net_secret_init(); |
| return siphash(&combined, offsetofend(typeof(combined), dport), |
| @@ -145,8 +149,10 @@ EXPORT_SYMBOL_GPL(secure_tcp_seq); |
| u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) |
| { |
| net_secret_init(); |
| - return siphash_3u32((__force u32)saddr, (__force u32)daddr, |
| - (__force u16)dport, &net_secret); |
| + return siphash_4u32((__force u32)saddr, (__force u32)daddr, |
| + (__force u16)dport, |
| + jiffies / EPHEMERAL_PORT_SHUFFLE_PERIOD, |
| + &net_secret); |
| } |
| EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral); |
| #endif |
| -- |
| 2.35.1 |
| |