• Andrii Nakryiko's avatar
    bpf: add register bounds sanity checks and sanitization · 5f99f312
    Andrii Nakryiko authored
    Add simple sanity checks that validate well-formed ranges (min <= max)
    across u64, s64, u32, and s32 ranges. Also for cases when the value is
    constant (either 64-bit or 32-bit), we validate that ranges and tnums
    are in agreement.
    
    These bounds checks are performed at the end of BPF_ALU/BPF_ALU64
    operations, on conditional jumps, and for LDX instructions (where subreg
    zero/sign extension is probably the most important to check). This
    covers most of the interesting cases.
    
    Also, we validate the sanity of the return register when manually
    adjusting it for some special helpers.
    
    By default, sanity violation will trigger a warning in verifier log and
    resetting register bounds to "unbounded" ones. But to aid development
    and debugging, BPF_F_TEST_SANITY_STRICT flag is added, which will
    trigger hard failure of verification with -EFAULT on register bounds
    violations. This allows selftests to catch such issues. veristat will
    also gain a CLI option to enable this behavior.
    Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Acked-by: default avatarShung-Hsi Yu <shung-hsi.yu@suse.com>
    Link: https://lore.kernel.org/r/20231112010609.848406-5-andrii@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    5f99f312
verifier.c 622 KB