All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Kees Cook <keescook@chromium.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Andy Lutomirski <luto@amacapital.net>,
	"Michael Kerrisk (man-pages)" <mtk.manpages@gmail.com>,
	Alexei Starovoitov <ast@plumgrid.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Daniel Borkmann <dborkman@redhat.com>,
	Will Drewry <wad@chromium.org>, Julien Tinnes <jln@chromium.org>,
	David Drysdale <drysdale@google.com>,
	Linux API <linux-api@vger.kernel.org>,
	"x86@kernel.org" <x86@kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	linux-mips@linux-mips.org,
	linux-arch <linux-arch@vger.kernel.org>,
	linux-security-module <linux-security-module@vger.kernel.org>
Subject: Re: [PATCH v9 11/11] seccomp: implement SECCOMP_FILTER_FLAG_TSYNC
Date: Thu, 10 Jul 2014 17:08:32 +0200	[thread overview]
Message-ID: <20140710150832.GA20861@redhat.com> (raw)
In-Reply-To: <CAGXu5jLUqz-T1tRBCpPLkzWijyAF-Vjw_7PnQ1EvUh4urwyaUg@mail.gmail.com>

On 07/10, Kees Cook wrote:
>
> On Wed, Jul 9, 2014 at 11:05 AM, Oleg Nesterov <oleg@redhat.com> wrote:
> >
> >> +     /*
> >> +      * Make sure we cannot change seccomp or nnp state via TSYNC
> >> +      * while another thread is in the middle of calling exec.
> >> +      */
> >> +     if (flags & SECCOMP_FILTER_FLAG_TSYNC &&
> >> +         mutex_lock_killable(&current->signal->cred_guard_mutex))
> >> +             goto out_free;
> >
> > -EINVAL looks a bit confusing in this case, but this is cosemtic because
> > userspace won't see this error-code anyway.
>
> Happy to use whatever since, as you say, it's cosmetic. Perhaps -EAGAIN?

Or -EINTR. I do not really mind, I only mentioned this because I had another
nit.

