Re: [PATCH 5/7] seccomp_filter: Document what seccomp_filter isand how it works.

From: Steven Rostedt
Date: Wed May 04 2011 - 12:39:27 EST


On Wed, 2011-05-04 at 12:22 -0400, Eric Paris wrote:

> > SECCOMP_FILTER_SET, __NR_foo, "a=0"
> > SECCOMP_FILTER_SET, __NR_read, "1" == EPERM
>
> When I said "== EPERM" I meant that the given prctl call would return
> EPERM. I'm going to pretend that you didn't type it.

I was confused about that, but I didn't type that. You did. I just cut
and pasted it ;)

>
> > SECCOPM_FILTER_APPLY
> >
> > SECCOMP_FILTER_SET, __NR_foo, "b=0"
> > SECCOPM_FILTER_APPLY
> >
> > Will end up being:
> >
> > (foo: a == 0 || read: "1") && (foo: b == 0)
> >
> > The second set/apply now removes the read option, and foo only works if
> > a is 0 and b is 0.
> >
> > This would also work for children, as they can only restrict (with
> > 'and') and can not add more control.
>
> I think we pretty much agree although I'm pretty that we will have 1
> filter per syscall. So the rules would really be (in your syntax)
>
> Rule1: (foo: a == 0 && b == 0)
> OR
> Rule2: (read: "1")
>
> Although logically the same, it's not just one huge rule. I don't see
> any need for any operation other than an &&. Before the first "set" you
> can add new syscalls. After the first set you can only && onto existing
> syscalls. So the following set of operations:
>
> SECCOMP_FILTER_SET, __NR_foo, "a=0"
> SECCOMP_FILTER_SET, __NR_read, "1"
> SECCOPM_FILTER_APPLY
>
> SECCOMP_FILTER_SET, __NR_foo, "b=0"
> SECCOMP_FILTER_APPLY
>
> SECCOMP_FILTER_SET, __NR_write, "1"
> SECCOMP_FILTER_APPLY
>
> Would return EPERM for the __NR_write entry since it was a new syscall
> after a set. I think we agree on all this.

Do you mean "after a apply"? As the second line above is a new syscall
after the first set.


>
> I do have a question on some syntax proposed a while back. Given:
> SECCOMP_FILTER_SET, __NR_foo, "a=0"
> SECCOMP_FILTER_SET, __NR_foo, "b=0"
> SECCOMP_FILTER_APPLY
>
> I would think to keep the interface consistent that should result in
> foo: (a=0) && (b=0)

I agree.

>
> But I think the proposal was that we should instead have just
> foo: (b=0)

Yeah, that's what it looked like Frederic showed. I rather have the
first instance.

Perhaps we could have a "unset"? that would only work on things that
haven't been applied yet.

>
> What's the logic behind having a second call overwrite uncommitted
> changes? I sorta feel like if I put it in there, I must have wanted it
> in there :)

Perhaps for making the user code simpler?

SET a=1
SET b=2

[ some nasty if logic ]

UNSET b=2

APPLY


Thus a default setting can be made and then we can selectively remove
settings before we do the apply based on information about the process
that we will exec. We can start out with "limit the hell out of it" and
then selectively remove things. I think this is a simply way to
understand what is being done. Kind of like iptables, where you can set
up default rules, but then selectively override them.

One thing I know about security, the easier it is to set up, the more
secure it becomes.

-- Steve


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/