Commit ebd3076
bpf: Fix invalid mem access when update_effective_progs fails in __cgroup_bpf_detach
Syzkaller triggers an invalid memory access issue following fault
injection in update_effective_progs. The issue can be described as
follows:
__cgroup_bpf_detach
update_effective_progs
compute_effective_progs
bpf_prog_array_alloc <-- fault inject
purge_effective_progs
/* change to dummy_bpf_prog */
array->items[index] = &dummy_bpf_prog.prog
---softirq start---
__do_softirq
...
__cgroup_bpf_run_filter_skb
__bpf_prog_run_save_cb
bpf_prog_run
stats = this_cpu_ptr(prog->stats)
/* invalid memory access */
flags = u64_stats_update_begin_irqsave(&stats->syncp)
---softirq end---
static_branch_dec(&cgroup_bpf_enabled_key[atype])
The reason is that fault injection caused update_effective_progs to fail
and then changed the original prog into dummy_bpf_prog.prog in
purge_effective_progs. Then a softirq came, and accessing the stats of
dummy_bpf_prog.prog in the softirq triggers invalid mem access.
To fix it, we can use static per-cpu variable to initialize the stats
of dummy_bpf_prog.prog.
Fixes: 4c46091 ("bpf: Fix KASAN use-after-free Read in compute_effective_progs")
Signed-off-by: Pu Lehui <[email protected]>1 parent 81a7a08 commit ebd3076
1 file changed
+3
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2536 | 2536 | | |
2537 | 2537 | | |
2538 | 2538 | | |
| 2539 | + | |
| 2540 | + | |
2539 | 2541 | | |
2540 | 2542 | | |
2541 | 2543 | | |
2542 | 2544 | | |
2543 | 2545 | | |
| 2546 | + | |
2544 | 2547 | | |
2545 | 2548 | | |
2546 | 2549 | | |
| |||
0 commit comments