Re: [PATCH v6 4/4] x86/kasan: Print original address on #GP

From: Borislav Petkov
Date: Wed Dec 11 2019 - 12:37:16 EST


On Mon, Dec 09, 2019 at 03:31:20PM +0100, Jann Horn wrote:
> arch/x86/kernel/traps.c | 12 ++++++++++-
> arch/x86/mm/kasan_init_64.c | 21 -------------------
> include/linux/kasan.h | 6 ++++++
> mm/kasan/report.c | 40 +++++++++++++++++++++++++++++++++++++
> 4 files changed, 57 insertions(+), 22 deletions(-)

I need a KASAN person ACK here, I'd guess.

> diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
> index c8b4ae6aed5b..7813592b4fb3 100644
> --- a/arch/x86/kernel/traps.c
> +++ b/arch/x86/kernel/traps.c
> @@ -37,6 +37,7 @@
> #include <linux/mm.h>
> #include <linux/smp.h>
> #include <linux/io.h>
> +#include <linux/kasan.h>
> #include <asm/stacktrace.h>
> #include <asm/processor.h>
> #include <asm/debugreg.h>
> @@ -589,6 +590,8 @@ do_general_protection(struct pt_regs *regs, long error_code)
> if (!user_mode(regs)) {
> enum kernel_gp_hint hint = GP_NO_HINT;
> unsigned long gp_addr;
> + unsigned long flags;
> + int sig;
>
> if (fixup_exception(regs, X86_TRAP_GP, error_code, 0))
> return;
> @@ -621,7 +624,14 @@ do_general_protection(struct pt_regs *regs, long error_code)
> "maybe for address",
> gp_addr);
>
> - die(desc, regs, error_code);
> + flags = oops_begin();
> + sig = SIGSEGV;
> + __die_header(desc, regs, error_code);
> + if (hint == GP_NON_CANONICAL)
> + kasan_non_canonical_hook(gp_addr);
> + if (__die_body(desc, regs, error_code))
> + sig = 0;
> + oops_end(flags, regs, sig);

Instead of opencoding it like this, can we add a

die_addr(desc, regs, error_code, gp_addr);

to arch/x86/kernel/dumpstack.c and call it from here:

if (hint != GP_NON_CANONICAL)
gp_addr = 0;

die_addr(desc, regs, error_code, gp_addr);

This way you won't need to pass down to die_addr() the hint too - you
code into gp_addr whether it was non-canonical or not.

The

+ if (addr < KASAN_SHADOW_OFFSET)
+ return;

check in kasan_non_canonical_hook() would then catch it when addr == 0.

Hmmm?

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette