• Daniel Borkmann's avatar
    bpf: improve dead code sanitizing · 2a5418a1
    Daniel Borkmann authored
    Given we recently had c131187d ("bpf: fix branch pruning
    logic") and 95a762e2 ("bpf: fix incorrect sign extension in
    check_alu_op()") in particular where before verifier skipped
    verification of the wrongly assumed dead branch, we should not
    just replace the dead code parts with nops (mov r0,r0). If there
    is a bug such as fixed in 95a762e2 in future again, where
    runtime could execute those insns, then one of the potential
    issues with the current setting would be that given the nops
    would be at the end of the program, we could execute out of
    bounds at some point.
    
    The best in such case would be to just exit the BPF program
    altogether and return an exception code. However, given this
    would require two instructions, and such a dead code gap could
    just be a single insn long, we would need to place 'r0 = X; ret'
    snippet at the very end after the user program or at the start
    before the program (where we'd skip that region on prog entry),
    and then place unconditional ja's into the dead code gap.
    
    While more complex but possible, there's still another block
    in the road that currently prevents from this, namely BPF to
    BPF calls. The issue here is that such exception could be
    returned from a callee, but the caller would not know that
    it's an exception that needs to be propagated further down.
    Alternative that has little complexity is to just use a ja-1
    code for now which will trap the execution here instead of
    silently doing bad things if we ever get there due to bugs.
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    2a5418a1
verifier.c 166 KB