• Liping Zhang's avatar
    netfilter: nft_set_bitmap: fetch the element key based on the set->klen · fd89b23a
    Liping Zhang authored
    Currently we just assume the element key as a u32 integer, regardless of
    the set key length.
    
    This is incorrect, for example, the tcp port number is only 16 bits.
    So when we use the nft_payload expr to get the tcp dport and store
    it to dreg, the dport will be stored at 0~15 bits, and 16~31 bits
    will be padded with zero.
    
    So the reg->data[dreg] will be looked like as below:
      0          15           31
      +-+-+-+-+-+-+-+-+-+-+-+-+
      | tcp dport |      0    |
      +-+-+-+-+-+-+-+-+-+-+-+-+
    But for these big-endian systems, if we treate this register as a u32
    integer, the element key will be larger than 65535, so the following
    lookup in bitmap set will cause out of bound access.
    
    Another issue is that if we add element with comments in bitmap
    set(although the comments will be ignored eventually), the element will
    vanish strangely. Because we treate the element key as a u32 integer, so
    the comments will become the part of the element key, then the element
    key will also be larger than 65535 and out of bound access will happen:
      # nft add element t s { 1 comment test }
    
    Since set->klen is 1 or 2, it's fine to treate the element key as a u8 or
    u16 integer.
    
    Fixes: 665153ff ("netfilter: nf_tables: add bitmap set type")
    Signed-off-by: default avatarLiping Zhang <zlpnobody@gmail.com>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    fd89b23a
nft_set_bitmap.c 8.58 KB