• Ian Rogers's avatar
    perf bperf: Avoid use after free via unrelated 'struct evsel' anonymous union field · e0137336
    Ian Rogers authored
    If bperf (perf tools that use BPF skels) sets evsel->leader_skel or
    evsel->follower_skel then it appears that evsel->bpf_skel is set and can
    trigger the following use-after-free:
    
    ==13575==ERROR: AddressSanitizer: heap-use-after-free on address 0x60c000014080 at pc 0x55684b939880 bp 0x7ffdfcf30d70 sp 0x7ffdfcf30d68
    READ of size 8 at 0x60c000014080 thread T0
         #0 0x55684b93987f in sample_filter_bpf__destroy tools/perf/bpf_skel/sample_filter.skel.h:44:11
         #1 0x55684b93987f in perf_bpf_filter__destroy tools/perf/util/bpf-filter.c:155:2
         #2 0x55684b98f71e in evsel__exit tools/perf/util/evsel.c:1521:2
         #3 0x55684b98a352 in evsel__delete tools/perf/util/evsel.c:1547:2
         #4 0x55684b981918 in evlist__purge tools/perf/util/evlist.c:148:3
         #5 0x55684b981918 in evlist__delete tools/perf/util/evlist.c:169:2
         #6 0x55684b887d60 in cmd_stat tools/perf/builtin-stat.c:2598:2
    ..
    0x60c000014080 is located 0 bytes inside of 128-byte region [0x60c000014080,0x60c000014100)
    freed by thread T0 here:
         #0 0x55684b780e86 in free compiler-rt/lib/asan/asan_malloc_linux.cpp:52:3
         #1 0x55684b9462da in bperf_cgroup_bpf__destroy tools/perf/bpf_skel/bperf_cgroup.skel.h:61:2
         #2 0x55684b9462da in bperf_cgrp__destroy tools/perf/util/bpf_counter_cgroup.c:282:2
         #3 0x55684b944c75 in bpf_counter__destroy tools/perf/util/bpf_counter.c:819:2
         #4 0x55684b98f716 in evsel__exit tools/perf/util/evsel.c:1520:2
         #5 0x55684b98a352 in evsel__delete tools/perf/util/evsel.c:1547:2
         #6 0x55684b981918 in evlist__purge tools/perf/util/evlist.c:148:3
         #7 0x55684b981918 in evlist__delete tools/perf/util/evlist.c:169:2
         #8 0x55684b887d60 in cmd_stat tools/perf/builtin-stat.c:2598:2
    ...
    previously allocated by thread T0 here:
         #0 0x55684b781338 in calloc compiler-rt/lib/asan/asan_malloc_linux.cpp:77:3
         #1 0x55684b944e25 in bperf_cgroup_bpf__open_opts tools/perf/bpf_skel/bperf_cgroup.skel.h:73:35
         #2 0x55684b944e25 in bperf_cgroup_bpf__open tools/perf/bpf_skel/bperf_cgroup.skel.h:97:9
         #3 0x55684b944e25 in bperf_load_program tools/perf/util/bpf_counter_cgroup.c:55:9
         #4 0x55684b944e25 in bperf_cgrp__load tools/perf/util/bpf_counter_cgroup.c:178:23
         #5 0x55684b889289 in __run_perf_stat tools/perf/builtin-stat.c:713:7
         #6 0x55684b889289 in run_perf_stat tools/perf/builtin-stat.c:949:8
         #7 0x55684b888029 in cmd_stat tools/perf/builtin-stat.c:2537:12
    
    Resolve by clearing 'evsel->bpf_skel' as part of bpf_counter__destroy().
    Suggested-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Signed-off-by: default avatarIan Rogers <irogers@google.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: bpf@vger.kernel.org
    Link: http://lore.kernel.org/lkml/20230411051718.267228-1-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    e0137336
bpf_counter.c 22.4 KB