[apparmor] stack and stack_onexec semantics again

John Johansen john.johansen at canonical.com
Wed Mar 9 07:03:40 UTC 2016


On 03/08/2016 10:22 PM, Tyler Hicks wrote:

<< snip >>


>>> The stack_onexec api however is a different story dependent on when/how
>>> the stacking is applied. There are 3 places/ways it can be applied.
>>>
>>> 1. straight override applied to current confinement when stack_onexec is
>>>    called
>>>   ie.  A + stack_onexc(B) results in A//&B
>>
>> Is this the same behavior as change_onexec()? In other words, does
>> "A + change_onexec(B)" result in B or D when /e is exec'ed?
> 
> I've verified that the result is B, meaning that change_onexec()
> also acts like a straight override much like #1.
> 
correct

<< snip >>


>>> So in the end the questions are?
>>>
>>> 1. Do we want to provide access to stacking without rules, or reduced
>>> rule requirements.
>>> - this can be allowed in the straight stacking without much risk
>>
>> I think there is a fair amount of risk since we now have a large number
>> of userspace programs that are making policy decisions based on AppArmor
>> confinement contexts. In some cases, they're using the query API to have
>> the kernel make the decision for them and I assume that the kernel is
>> handling that appropriately. However, in other cases, they're making
>> their own decisions based on the confinement context and I highly doubt
>> that they're all ready for something crazy like
>> ":ns:foo//&bar//&:child_ns:baz (mixed)".
>>
>> (waiting to chime in on #2 until the question above is answered)
>>
>> Tyler
>>
>>> - this is problematic for stack_onexec, but see 2 below
>>>
>>>
>>> 2. Which semantics of stack_onexec should we go with?
>>> It seems clear to me that #1 is the way to go as it is equivalent to
>>> doing aa_getcon(), concat, aa_change_profile() as outlined above.
> 
> I also think that #1 is the way to go.
> 
>>> However this requires change_profile rules other wise it can be used to
>>> over ride policy transitions when it shouldn't. If we want to allow for
>>> stacking without requiring change_profile rules we could the requirements
>>> some, by
>>>   1. allowing the stack_onexec if the exec transition is respected
>>>      eg. if a task is confined by profile E and it stacks C
>>>         E -> E//&C
>>>      since the exec transition E -> E is specified in the profile (ix)
>>>      then stacking C on top is no different than doing a regular stack,
>>>      as it doesn't override the exec transition. This allows for
>>>      stacking without requiring the stub profile until the exec
>>>      transition. That is to say that it has a parallel to what is done
>>>      with change_profile vs change_onexec.
>>>      ie. in task 1 is confined by E then
>>>        E + stack(B) -> E//&B -> exec /e -> E//&C
>>>
>>>      where B is the stub profile and
>>>        E + stack_onexec(C) -> exec /e -> E//&C
> 
> This is difficult for me to understand and I'm in the middle of writing
> tests cases for stacking. I don't see how we can easily document such
> special, corner case behavior in a meaningful way. I feel like this
> increases complexity (implementation, documentation, testing, etc.) for
> very little benefit.
> 

It is a small complexity. I don't think we actually have enough scope on
how this will be used in the real world to judge whether it is worth it.


>>>   2. allowing the stack_onexec if there is a change_profile rule for the
>>>   existing labeling.
>>>     This is similar to point 1 above but instead of relying on just the
>>>     exec we could also allow transitions allowed by change_profile for
>>>     the current confinement.
>>>       eg. if a task is confined by profile A' which allows
>>>         change_profile /e -> C,
>>>
>>>       then a change_onexec() or stack_onexec() that resulted in
>>>         C//&something would be allowed as
>>>         A'' is allowed to be replaced by C in the basic change_onexec() case.
> 
> This feels more straightfoward to me. I wouldn't be against this but I
> also don't personally see a strong need for it.
> 

well that really comes down to your use case. Seth's use case is not having to
modify distro policy directly, which this tries to accommodate some. Honestly
I feel that not modifying the distro policy is more of a packaging problem but
I can see its uses. Whether it is worth supporting ...?

There are few other points to consider:
- it is rather easy to support both #1 and #3, though this would require having
  a couple extra api fns. I know there has been push back against doing so
  already but it is worth considering

- it is easy to support 1 option now and add the second later if it is deemed
  worth while.

- it is easier to start tight, requiring the rules and then loosen up what is
  required of policy, than it is to decide to tighten policy after the fact


The last point has me leaning towards being conservative with the first
iteration. But I am finding it hard to reconcile that with how lxc is going
to want to use stacking







More information about the AppArmor mailing list