• Daniel Borkmann's avatar
    bpf: Fix use after free in bpf_get_prog_name · 3b4d9eb2
    Daniel Borkmann authored
    There is one more problematic case I noticed while recently fixing BPF kallsyms
    handling in cd7455f1 ("bpf: Fix use after free in subprog's jited symbol
    removal") and that is bpf_get_prog_name().
    
    If BTF has been attached to the prog, then we may be able to fetch the function
    signature type id in kallsyms through prog->aux->func_info[prog->aux->func_idx].type_id.
    However, while the BTF object itself is torn down via RCU callback, the prog's
    aux->func_info is immediately freed via kvfree(prog->aux->func_info) once the
    prog's refcount either hit zero or when subprograms were already exposed via
    kallsyms and we hit the error path added in 5482e9a9 ("bpf: Fix memleak in
    aux->func_info and aux->btf").
    
    This violates RCU as well since kallsyms could be walked in parallel where we
    could access aux->func_info. Hence, defer kvfree() to after RCU grace period.
    Looking at ba64e7d8 ("bpf: btf: support proper non-jit func info") there
    is no reason/dependency where we couldn't defer the kvfree(aux->func_info) into
    the RCU callback.
    
    Fixes: 5482e9a9 ("bpf: Fix memleak in aux->func_info and aux->btf")
    Fixes: ba64e7d8 ("bpf: btf: support proper non-jit func info")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarYonghong Song <yhs@fb.com>
    Cc: Martin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/bpf/875f2906a7c1a0691f2d567b4d8e4ea2739b1e88.1571779205.git.daniel@iogearbox.net
    3b4d9eb2
syscall.c 68.4 KB