Star64_linux/net/core
Ludovic Cintrat 64ae13ed47 net: core: fix flow symmetric hash
__flow_hash_consistentify() wrongly swaps ipv4 addresses in few cases.
This function is indirectly used by __skb_get_hash_symmetric(), which is
used to fanout packets in AF_PACKET.
Intrusion detection systems may be impacted by this issue.

__flow_hash_consistentify() computes the addresses difference then swaps
them if the difference is negative. In few cases src - dst and dst - src
are both negative.

The following snippet mimics __flow_hash_consistentify():

```
 #include <stdio.h>
 #include <stdint.h>

 int main(int argc, char** argv) {

     int diffs_d, diffd_s;
     uint32_t dst  = 0xb225a8c0; /* 178.37.168.192 --> 192.168.37.178 */
     uint32_t src  = 0x3225a8c0; /*  50.37.168.192 --> 192.168.37.50  */
     uint32_t dst2 = 0x3325a8c0; /*  51.37.168.192 --> 192.168.37.51  */

     diffs_d = src - dst;
     diffd_s = dst - src;

     printf("src:%08x dst:%08x, diff(s-d)=%d(0x%x) diff(d-s)=%d(0x%x)\n",
             src, dst, diffs_d, diffs_d, diffd_s, diffd_s);

     diffs_d = src - dst2;
     diffd_s = dst2 - src;

     printf("src:%08x dst:%08x, diff(s-d)=%d(0x%x) diff(d-s)=%d(0x%x)\n",
             src, dst2, diffs_d, diffs_d, diffd_s, diffd_s);

     return 0;
 }
```

Results:

src:3225a8c0 dst:b225a8c0, \
    diff(s-d)=-2147483648(0x80000000) \
    diff(d-s)=-2147483648(0x80000000)

src:3225a8c0 dst:3325a8c0, \
    diff(s-d)=-16777216(0xff000000) \
    diff(d-s)=16777216(0x1000000)

In the first case the addresses differences are always < 0, therefore
__flow_hash_consistentify() always swaps, thus dst->src and src->dst
packets have differents hashes.

Fixes: c3f8324188 ("net: Add full IPv6 addresses to flow_keys")
Signed-off-by: Ludovic Cintrat <ludovic.cintrat@gatewatcher.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2022-09-09 12:48:00 +01:00
..
bpf_sk_storage.c net: Fix data-races around sysctl_optmem_max. 2022-08-24 13:46:57 +01:00
datagram.c tcp: TX zerocopy should not sense pfmemalloc status 2022-09-02 12:29:02 +01:00
dev.c net: Fix a data-race around netdev_unregister_timeout_secs. 2022-08-24 13:46:58 +01:00
dev.h
dev_addr_lists.c
dev_addr_lists_test.c
dev_ioctl.c
devlink.c
drop_monitor.c
dst.c
dst_cache.c
failover.c
fib_notifier.c
fib_rules.c
filter.c net: Fix data-races around sysctl_optmem_max. 2022-08-24 13:46:57 +01:00
flow_dissector.c net: core: fix flow symmetric hash 2022-09-09 12:48:00 +01:00
flow_offload.c
gen_estimator.c
gen_stats.c net: sched: fix misuse of qcpu->backlog in gnet_stats_add_queue_cpu 2022-08-16 19:38:20 -07:00
gro.c
gro_cells.c net: Fix data-races around netdev_max_backlog. 2022-08-24 13:46:57 +01:00
hwbm.c
link_watch.c
lwt_bpf.c
lwtunnel.c
Makefile net: skb: export skb drop reaons to user by TRACE_DEFINE_ENUM 2022-09-07 15:28:08 +01:00
neighbour.c net: neigh: don't call kfree_skb() under spin_lock_irqsave() 2022-08-24 09:49:20 +01:00
net-procfs.c
net-sysfs.c
net-sysfs.h
net-traces.c
net_namespace.c
netclassid_cgroup.c
netevent.c
netpoll.c
netprio_cgroup.c
of_net.c
page_pool.c
pktgen.c
ptp_classifier.c
request_sock.c
rtnetlink.c net: rtnetlink: fix module reference count leak issue in rtnetlink_rcv_msg 2022-08-15 19:58:30 -07:00
scm.c
secure_seq.c
selftests.c
skbuff.c net: skb: export skb drop reaons to user by TRACE_DEFINE_ENUM 2022-09-07 15:28:08 +01:00
skmsg.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf 2022-08-26 12:19:09 +01:00
sock.c net: Fix a data-race around sysctl_net_busy_read. 2022-08-24 13:46:58 +01:00
sock_destructor.h
sock_diag.c
sock_map.c bpf: Acquire map uref in .init_seq_private for sock{map,hash} iterator 2022-08-10 10:12:48 -07:00
sock_reuseport.c
stream.c
sysctl_net_core.c net: Fix data-races around weight_p and dev_weight_[rt]x_bias. 2022-08-24 13:46:57 +01:00
timestamping.c
tso.c
utils.c
xdp.c