Messages in this thread Patch in this message | | | From | "Masami Hiramatsu (Google)" <> | Subject | [RFC PATCH 1/2] kprobes: Prohibit probing on CFI preamble symbol | Date | Mon, 10 Jul 2023 21:14:24 +0900 |
| |
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Do not allow to probe on "__cfi_" started symbol, because it includes a typeid value in the code for CFI. Probing it will break the typeid checking.
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> --- kernel/kprobes.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 00e177de91cc..ce2e460c1f79 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -1545,6 +1545,20 @@ static int check_ftrace_location(struct kprobe *p) return 0; } +#ifdef CONFIG_CFI_CLANG +static bool is_cfi_preamble_symbol(unsigned long addr) +{ + char symbuf[KSYM_NAME_LEN]; + + if (lookup_symbol_name(addr, symbuf)) + return false; + + return str_has_prefix("__cfi_", symbuf); +} +#else +#define is_cfi_preamble_symbol(addr) (0) +#endif + static int check_kprobe_address_safe(struct kprobe *p, struct module **probed_mod) { @@ -1563,7 +1577,8 @@ static int check_kprobe_address_safe(struct kprobe *p, within_kprobe_blacklist((unsigned long) p->addr) || jump_label_text_reserved(p->addr, p->addr) || static_call_text_reserved(p->addr, p->addr) || - find_bug((unsigned long)p->addr)) { + find_bug((unsigned long)p->addr) || + is_cfi_preamble_symbol((unsigned long)p->addr)) { ret = -EINVAL; goto out; }
| |