From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753116AbbFDScr (ORCPT ); Thu, 4 Jun 2015 14:32:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54355 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751632AbbFDSco (ORCPT ); Thu, 4 Jun 2015 14:32:44 -0400 Date: Thu, 4 Jun 2015 20:31:49 +0200 From: Oleg Nesterov To: Tycho Andersen Cc: linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, Kees Cook , Andy Lutomirski , Will Drewry , Roland McGrath , Pavel Emelyanov , "Serge E. Hallyn" Subject: Re: [PATCH v2] seccomp: add ptrace options for suspend/resume Message-ID: <20150604183149.GA560@redhat.com> References: <1433369396-13360-1-git-send-email-tycho.andersen@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1433369396-13360-1-git-send-email-tycho.andersen@canonical.com> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/03, Tycho Andersen wrote: > > @@ -556,6 +557,11 @@ static int ptrace_setoptions(struct task_struct *child, unsigned long data) > if (data & ~(unsigned long)PTRACE_O_MASK) > return -EINVAL; > > +#ifdef CONFIG_CHECKPOINT_RESTORE > + if (data & PTRACE_O_SUSPEND_SECCOMP && !may_suspend_seccomp()) > + return -EPERM; > +#endif > + Well. This -EPERM doesn't look consistent... if config_enabled(CONFIG_CHECKPOINT_RESTORE) == F, we return success but PTRACE_O_SUSPEND_SECCOMP has no effect because of another ifdef in seccomp. OTOH, if CONFIG_SECCOMP=n, this option has no effect too but we return -EPERM even. Also. Suppose that the tracer sets SUSPEND_SECCOMP and then drops CAP_SYS_ADMIN. After that it can't set or clear other ptrace options. So if we really want the security checks (I still think we do not ;) then we should probably check "flags & SUSPEND_SECCOMP" as well. > +#ifdef CONFIG_CHECKPOINT_RESTORE > +bool may_suspend_seccomp(void) > +{ > + if (!capable(CAP_SYS_ADMIN)) > + return false; > + > + if (current->seccomp.mode != SECCOMP_MODE_DISABLED) > + return false; Heh. OK, I won't argue with the new check too ;) Oleg.