• Jann Horn's avatar
    bpf: 32-bit RSH verification must truncate input before the ALU op · b799207e
    Jann Horn authored
    When I wrote commit 468f6eaf ("bpf: fix 32-bit ALU op verification"), I
    assumed that, in order to emulate 64-bit arithmetic with 32-bit logic, it
    is sufficient to just truncate the output to 32 bits; and so I just moved
    the register size coercion that used to be at the start of the function to
    the end of the function.
    
    That assumption is true for almost every op, but not for 32-bit right
    shifts, because those can propagate information towards the least
    significant bit. Fix it by always truncating inputs for 32-bit ops to 32
    bits.
    
    Also get rid of the coerce_reg_to_size() after the ALU op, since that has
    no effect.
    
    Fixes: 468f6eaf ("bpf: fix 32-bit ALU op verification")
    Acked-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarJann Horn <jannh@google.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    b799207e
verifier.c 176 KB