lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 044/879] ptrace: Reimplement PTRACE_KILL by always sending SIGKILL
    Date
    From: Eric W. Biederman <ebiederm@xmission.com>

    commit 6a2d90ba027adba528509ffa27097cffd3879257 upstream.

    The current implementation of PTRACE_KILL is buggy and has been for
    many years as it assumes it's target has stopped in ptrace_stop. At a
    quick skim it looks like this assumption has existed since ptrace
    support was added in linux v1.0.

    While PTRACE_KILL has been deprecated we can not remove it as
    a quick search with google code search reveals many existing
    programs calling it.

    When the ptracee is not stopped at ptrace_stop some fields would be
    set that are ignored except in ptrace_stop. Making the userspace
    visible behavior of PTRACE_KILL a noop in those case.

    As the usual rules are not obeyed it is not clear what the
    consequences are of calling PTRACE_KILL on a running process.
    Presumably userspace does not do this as it achieves nothing.

    Replace the implementation of PTRACE_KILL with a simple
    send_sig_info(SIGKILL) followed by a return 0. This changes the
    observable user space behavior only in that PTRACE_KILL on a process
    not stopped in ptrace_stop will also kill it. As that has always
    been the intent of the code this seems like a reasonable change.

    Cc: stable@vger.kernel.org
    Reported-by: Al Viro <viro@zeniv.linux.org.uk>
    Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
    Tested-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: Oleg Nesterov <oleg@redhat.com>
    Link: https://lkml.kernel.org/r/20220505182645.497868-7-ebiederm@xmission.com
    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/kernel/step.c | 3 +--
    kernel/ptrace.c | 5 ++---
    2 files changed, 3 insertions(+), 5 deletions(-)

    --- a/arch/x86/kernel/step.c
    +++ b/arch/x86/kernel/step.c
    @@ -180,8 +180,7 @@ void set_task_blockstep(struct task_stru
    *
    * NOTE: this means that set/clear TIF_BLOCKSTEP is only safe if
    * task is current or it can't be running, otherwise we can race
    - * with __switch_to_xtra(). We rely on ptrace_freeze_traced() but
    - * PTRACE_KILL is not safe.
    + * with __switch_to_xtra(). We rely on ptrace_freeze_traced().
    */
    local_irq_disable();
    debugctl = get_debugctlmsr();
    --- a/kernel/ptrace.c
    +++ b/kernel/ptrace.c
    @@ -1236,9 +1236,8 @@ int ptrace_request(struct task_struct *c
    return ptrace_resume(child, request, data);

    case PTRACE_KILL:
    - if (child->exit_state) /* already dead */
    - return 0;
    - return ptrace_resume(child, request, SIGKILL);
    + send_sig_info(SIGKILL, SEND_SIG_NOINFO, child);
    + return 0;

    #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
    case PTRACE_GETREGSET:

    \
     
     \ /
      Last update: 2022-06-07 23:59    [W:2.067 / U:1.352 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site