Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp3852121pxb; Tue, 17 Nov 2020 05:24:36 -0800 (PST) X-Google-Smtp-Source: ABdhPJxVFzLUjZvX9+gt9jqBMEV/0M+fhszm66TBLWlr65ND/0xu2h7i0hsK07/E/7CDK0er1Bk3 X-Received: by 2002:a17:906:5945:: with SMTP id g5mr2373577ejr.553.1605619476277; Tue, 17 Nov 2020 05:24:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605619476; cv=none; d=google.com; s=arc-20160816; b=Q+86565VakEbgIml7dipZMMVW1q++wVDueN9r/WubNqziEGFkg9TKuVuDaiKBho1v9 SCJgX1iR3ZutQ4Ma+9LRY64nhETTXa7C6yRL0TGxEkmVlaDlrutY6LvR3zoE1YXP7R/b 2NYTZODyVtnPI0l6TKFhy4srtNBQ6wR/lQpiYUHD5i7FbEbNB8WhvkZNjAK3fMRmbA8+ Z6mOtR4VABdZohoutrAJg0LeGVZVSJjpR0RloItW9S2q2pOcw8POzawLeXjF0BDDER9y zcIZSM0wbqgaP3aRmM7rnnUv0xP5yNjHu7uQVV+udaDnikpZ9Kd3prR7eMe42HKSXSHy iCTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=g0VBu2W03eGj84KLEzTMG+WvmG+890ouSuAsOpkfbqE=; b=H6RMK8/hsFyES/4LRXz/hkaZLOGowC/LPJPmkRFIc7OgeJXcxXyaqQGO29qG5FG7V8 FTGcR0/EdkYcdga3PzmcIgKyxv0cFHhj7rT1y5XimGJ99iP4uCZOkCpHc3O06QtUOaKp lan5elH/bHChed7zNNyC5RMrz/XMjPyobImdv8TNYh5+slyzeRfxYJz1lp2RLfGJQhV8 Rq0mCTde8jOLBzswm6Xr3pAxOIBNLQ87sQ4P5ZmVADQ8brOs45k/2NiF7LiP01jdbn8G EEQuHeWp15AWQiMjY5mdpqQC/To+RXxd2XgoKMy4tZ8oy8B31Yf+T6r0Xh9peEzPW3Ak X6+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=GIVDrdOv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cb20si13204124ejb.533.2020.11.17.05.24.12; Tue, 17 Nov 2020 05:24:36 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=GIVDrdOv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730420AbgKQNW3 (ORCPT + 99 others); Tue, 17 Nov 2020 08:22:29 -0500 Received: from mail.kernel.org ([198.145.29.99]:56718 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731152AbgKQNWZ (ORCPT ); Tue, 17 Nov 2020 08:22:25 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3239D20781; Tue, 17 Nov 2020 13:22:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605619344; bh=KHn3RhwjyQbi38Gi+FYZ/M9+a3nfBZ+xHDlwTFjzmC4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GIVDrdOvj2mCx4p8/dh4i6+BSoL+pwga+Qom8V7V73K1wHFqloXEJn88RIBL3t3/Q ScpVTjI4EFZLF777C3dAImUm/fae1WTAasmBq2M8crTY/Iv7BX6C2wN5Jc9MkOd79P pTS5ATrz4y8yNGEf+KzrN/kEsVgU8YE10cMxJJXc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "Eric W. Biederman" , Al Viro Subject: [PATCH 4.19 081/101] dont dump the threads that had been already exiting when zapped. Date: Tue, 17 Nov 2020 14:05:48 +0100 Message-Id: <20201117122117.069061597@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201117122113.128215851@linuxfoundation.org> References: <20201117122113.128215851@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Al Viro commit 77f6ab8b7768cf5e6bdd0e72499270a0671506ee upstream. Coredump logics needs to report not only the registers of the dumping thread, but (since 2.5.43) those of other threads getting killed. Doing that might require extra state saved on the stack in asm glue at kernel entry; signal delivery logics does that (we need to be able to save sigcontext there, at the very least) and so does seccomp. That covers all callers of do_coredump(). Secondary threads get hit with SIGKILL and caught as soon as they reach exit_mm(), which normally happens in signal delivery, so those are also fine most of the time. Unfortunately, it is possible to end up with secondary zapped when it has already entered exit(2) (or, worse yet, is oopsing). In those cases we reach exit_mm() when mm->core_state is already set, but the stack contents is not what we would have in signal delivery. At least on two architectures (alpha and m68k) it leads to infoleaks - we end up with a chunk of kernel stack written into coredump, with the contents consisting of normal C stack frames of the call chain leading to exit_mm() instead of the expected copy of userland registers. In case of alpha we leak 312 bytes of stack. Other architectures (including the regset-using ones) might have similar problems - the normal user of regsets is ptrace and the state of tracee at the time of such calls is special in the same way signal delivery is. Note that had the zapper gotten to the exiting thread slightly later, it wouldn't have been included into coredump anyway - we skip the threads that have already cleared their ->mm. So let's pretend that zapper always loses the race. IOW, have exit_mm() only insert into the dumper list if we'd gotten there from handling a fatal signal[*] As the result, the callers of do_exit() that have *not* gone through get_signal() are not seen by coredump logics as secondary threads. Which excludes voluntary exit()/oopsen/traps/etc. The dumper thread itself is unaffected by that, so seccomp is fine. [*] originally I intended to add a new flag in tsk->flags, but ebiederman pointed out that PF_SIGNALED is already doing just what we need. Cc: stable@vger.kernel.org Fixes: d89f3847def4 ("[PATCH] thread-aware coredumps, 2.5.43-C3") History-tree: https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git Acked-by: "Eric W. Biederman" Signed-off-by: Al Viro Signed-off-by: Greg Kroah-Hartman --- kernel/exit.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) --- a/kernel/exit.c +++ b/kernel/exit.c @@ -517,7 +517,10 @@ static void exit_mm(void) up_read(&mm->mmap_sem); self.task = current; - self.next = xchg(&core_state->dumper.next, &self); + if (self.task->flags & PF_SIGNALED) + self.next = xchg(&core_state->dumper.next, &self); + else + self.task = NULL; /* * Implies mb(), the result of xchg() must be visible * to core_state->dumper.