lists.openwall.net   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  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230929174442.1635558-1-bgeffon@google.com>
Date:   Fri, 29 Sep 2023 13:44:42 -0400
From:   Brian Geffon <bgeffon@...gle.com>
To:     Christian Brauner <brauner@...nel.org>,
        Kees Cook <keescook@...omium.org>
Cc:     "Rafael J . Wysocki" <rafael@...nel.org>,
        Matthias Kaehlcke <mka@...omium.org>,
        Luis Chamberlain <mcgrof@...nel.org>,
        Frederic Weisbecker <frederic@...nel.org>,
        linux-kernel@...r.kernel.org, Brian Geffon <bgeffon@...gle.com>
Subject: [PATCH] pid: Allow frozen userspace to reboot from non-init pid ns

When the system has a frozen userspace, for example, during hibernation
the child reaper task will also be frozen. Attmepting to deliver a
signal to it to handle the reboot(2) will ultimately lead to the system
hanging unless userspace is thawed.

This change checks if the current task is the suspending task and if so
it will allow it to proceed with a reboot from the non-init pid ns.

Signed-off-by: Brian Geffon <bgeffon@...gle.com>
Reported-by: Matthias Kaehlcke <mka@...omium.org>
Tested-by: Matthias Kaehlcke <mka@...omium.org>
---
 kernel/pid_namespace.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c
index 0bf44afe04dd..4a93a5063eda 100644
--- a/kernel/pid_namespace.c
+++ b/kernel/pid_namespace.c
@@ -321,6 +321,15 @@ int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd)
 	if (pid_ns == &init_pid_ns)
 		return 0;
 
+	if (current->flags & PF_SUSPEND_TASK) {
+		/*
+		 * Attempting to signal the child_reaper won't work if it's
+		 * frozen. In this case we shutdown the system as if we were in
+		 * the init_pid_ns.
+		 */
+		return 0;
+	}
+
 	switch (cmd) {
 	case LINUX_REBOOT_CMD_RESTART2:
 	case LINUX_REBOOT_CMD_RESTART:
-- 
2.42.0.582.g8ccd20d70d-goog

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