inet: switch IP ID generator to siphash
According to Amit Klein and Benny Pinkas, IP ID generation is too weak and might be used by attackers. Even with recent net_hash_mix() fix (netns: provide pure entropy for net_hash_mix()) having 64bit key and Jenkins hash is risky. It is time to switch to siphash and its 128bit keys. Signed-off-by: Eric Dumazet <edumazet@google.com> Reported-by: Amit Klein <aksecurity@gmail.com> Reported-by: Benny Pinkas <benny@pinkas.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
180a8c3d5d
commit
df453700e8
@@ -500,15 +500,17 @@ EXPORT_SYMBOL(ip_idents_reserve);
|
||||
|
||||
void __ip_select_ident(struct net *net, struct iphdr *iph, int segs)
|
||||
{
|
||||
static u32 ip_idents_hashrnd __read_mostly;
|
||||
u32 hash, id;
|
||||
|
||||
net_get_random_once(&ip_idents_hashrnd, sizeof(ip_idents_hashrnd));
|
||||
/* Note the following code is not safe, but this is okay. */
|
||||
if (unlikely(siphash_key_is_zero(&net->ipv4.ip_id_key)))
|
||||
get_random_bytes(&net->ipv4.ip_id_key,
|
||||
sizeof(net->ipv4.ip_id_key));
|
||||
|
||||
hash = jhash_3words((__force u32)iph->daddr,
|
||||
hash = siphash_3u32((__force u32)iph->daddr,
|
||||
(__force u32)iph->saddr,
|
||||
iph->protocol ^ net_hash_mix(net),
|
||||
ip_idents_hashrnd);
|
||||
iph->protocol,
|
||||
&net->ipv4.ip_id_key);
|
||||
id = ip_idents_reserve(hash, segs);
|
||||
iph->id = htons(id);
|
||||
}
|
||||
|
Reference in New Issue
Block a user