Thread (29 messages) 29 messages, 5 authors, 2018-10-13

Re: [PATCH v7 3/6] seccomp: add a way to get a listener fd from ptrace

From: Jann Horn <jannh@google.com>
Date: 2018-10-13 03:40:36
Also in: linux-api, linux-fsdevel, lkml

On Fri, Oct 12, 2018 at 10:02 PM Tycho Andersen [off-list ref] wrote:
On Thu, Oct 11, 2018 at 06:02:06PM -0700, Andy Lutomirski wrote:
quoted
On Thu, Oct 11, 2018 at 4:10 PM Paul Moore [off-list ref] wrote:
quoted
On October 11, 2018 9:40:06 AM Jann Horn [off-list ref] wrote:
quoted
On Thu, Oct 11, 2018 at 9:24 AM Paul Moore [off-list ref] wrote:
quoted
On October 10, 2018 11:34:11 AM Jann Horn [off-list ref] wrote:
quoted
On Wed, Oct 10, 2018 at 5:32 PM Paul Moore [off-list ref] wrote:
quoted
On Tue, Oct 9, 2018 at 9:36 AM Jann Horn [off-list ref] wrote:
quoted
+cc selinux people explicitly, since they probably have opinions on this
I just spent about twenty minutes working my way through this thread,
and digging through the containers archive trying to get a good
understanding of what you guys are trying to do, and I'm not quite
sure I understand it all.  However, from what I have seen, this
approach looks very ptrace-y to me (I imagine to others as well based
on the comments) and because of this I think ensuring the usual ptrace
access controls are evaluated, including the ptrace LSM hooks, is the
right thing to do.
Basically the problem is that this new ptrace() API does something
that doesn't just influence the target task, but also every other task
that has the same seccomp filter. So the classic ptrace check doesn't
work here.
Due to some rather unfortunate events today I'm suddenly without easy access to the kernel code, but would it be possible to run the LSM ptrace access control checks against all of the affected tasks?  If it is possible, how painful would it be?
There are currently no backlinks from seccomp filters to the tasks
that use them; the only thing you have is a refcount. If the refcount
is 1, and the target task uses the filter directly (it is the last
installed one), you'd be able to infer that the ptrace target is the
only task with a reference to the filter, and you could just do the
direct check; but if the refcount is >1, you might end up having to
take some spinlock and then iterate over all tasks' filters with that
spinlock held, or something like that.
That's what I was afraid of.

Unfortunately, I stand by my previous statements that we still probably want a LSM access check similar to what we currently do for ptrace.
I would argue that once "LSM" enters this conversation, it just means
we're on the wrong track.  Let's try to make this work without ptrace
if possible :)  The whole seccomp() mechanism is very carefully
designed so that it's perfectly safe to install seccomp filters
without involving LSM or even involving credentials at all.
In a last ditch effort to save the ptrace() interface: can we just
only allow it when refcount_read(filter->usage) == 1?
From a security perspective, I think that would be fine, assuming that
we know that the target task is stopped. (But note that if the target
process e.g. uses the filter on multiple threads, the refcount will be
higher.)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help