> >>       spin_lock_irq(&current->sighand->siglock);
> >> +     if (unlikely(signal_group_exit(current->signal))) {
> >> +             /* If thread is dying, return to process the signal. */
> >
> > OK, this doesn't hurt, but why?
> >
> > You could check __fatal_signal_pending() with the same effect. And since
> > we hold this mutex, exec (de_thread) can be the source of that SIGKILL.
> > We take this mutex specially to avoid the race with exec.
> >
> > So why do we need to abort if we race with kill() or exit_grouo() ?
>
> In my initial code inspection that we could block waiting for the
> cred_guard mutex, with exec holding it, exec would schedule death in
> de_thread, and then once it released, the tsync thread would try to
> keep running.
>
> However, in looking at this again, now I'm concerned this produces a
> dead-lock in de_thread, since it waits for all threads to actually
> die, but tsync will be waiting with the killable mutex.

That is why you should always use _killable (or _interruptible) if you
want to take ->cred_guard_mutex.

If this thread races with de_thread() which holds this mutex, it will
be killed and mutex_lock_killable() will fail.

(to clarify; this deadlock is not "fatal", de_thread() can be killed too,
 but this doesn't really matter).

> So I think I got too defensive when I read the top of de_thread where
> it checks for pending signals itself.
>
> It seems like I can just safely remove the singal_group_exit checks?
> The other paths (non-tsync seccomp_set_mode_filter, and
> seccomp_set_mode_strict)

Yes, I missed another signal_group_exit() in seccomp_set_mode_strict().
It looks equally unneeded.

> I can't decide which feels cleaner: just letting stuff
> clean up naturally on death or to short-circuit after taking
> sighand->siglock.

I'd prefer to simply remove the singal_group_exit checks.

I won't argue if you prefer to keep them, but then please add a comment
to explain that this is not needed for correctness.

Because otherwise the code looks confusing, as if there is a subtle reason
why we must not do this if killed.

Oleg.

WARNING: multiple messages have this Message-ID (diff)
From: oleg@redhat.com (Oleg Nesterov)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v9 11/11] seccomp: implement SECCOMP_FILTER_FLAG_TSYNC
Date: Thu, 10 Jul 2014 17:08:32 +0200	[thread overview]
Message-ID: <20140710150832.GA20861@redhat.com> (raw)
In-Reply-To: <CAGXu5jLUqz-T1tRBCpPLkzWijyAF-Vjw_7PnQ1EvUh4urwyaUg@mail.gmail.com>

On 07/10, Kees Cook wrote:
>
> On Wed, Jul 9, 2014 at 11:05 AM, Oleg Nesterov <oleg@redhat.com> wrote:
> >
> >> +     /*
> >> +      * Make sure we cannot change seccomp or nnp state via TSYNC
> >> +      * while another thread is in the middle of calling exec.
> >> +      */
> >> +     if (flags & SECCOMP_FILTER_FLAG_TSYNC &&
> >> +         mutex_lock_killable(&current->signal->cred_guard_mutex))
> >> +             goto out_free;
> >
> > -EINVAL looks a bit confusing in this case, but this is cosemtic because
> > userspace won't see this error-code anyway.
>
> Happy to use whatever since, as you say, it's cosmetic. Perhaps -EAGAIN?

Or -EINTR. I do not really mind, I only mentioned this because I had another
nit.

> >>       spin_lock_irq(&current->sighand->siglock);
> >> +     if (unlikely(signal_group_exit(current->signal))) {
> >> +             /* If thread is dying, return to process the signal. */
> >
> > OK, this doesn't hurt, but why?
> >
> > You could check __fatal_signal_pending() with the same effect. And since
> > we hold this mutex, exec (de_thread) can be the source of that SIGKILL.
> > We take this mutex specially to avoid the race with exec.
> >
> > So why do we need to abort if we race with kill() or exit_grouo() ?
>
> In my initial code inspection that we could block waiting for the
> cred_guard mutex, with exec holding it, exec would schedule death in
> de_thread, and then once it released, the tsync thread would try to
> keep running.
>
> However, in looking at this again, now I'm concerned this produces a
> dead-lock in de_thread, since it waits for all threads to actually
> die, but tsync will be waiting with the killable mutex.

That is why you should always use _killable (or _interruptible) if you
want to take ->cred_guard_mutex.

If this thread races with de_thread() which holds this mutex, it will
be killed and mutex_lock_killable() will fail.

(to clarify; this deadlock is not "fatal", de_thread() can be killed too,
 but this doesn't really matter).

> So I think I got too defensive when I read the top of de_thread where
> it checks for pending signals itself.
>
> It seems like I can just safely remove the singal_group_exit checks?
> The other paths (non-tsync seccomp_set_mode_filter, and
> seccomp_set_mode_strict)

Yes, I missed another signal_group_exit() in seccomp_set_mode_strict().
It looks equally unneeded.

> I can't decide which feels cleaner: just letting stuff
> clean up naturally on death or to short-circuit after taking
> sighand->siglock.

I'd prefer to simply remove the singal_group_exit checks.

I won't argue if you prefer to keep them, but then please add a comment
to explain that this is not needed for correctness.

Because otherwise the code looks confusing, as if there is a subtle reason
why we must not do this if killed.

Oleg.

  reply	other threads:[~2014-07-10 15:08 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-27 23:22 [PATCH v9 0/11] seccomp: add thread sync ability Kees Cook
2014-06-27 23:22 ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 01/11] seccomp: create internal mode-setting function Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 02/11] seccomp: extract check/assign mode helpers Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 03/11] seccomp: split mode setting routines Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 04/11] seccomp: add "seccomp" syscall Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 05/11] ARM: add seccomp syscall Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 06/11] MIPS: " Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 07/11] sched: move no_new_privs into new atomic flags Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 08/11] seccomp: split filter prep from check and apply Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22 ` [PATCH v9 09/11] seccomp: introduce writer locking Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-07-09 18:42   ` Oleg Nesterov
2014-07-09 18:42     ` Oleg Nesterov
2014-07-09 18:55     ` Oleg Nesterov
2014-07-09 18:55       ` Oleg Nesterov
2014-07-10  9:25       ` Kees Cook
2014-07-10  9:25         ` Kees Cook
2014-07-10 15:24         ` Oleg Nesterov
2014-07-10 15:24           ` Oleg Nesterov
2014-07-10 16:54           ` Kees Cook
2014-07-10 16:54             ` Kees Cook
2014-07-10 17:35             ` Oleg Nesterov
2014-07-10 17:35               ` Oleg Nesterov
2014-07-09 18:59   ` Oleg Nesterov
2014-07-09 18:59     ` Oleg Nesterov
2014-06-27 23:22 ` [PATCH v9 10/11] seccomp: allow mode setting across threads Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:22   ` Kees Cook
2014-06-27 23:23 ` [PATCH v9 11/11] seccomp: implement SECCOMP_FILTER_FLAG_TSYNC Kees Cook
2014-06-27 23:23   ` Kees Cook
2014-06-27 23:23   ` Kees Cook
2014-07-09 18:05   ` Oleg Nesterov
2014-07-09 18:05     ` Oleg Nesterov
2014-07-10  9:17     ` Kees Cook
2014-07-10  9:17       ` Kees Cook
2014-07-10 15:08       ` Oleg Nesterov [this message]
2014-07-10 15:08         ` Oleg Nesterov
     [not found]         ` <20140710150832.GA20861-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2014-07-10 16:03           ` Kees Cook
2014-07-10 16:03             ` Kees Cook
2014-07-10 16:03             ` Kees Cook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140710150832.GA20861@redhat.com \
    --to=oleg@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=ast@plumgrid.com \
    --cc=dborkman@redhat.com \
    --cc=drysdale@google.com \
    --cc=jln@chromium.org \
    --cc=keescook@chromium.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@linux-mips.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=mtk.manpages@gmail.com \
    --cc=wad@chromium.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.