linux_dsm_epyc7002/kernel
Yonghong Song 7ae1b1c07f bpf: Fix NULL pointer dereference in bpf_get_local_storage() helper
commit b910eaaaa4b89976ef02e5d6448f3f73dc671d91 upstream.

Jiri Olsa reported a bug ([1]) in kernel where cgroup local
storage pointer may be NULL in bpf_get_local_storage() helper.
There are two issues uncovered by this bug:
  (1). kprobe or tracepoint prog incorrectly sets cgroup local storage
       before prog run,
  (2). due to change from preempt_disable to migrate_disable,
       preemption is possible and percpu storage might be overwritten
       by other tasks.

This issue (1) is fixed in [2]. This patch tried to address issue (2).
The following shows how things can go wrong:
  task 1:   bpf_cgroup_storage_set() for percpu local storage
         preemption happens
  task 2:   bpf_cgroup_storage_set() for percpu local storage
         preemption happens
  task 1:   run bpf program

task 1 will effectively use the percpu local storage setting by task 2
which will be either NULL or incorrect ones.

Instead of just one common local storage per cpu, this patch fixed
the issue by permitting 8 local storages per cpu and each local
storage is identified by a task_struct pointer. This way, we
allow at most 8 nested preemption between bpf_cgroup_storage_set()
and bpf_cgroup_storage_unset(). The percpu local storage slot
is released (calling bpf_cgroup_storage_unset()) by the same task
after bpf program finished running.
bpf_test_run() is also fixed to use the new bpf_cgroup_storage_set()
interface.

The patch is tested on top of [2] with reproducer in [1].
Without this patch, kernel will emit error in 2-3 minutes.
With this patch, after one hour, still no error.

 [1] https://lore.kernel.org/bpf/CAKH8qBuXCfUz=w8L+Fj74OaUpbosO29niYwTki7e3Ag044_aww@mail.gmail.com/T
 [2] https://lore.kernel.org/bpf/20210309185028.3763817-1-yhs@fb.com

Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Roman Gushchin <guro@fb.com>
Link: https://lore.kernel.org/bpf/20210323055146.3334476-1-yhs@fb.com
Cc: <stable@vger.kernel.org> # 5.10.x
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-07-05 18:56:10 +02:00
..
bpf bpf: Fix NULL pointer dereference in bpf_get_local_storage() helper 2024-07-05 18:56:10 +02:00
cgroup cgroup1: fix leaked context root causing sporadic NULL deref in LTP 2021-07-31 08:16:11 +02:00
configs
debug
dma dma-mapping: handle vmalloc addresses in dma_common_{mmap,get_sgtable} 2021-07-28 14:35:38 +02:00
entry
events init: add dsm gpl source 2024-07-05 18:00:04 +02:00
gcov
irq genirq/timings: Prevent potential array overflow in __irq_timings_store() 2024-07-05 18:54:40 +02:00
kcsan kcsan: Fix debugfs initcall return type 2021-05-26 12:06:54 +02:00
livepatch
locking init: add dsm gpl source 2024-07-05 18:00:04 +02:00
power
printk init: add dsm gpl source 2024-07-05 18:00:04 +02:00
rcu rcu-tasks: Don't delete holdouts within trc_wait_for_one_reader() 2021-07-31 08:16:11 +02:00
sched sched/rt: Fix double enqueue caused by rt_effective_prio 2024-07-05 18:52:32 +02:00
time timers: Move clearing of base::timer_running under base:: Lock 2024-07-05 18:52:30 +02:00
trace tracing / histogram: Fix NULL pointer dereference on strcmp() on NULL event name 2024-07-05 18:55:58 +02:00
.gitignore
acct.c
async.c
audit_fsnotify.c
audit_tree.c
audit_watch.c
audit.c
audit.h
auditfilter.c
auditsc.c
backtracetest.c
bounds.c
capability.c
compat.c
configs.c
context_tracking.c
cpu_pm.c
cpu.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
crash_core.c crash_core, vmcoreinfo: append 'SECTION_SIZE_BITS' to vmcoreinfo 2021-06-23 14:42:52 +02:00
crash_dump.c
cred.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
delayacct.c
dma.c
exec_domain.c
exit.c
extable.c
fail_function.c
fork.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
freezer.c
futex.c mm, futex: fix shared futex pgoff on shmem huge page 2021-06-30 08:47:29 -04:00
gen_kheaders.sh
groups.c
hung_task.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
iomem.c
irq_work.c
jump_label.c jump_label: Fix jump_label_text_reserved() vs __init 2021-07-20 16:05:58 +02:00
kallsyms.c
kcmp.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt
kcov.c
kexec_core.c
kexec_elf.c
kexec_file.c kernel: kexec_file: fix error return code of kexec_calculate_store_digests() 2021-05-19 10:13:09 +02:00
kexec_internal.h
kexec.c
kheaders.c
kmod.c
kprobes.c
ksysfs.c
kthread.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
latencytop.c
Makefile init: add dsm gpl source 2024-07-05 18:00:04 +02:00
module_signature.c
module_signing.c
module-internal.h
module.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
notifier.c
nsproxy.c
padata.c
panic.c
params.c
pid_namespace.c
pid.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
profile.c
ptrace.c ptrace: make ptrace() fail if the tracee changed its pid unexpectedly 2021-05-26 12:06:49 +02:00
range.c
reboot.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
regset.c
relay.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
resource.c kernel/resource: make walk_mem_res() find all busy IORESOURCE_MEM resources 2021-05-19 10:13:09 +02:00
rseq.c
scftorture.c
scs.c
seccomp.c seccomp: Fix setting loaded filter count during TSYNC 2024-07-05 18:53:59 +02:00
signal.c
smp.c
smpboot.c sched/core: Initialize the idle task with preemption disabled 2021-07-14 16:55:50 +02:00
smpboot.h
softirq.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
stackleak.c
stacktrace.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
static_call.c static_call: Fix static_call_text_reserved() vs __init 2021-07-20 16:05:58 +02:00
stop_machine.c
syno_bootargs.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
syno-module-internal.h init: add dsm gpl source 2024-07-05 18:00:04 +02:00
sys_ni.c
sys.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
sysctl-test.c
sysctl.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
task_work.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
taskstats.c
test_kprobes.c
torture.c
tracepoint.c tracepoint: Fix static call function vs data state mismatch 2024-07-05 18:52:28 +02:00
tsacct.c
ucount.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
uid16.c
uid16.h
umh.c
up.c
user_namespace.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
user-return-notifier.c
user.c
usermode_driver.c
utsname_sysctl.c
utsname.c
watch_queue.c
watchdog_hld.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
watchdog.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
workqueue_internal.h init: add dsm gpl source 2024-07-05 18:00:04 +02:00
workqueue.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00
workstat.c init: add dsm gpl source 2024-07-05 18:00:04 +02:00