lkml.org 
[lkml]   [2019]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.3 196/344] kprobes: Prohibit probing on BUG() and WARN() address
    Date
    From: Masami Hiramatsu <mhiramat@kernel.org>

    [ Upstream commit e336b4027775cb458dc713745e526fa1a1996b2a ]

    Since BUG() and WARN() may use a trap (e.g. UD2 on x86) to
    get the address where the BUG() has occurred, kprobes can not
    do single-step out-of-line that instruction. So prohibit
    probing on such address.

    Without this fix, if someone put a kprobe on WARN(), the
    kernel will crash with invalid opcode error instead of
    outputing warning message, because kernel can not find
    correct bug address.

    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
    Cc: David S . Miller <davem@davemloft.net>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Naveen N . Rao <naveen.n.rao@linux.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/156750890133.19112.3393666300746167111.stgit@devnote2
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/linux/bug.h | 5 +++++
    kernel/kprobes.c | 3 ++-
    2 files changed, 7 insertions(+), 1 deletion(-)

    diff --git a/include/linux/bug.h b/include/linux/bug.h
    index fe5916550da8c..f639bd0122f39 100644
    --- a/include/linux/bug.h
    +++ b/include/linux/bug.h
    @@ -47,6 +47,11 @@ void generic_bug_clear_once(void);

    #else /* !CONFIG_GENERIC_BUG */

    +static inline void *find_bug(unsigned long bugaddr)
    +{
    + return NULL;
    +}
    +
    static inline enum bug_trap_type report_bug(unsigned long bug_addr,
    struct pt_regs *regs)
    {
    diff --git a/kernel/kprobes.c b/kernel/kprobes.c
    index d9770a5393c89..ebe8315a756a2 100644
    --- a/kernel/kprobes.c
    +++ b/kernel/kprobes.c
    @@ -1514,7 +1514,8 @@ static int check_kprobe_address_safe(struct kprobe *p,
    /* Ensure it is not in reserved area nor out of text */
    if (!kernel_text_address((unsigned long) p->addr) ||
    within_kprobe_blacklist((unsigned long) p->addr) ||
    - jump_label_text_reserved(p->addr, p->addr)) {
    + jump_label_text_reserved(p->addr, p->addr) ||
    + find_bug((unsigned long)p->addr)) {
    ret = -EINVAL;
    goto out;
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-10-03 19:00    [W:4.130 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site