• He Fengqing's avatar
    bpf: Fix potential memleak and UAF in the verifier. · 75f0fc7b
    He Fengqing authored
    In bpf_patch_insn_data(), we first use the bpf_patch_insn_single() to
    insert new instructions, then use adjust_insn_aux_data() to adjust
    insn_aux_data. If the old env->prog have no enough room for new inserted
    instructions, we use bpf_prog_realloc to construct new_prog and free the
    old env->prog.
    
    There have two errors here. First, if adjust_insn_aux_data() return
    ENOMEM, we should free the new_prog. Second, if adjust_insn_aux_data()
    return ENOMEM, bpf_patch_insn_data() will return NULL, and env->prog has
    been freed in bpf_prog_realloc, but we will use it in bpf_check().
    
    So in this patch, we make the adjust_insn_aux_data() never fails. In
    bpf_patch_insn_data(), we first pre-malloc memory for the new
    insn_aux_data, then call bpf_patch_insn_single() to insert new
    instructions, at last call adjust_insn_aux_data() to adjust
    insn_aux_data.
    
    Fixes: 8041902d ("bpf: adjust insn_aux_data when patching insns")
    Signed-off-by: default avatarHe Fengqing <hefengqing@huawei.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Link: https://lore.kernel.org/bpf/20210714101815.164322-1-hefengqing@huawei.com
    75f0fc7b
verifier.c 387 KB