lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 3 Nov 2017 19:42:06 +0100
From:   Oleg Nesterov <>
To:     Andrew Morton <>,
        "Eric W. Biederman" <>
Cc:, Robert O'Callahan <>,
        Kees Cook <>,
        Andy Lutomirski <>,
        Dmitry Vyukov <>,
        Kyle Huey <>,
Subject: [PATCH 1/3] protect the traced SIGNAL_UNKILLABLE tasks from SIGKILL

The comment in sig_ignored() says "Tracers may want to know about
even ignored signals" but SIGKILL can not be reported to debugger
and it is just wrong to return 0 in this case: SIGKILL should only
kill the SIGNAL_UNKILLABLE task if it comes from the parent ns.

Change sig_ignored() to ignore ->ptrace if sig == SIGKILL and rely
on sig_task_ignored().

SISGTOP coming from within the namespace is not really right too
but at least debugger can intercept it, and we can't drop it here
because this will break "gdb -p 1": ptrace_attach() won't work.
Perhaps we will add another ->ptrace check later, we will see.

Signed-off-by: Oleg Nesterov <>
 kernel/signal.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/kernel/signal.c b/kernel/signal.c
index 800a18f..b9aebe1 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -94,13 +94,15 @@ static int sig_ignored(struct task_struct *t, int sig, bool force)
 	if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
 		return 0;
-	if (!sig_task_ignored(t, sig, force))
-		return 0;
-	 * Tracers may want to know about even ignored signals.
+	 * Tracers may want to know about even ignored signal unless it
+	 * is SIGKILL which can't be reported anyway but can be ignored
-	return !t->ptrace;
+	if (t->ptrace && sig != SIGKILL)
+		return 0;
+	return sig_task_ignored(t, sig, force);

Powered by blists - more mailing lists