• Ludovic Cintrat's avatar
    net: core: fix flow symmetric hash · 64ae13ed
    Ludovic Cintrat authored
    __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: c3f83241 ("net: Add full IPv6 addresses to flow_keys")
    Signed-off-by: default avatarLudovic Cintrat <ludovic.cintrat@gatewatcher.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    64ae13ed
flow_dissector.c 51.2 KB