• Anatole Denis's avatar
    netfilter: nft_set_hash: disable fast_ops for 2-len keys · 0414c78f
    Anatole Denis authored
    jhash_1word of a u16 is a different value from jhash of the same u16 with
    length 2.
    Since elements are always inserted in sets using jhash over the actual
    klen, this would lead to incorrect lookups on fixed-size sets with a key
    length of 2, as they would be inserted with hash value jhash(key, 2) and
    looked up with hash value jhash_1word(key), which is different.
    
    Example reproducer(v4.13+), using anonymous sets which always have a
    fixed size:
    
      table inet t {
          chain c {
                      type filter hook output priority 0; policy accept;
                      tcp dport { 10001, 10003, 10005, 10007, 10009 } counter packets 4 bytes 240 reject
                      tcp dport 10001 counter packets 4 bytes 240 reject
                      tcp dport 10003 counter packets 4 bytes 240 reject
                      tcp dport 10005 counter packets 4 bytes 240 reject
                      tcp dport 10007 counter packets 0 bytes 0 reject
                      tcp dport 10009 counter packets 4 bytes 240 reject
              }
      }
    
    then use nc -z localhost <port> to probe; incorrectly hashed ports will
    pass through the set lookup and increment the counter of an individual
    rule.
    
    jhash being seeded with a random value, it is not deterministic which
    ports will incorrectly hash, but in testing with 5 ports in the set I
    always had 4 or 5 with an incorrect hash value.
    Signed-off-by: default avatarAnatole Denis <anatole@rezel.net>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    0414c78f
nft_set_hash.c 16.2 KB