diff options
author | Eric Dumazet <edumazet@google.com> | 2019-10-22 10:57:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-10-23 23:13:22 -0400 |
commit | 55667441c84fa5e0911a0aac44fb059c15ba6da2 (patch) | |
tree | 83d3fb8a5acbfbb3f9766f30a1e2343f0f19a90b /include/linux/skbuff.h | |
parent | 6c5d9c2a6bedbb3c3c14253776320c0ee564f064 (diff) |
net/flow_dissector: switch to siphash
UDP IPv6 packets auto flowlabels are using a 32bit secret
(static u32 hashrnd in net/core/flow_dissector.c) and
apply jhash() over fields known by the receivers.
Attackers can easily infer the 32bit secret and use this information
to identify a device and/or user, since this 32bit secret is only
set at boot time.
Really, using jhash() to generate cookies sent on the wire
is a serious security concern.
Trying to change the rol32(hash, 16) in ip6_make_flowlabel() would be
a dead end. Trying to periodically change the secret (like in sch_sfq.c)
could change paths taken in the network for long lived flows.
Let's switch to siphash, as we did in commit df453700e8d8
("inet: switch IP ID generator to siphash")
Using a cryptographically strong pseudo random function will solve this
privacy issue and more generally remove other weak points in the stack.
Packet schedulers using skb_get_hash_perturb() benefit from this change.
Fixes: b56774163f99 ("ipv6: Enable auto flow labels by default")
Fixes: 42240901f7c4 ("ipv6: Implement different admin modes for automatic flow labels")
Fixes: 67800f9b1f4e ("ipv6: Call skb_get_hash_flowi6 to get skb->hash in ip6_make_flowlabel")
Fixes: cb1ce2ef387b ("ipv6: Implement automatic flow label generation on transmit")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Jonathan Berger <jonathann1@walla.com>
Reported-by: Amit Klein <aksecurity@gmail.com>
Reported-by: Benny Pinkas <benny@pinkas.net>
Cc: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r-- | include/linux/skbuff.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 7914fdaf4226..a391147c03d4 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -1354,7 +1354,8 @@ static inline __u32 skb_get_hash_flowi6(struct sk_buff *skb, const struct flowi6 | |||
1354 | return skb->hash; | 1354 | return skb->hash; |
1355 | } | 1355 | } |
1356 | 1356 | ||
1357 | __u32 skb_get_hash_perturb(const struct sk_buff *skb, u32 perturb); | 1357 | __u32 skb_get_hash_perturb(const struct sk_buff *skb, |
1358 | const siphash_key_t *perturb); | ||
1358 | 1359 | ||
1359 | static inline __u32 skb_get_hash_raw(const struct sk_buff *skb) | 1360 | static inline __u32 skb_get_hash_raw(const struct sk_buff *skb) |
1360 | { | 1361 | { |