OpenCloudOS-Kernel/arch/csky/kernel
Stephen Brennan ae0d1ea3e8 kprobe/ftrace: bail out if ftrace was killed
[ Upstream commit 1a7d0890dd4a502a202aaec792a6c04e6e049547 ]

If an error happens in ftrace, ftrace_kill() will prevent disarming
kprobes. Eventually, the ftrace_ops associated with the kprobes will be
freed, yet the kprobes will still be active, and when triggered, they
will use the freed memory, likely resulting in a page fault and panic.

This behavior can be reproduced quite easily, by creating a kprobe and
then triggering a ftrace_kill(). For simplicity, we can simulate an
ftrace error with a kernel module like [1]:

[1]: https://github.com/brenns10/kernel_stuff/tree/master/ftrace_killer

  sudo perf probe --add commit_creds
  sudo perf trace -e probe:commit_creds
  # In another terminal
  make
  sudo insmod ftrace_killer.ko  # calls ftrace_kill(), simulating bug
  # Back to perf terminal
  # ctrl-c
  sudo perf probe --del commit_creds

After a short period, a page fault and panic would occur as the kprobe
continues to execute and uses the freed ftrace_ops. While ftrace_kill()
is supposed to be used only in extreme circumstances, it is invoked in
FTRACE_WARN_ON() and so there are many places where an unexpected bug
could be triggered, yet the system may continue operating, possibly
without the administrator noticing. If ftrace_kill() does not panic the
system, then we should do everything we can to continue operating,
rather than leave a ticking time bomb.

Link: https://lore.kernel.org/all/20240501162956.229427-1-stephen.s.brennan@oracle.com/

Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Acked-by: Guo Ren <guoren@kernel.org>
Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-06-27 13:49:03 +02:00
..
probes kprobe/ftrace: bail out if ftrace was killed 2024-06-27 13:49:03 +02:00
vdso csky: Fixup -Wmissing-prototypes warning 2023-08-10 23:06:32 -04:00
Makefile kbuild: use obj-y instead extra-y for objects placed at the head 2022-10-02 18:04:05 +09:00
asm-offsets.c uaccess: remove CONFIG_SET_FS 2022-02-25 09:36:06 +01:00
atomic.S csky: Remove prologue of page fault handler in entry.S 2021-01-12 09:52:40 +08:00
cpu-probe.c csky: Exception handling and mm-fault 2018-10-25 23:36:19 +08:00
entry.S Revert "csky: Add support for restartable sequence" 2022-11-11 04:59:28 -05:00
ftrace.c ftrace: Cleanup ftrace_dyn_arch_init() 2021-10-08 19:41:39 -04:00
head.S csky: Add memory layout 2.5G(user):1.5G(kernel) 2021-01-12 09:52:40 +08:00
io.c csky: optimize memcpy_{from,to}io() and memset_io() 2022-04-18 21:23:55 +08:00
irq.c irq: csky: perform irqentry in entry code 2021-10-26 10:13:27 +01:00
jump_label.c csky: Add jump-label implementation 2022-07-30 11:12:03 -04:00
module.c csky: fix old style declaration in module.c 2023-07-29 19:25:46 -04:00
perf_callchain.c uaccess: fix type mismatch warnings from access_ok() 2022-02-25 09:36:05 +01:00
perf_event.c csky: Add VDSO with GENERIC_GETTIMEOFDAY, GENERIC_TIME_VSYSCALL, HAVE_GENERIC_VDSO 2021-02-27 16:35:09 +08:00
perf_regs.c perf/arch: Remove perf_sample_data::regs_user_copy 2020-11-09 18:12:34 +01:00
power.c csky: Use do_kernel_power_off() 2022-05-19 19:30:30 +02:00
process.c arch/idle: Change arch_cpu_idle() behavior: always exit with IRQs disabled 2023-01-13 11:48:15 +01:00
ptrace.c ptrace: Create ptrace_report_syscall_{entry,exit} in ptrace.h 2022-03-10 13:35:08 -06:00
setup.c csky: Correct position of _stext 2022-07-22 21:36:14 -04:00
signal.c Revert "csky: Add support for restartable sequence" 2022-11-11 04:59:28 -05:00
smp.c csky/smp: Switch to hotplug core state synchronization 2023-05-15 13:44:58 +02:00
stacktrace.c csky: add arch support current_stack_pointer 2022-10-21 23:52:29 -04:00
syscall.c csky: System Call 2018-10-25 23:36:19 +08:00
syscall_table.c csky: System Call 2018-10-25 23:36:19 +08:00
time.c csky: Replace <linux/clk-provider.h> by <linux/of_clk.h> 2020-02-23 12:48:55 +08:00
traps.c Merge branch 'signal-for-v5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace 2022-01-17 05:49:30 +02:00
vdso.c csky: Add VDSO with GENERIC_GETTIMEOFDAY, GENERIC_TIME_VSYSCALL, HAVE_GENERIC_VDSO 2021-02-27 16:35:09 +08:00
vmlinux.lds.S objtool/idle: Validate __cpuidle code as noinstr 2023-01-13 11:48:15 +01:00