• Jann Horn's avatar
    bpf: Fix tnum constraints for 32-bit comparisons · 604dca5e
    Jann Horn authored
    The BPF verifier tried to track values based on 32-bit comparisons by
    (ab)using the tnum state via 581738a6 ("bpf: Provide better register
    bounds after jmp32 instructions"). The idea is that after a check like
    this:
    
        if ((u32)r0 > 3)
          exit
    
    We can't meaningfully constrain the arithmetic-range-based tracking, but
    we can update the tnum state to (value=0,mask=0xffff'ffff'0000'0003).
    However, the implementation from 581738a6 didn't compute the tnum
    constraint based on the fixed operand, but instead derives it from the
    arithmetic-range-based tracking. This means that after the following
    sequence of operations:
    
        if (r0 >= 0x1'0000'0001)
          exit
        if ((u32)r0 > 7)
          exit
    
    The verifier assumed that the lower half of r0 is in the range (0, 0)
    and apply the tnum constraint (value=0,mask=0xffff'ffff'0000'0000) thus
    causing the overall tnum to be (value=0,mask=0x1'0000'0000), which was
    incorrect. Provide a fixed implementation.
    
    Fixes: 581738a6 ("bpf: Provide better register bounds after jmp32 instructions")
    Signed-off-by: default avatarJann Horn <jannh@google.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20200330160324.15259-3-daniel@iogearbox.net
    604dca5e
verifier.c 294 KB