From: Oleg Nesterov <oleg@redhat.com>
To: Andrei Vagin <avagin@google.com>
Cc: Kees Cook <keescook@chromium.org>,
Tycho Andersen <tandersen@netflix.com>,
Andy Lutomirski <luto@amacapital.net>,
Will Drewry <wad@chromium.org>, Jens Axboe <axboe@kernel.dk>,
Christian Brauner <brauner@kernel.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] seccomp: release task filters when the task exits
Date: Thu, 16 May 2024 11:34:27 +0200 [thread overview]
Message-ID: <20240516093427.GA19105@redhat.com> (raw)
In-Reply-To: <CAEWA0a5dBvRwGAnztL56i=JV-WGGiaTd-GdJYdOxZmq1c+bdpg@mail.gmail.com>
(add lkml)
On 05/15, Andrei Vagin wrote:
>
> On Wed, May 15, 2024 at 5:52 AM Oleg Nesterov <oleg@redhat.com> wrote:
> >
> > Let me repeat I forgot everything about seccomp, but let me ask
> > a couple of questions...
>
> It seems you still remember something:). Thank you for the feedback.
Just I am still remember how to use grep ;)
> > > @@ -2126,6 +2137,11 @@ static struct seccomp_filter *get_nth_filter(struct task_struct *task,
> > > */
> > > spin_lock_irq(&task->sighand->siglock);
> > >
> > > + if (task->flags & PF_EXITING) {
> > > + spin_unlock_irq(&task->sighand->siglock);
> > > + return ERR_PTR(-EINVAL);
> > > + }
> >
> > Why do we need the PF_EXITING check here?
> >
> > This looks unnecessary even if get_nth_filter() could race with the
> > exiting task, but this doesn't matter.
> >
> > This race is not possible, get_nth_filter() is only called from ptrace()
> > paths, but the tracee can't stop in TASK_TRACED after exit_signals() which
> > sets PF_EXITING.
>
> If we rely on using seccomp_get_filter only from ptrace, you are right.
Plus it too does __get_seccomp_filter/__get_seccomp_filter, so I guess it
should be safe without this check even if it could be used outside of ptrace.
Just like proc_pid_seccomp_cache(), see below.
> > > @@ -2494,6 +2510,11 @@ int proc_pid_seccomp_cache(struct seq_file *m, struct pid_namespace *ns,
> > > if (!lock_task_sighand(task, &flags))
> > > return -ESRCH;
> > >
> > > + if (thread->flags & PF_EXITING) {
> > > + unlock_task_sighand(task, &flags);
> > > + return 0;
> >
> > Again, do we really need this check?
> >
> > It can race with the exiting task and (without this check) do
> > __get_seccomp_filter(f) right before seccomp_filter_release()
> > takes sighand->siglock. But why is it bad?
>
> I think you are right, this check isn't required.
>
> >
> > OTOH. I guess proc_pid_seccomp_cache() is the only reason why
> > seccomp_filter_release() takes ->siglock with your patch?
>
> seccomp_sync_threads and seccomp_can_sync_threads should be considered too.
Yes. But we only need to consider them in the multi-thread case, right?
In this case exit_signals() sets PF_EXITING under ->siglock, so they can't
miss this flag, seccomp_filter_release() doesn't need to take siglock.
> If we check PF_EXITING in all of them, we don't need to take ->siglock in
> seccomp_filter_release. Does it sound right?
The problem is a single-threaded exiting task. In this case exit_signals()
sets PF_EXITING lockless. This means that in this case
- proc_pid_seccomp_cache() can't rely on the PF_EXITING check
but it can be safely removed.
- seccomp_filter_release() needs to take ->siglock to avoid the
race with proc_pid_seccomp_cache().
And this chunk from your patch
static void __seccomp_filter_orphan(struct seccomp_filter *orig)
{
+ lockdep_assert_held(¤t->sighand->siglock);
+
looks unnecessary too, seccomp_filter_release() can just do
spin_lock_irq(siglock);
orig = tsk->seccomp.filter;
tsk->seccomp.filter = NULL;
spin_unlock_irq(siglock);
__seccomp_filter_release(orig);
Right?
Oleg.
next parent reply other threads:[~2024-05-16 9:36 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20240514175551.297237-1-avagin@google.com>
[not found] ` <20240514175551.297237-3-avagin@google.com>
[not found] ` <20240515125113.GC6821@redhat.com>
[not found] ` <CAEWA0a5dBvRwGAnztL56i=JV-WGGiaTd-GdJYdOxZmq1c+bdpg@mail.gmail.com>
2024-05-16 9:34 ` Oleg Nesterov [this message]
2024-05-16 13:09 ` [PATCH 2/3] seccomp: release task filters when the task exits Oleg Nesterov
2024-05-22 6:49 ` Andrei Vagin
2024-05-22 7:06 ` Andrei Vagin
2024-05-22 10:35 ` Oleg Nesterov
2024-05-23 1:45 [PATCH 0/3 v2] seccomp: improve handling of SECCOMP_IOCTL_NOTIF_RECV Andrei Vagin
2024-05-23 1:45 ` [PATCH 2/3] seccomp: release task filters when the task exits Andrei Vagin
2024-05-23 9:00 ` Oleg Nesterov
2024-06-26 18:57 ` 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=20240516093427.GA19105@redhat.com \
--to=oleg@redhat.com \
--cc=avagin@google.com \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=tandersen@netflix.com \
--cc=wad@chromium.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.