Thread (1 message) 1 message, 1 author, 2014-07-30

Re: [PATCH 11/11] seccomp: Add tgid and tid into seccomp_data

From: Andy Lutomirski <hidden>
Date: 2014-07-30 14:52:57
Also in: lkml

On Jul 29, 2014 10:57 PM, "Eric W. Biederman" [off-list ref] wrote:
Andy Lutomirski [off-list ref] writes:
quoted
On Tue, Jul 29, 2014 at 9:08 PM, Eric W. Biederman
[off-list ref] wrote:
quoted
Andy Lutomirski [off-list ref] writes:
quoted
On Mon, Jul 28, 2014 at 2:18 PM, Eric W. Biederman
[off-list ref] wrote:
quoted
Andy Lutomirski [off-list ref] writes:
quoted
[cc: Eric Biederman]
quoted
Can we do one better and add a flag to prevent any non-self pid
lookups?  This might actually be easy on top of the pid namespace work
(e.g. we could change the way that find_task_by_vpid works).

It's far from just being signals.  There's access_process_vm, ptrace,
all the signal functions, clock_gettime (see CPUCLOCK_PID -- yes, this
is ridiculous), and probably some others that I've forgotten about or
never noticed in the first place.
So here is the practical question.

Are these processes that only can send signals to their thread group
allowed to call fork()?


If fork is allowed and all pid lookups are restricted to their own
thread group that wait, waitpid, and all of the rest of the wait family
will never return the pids of their children, and zombies will
accumulate.  Aka the semantics are fundamentally broken.
Good point.

I can imagine at least three ways that fork() could continue working, though:

1. Allow lookups of immediate children, too.  (I don't love this one.)
2. Allow non-self pids to be translated in but not out.  This way
P_ALL will continue working.
3. Have the kernel treat any PID-restricted process as though it were NOCLDWAIT.

I think I like #3.  Thoughts?
quoted
If fork is not allowed pid namespaces already solve this problem.
PID namespaces are fairly heavyweight.  Julien pointed out that using
PID namespaces requires a bunch of dummy PID 1 processes.
Only if you can't tolerate init exiting.  The reasoning with respect to
signals and signals being ignored was wrong.  And if you only have one
process you care about and no children to worry about neither the
difference in signal handling nor the world dies whe init exits applies.
Can you elaborate?  It seems entirely plausible to me that there are
programs that won't work right as PID 1 without considerable
adaptation.
The only funny things about pid 1 of a pid namespace are:
- children can't send signals to pid 1 unless a signal handler has
  been established.
- All children die when the parent dies.
- Grand children become zombies of the parent when the children die.
- The pid is 1.

That is almost everything is the same and it takes almost no adaptation
(really) to run as the initial pid in a pid namespace.

Not being able to receive signals (which is the argument I read against
them) is bogus.  You just have to set your signal handler to something
besides SIG_DFL.

So I have my question:  What is the use case people are trying to solve
by filtering signals and pid lookups.  If children are not part of the
goal a pid namespace will work just fine.
quoted
quoted
Therefore given what I have read described pid namespaces are a trivial
solution to this problem space.
pid namespaces also won't work in the context of Capsicum unless you
want every single Capsicum process to be its own pid namespace.
For a tightly bound process I don't see why each process could not be
it's own pid namespace.
Two main reasons: You can't put yourself in a pid namespace, so you
need to fork into your sandbox, and you can't prevent yourself from
seeing your children (although, as noted, my approach has issues here,
too, but I think this is more easily solved outside the context of
namespaces).
quoted
Also,
pid namespaces don't offer any way to protect children from parents.
And my presumption was that there were not any children because the
semantics suggested so far do not properly support children.
I'd like to try to fix that.

Another approach: let waiting for zombies that are immediate children
be an exception.

--Andy
Eric
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help