lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 683/779] x86/kprobes: Update kcb status flag after singlestepping
    Date
    From: Masami Hiramatsu (Google) <mhiramat@kernel.org>

    commit dec8784c9088b131a1523f582c2194cfc8107dc0 upstream.

    Fix kprobes to update kcb (kprobes control block) status flag to
    KPROBE_HIT_SSDONE even if the kp->post_handler is not set.

    This bug may cause a kernel panic if another INT3 user runs right
    after kprobes because kprobe_int3_handler() misunderstands the
    INT3 is kprobe's single stepping INT3.

    Fixes: 6256e668b7af ("x86/kprobes: Use int3 instead of debug trap for single-step")
    Reported-by: Daniel Müller <deso@posteo.net>
    Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Tested-by: Daniel Müller <deso@posteo.net>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/all/20220727210136.jjgc3lpqeq42yr3m@muellerd-fedora-PC2BDTX9
    Link: https://lore.kernel.org/r/165942025658.342061.12452378391879093249.stgit@devnote2
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/kernel/kprobes/core.c | 18 +++++++++++-------
    1 file changed, 11 insertions(+), 7 deletions(-)

    --- a/arch/x86/kernel/kprobes/core.c
    +++ b/arch/x86/kernel/kprobes/core.c
    @@ -816,16 +816,20 @@ NOKPROBE_SYMBOL(arch_prepare_kretprobe);
    static void kprobe_post_process(struct kprobe *cur, struct pt_regs *regs,
    struct kprobe_ctlblk *kcb)
    {
    - if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) {
    - kcb->kprobe_status = KPROBE_HIT_SSDONE;
    - cur->post_handler(cur, regs, 0);
    - }
    -
    /* Restore back the original saved kprobes variables and continue. */
    - if (kcb->kprobe_status == KPROBE_REENTER)
    + if (kcb->kprobe_status == KPROBE_REENTER) {
    + /* This will restore both kcb and current_kprobe */
    restore_previous_kprobe(kcb);
    - else
    + } else {
    + /*
    + * Always update the kcb status because
    + * reset_curent_kprobe() doesn't update kcb.
    + */
    + kcb->kprobe_status = KPROBE_HIT_SSDONE;
    + if (cur->post_handler)
    + cur->post_handler(cur, regs, 0);
    reset_current_kprobe();
    + }
    }
    NOKPROBE_SYMBOL(kprobe_post_process);


    \
     
     \ /
      Last update: 2022-08-15 21:48    [W:3.960 / U:0.496 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site