On 09/07/2017 05:50 PM, John Johansen wrote:
> On 09/07/2017 01:27 PM, Tyler Hicks wrote:
>> On 09/06/2017 03:09 PM, John Johansen wrote:
>>> Update the tests to test whether the kernel and parser support domain
>>> transitions on pivot_root.
>>>
>>> Signed-off-by: John Johansen <john.johan...@canonical.com>
>>> ---
>>>  tests/regression/apparmor/pivot_root.sh | 68 
>>> ++++++++++++++++++---------------
>>>  tests/regression/apparmor/prologue.inc  | 24 ++++++++++++
>>>  2 files changed, 62 insertions(+), 30 deletions(-)
>>>
>>> diff --git a/tests/regression/apparmor/pivot_root.sh 
>>> b/tests/regression/apparmor/pivot_root.sh
>>> index b68f6cf..0e13a0a 100755
>>> --- a/tests/regression/apparmor/pivot_root.sh
>>> +++ b/tests/regression/apparmor/pivot_root.sh
>>> @@ -155,34 +155,42 @@ do_test "bad put_old, new_root" fail "$put_old" 
>>> "$new_root" "$test"
>>>  genprofile $cur $cap "pivot_root:oldroot=$put_old $bad"
>>>  do_test "put_old, bad new_root" fail "$put_old" "$new_root" "$test"
>>>  
>>> -# Give sufficient perms and perform a profile transition
>>> -genprofile $cap "pivot_root:-> $new_prof" -- image=$new_prof $cur
>>> -do_test "transition" pass "$put_old" "$new_root" "$new_prof"
>>> +if [ "$(kernel_features_istrue namespaces/pivot_root)" != "true" ] ; then
>>> +    echo " kernel does not support pivot_root domain transitions skipping 
>>> tests ..."
>>> +elif [ "$(parser_supports 'pivot_root -> foo,')"  != "true" ] ; then
>>> +    #pivot_root domain transitions not supported
>>> +    echo " parser does not support pivot root domain transitions skipping 
>>> tests ..."
>>> +else
>>> +    # Give sufficient perms and perform a profile transition
>>> +    genprofile $cap "pivot_root:-> $new_prof" -- image=$new_prof $cur
>>> +    do_test "transition" pass "$put_old" "$new_root" "$new_prof"
>>> +
>>> +    # Ensure failure when the the new profile can't read 
>>> /proc/<PID>/attr/current
>>> +    genprofile $cap "pivot_root:-> $new_prof" -- image=$new_prof
>>> +    do_test "transition, no perms" fail "$put_old" "$new_root" "$new_prof"
>>> +
>>> +    # Ensure failure when the new profile doesn't exist
>>> +    genprofile $cap "pivot_root:-> $bad" -- image=$new_prof $cur
>>> +    do_test "bad transition" fail "$put_old" "$new_root" "$new_prof"
>>> +
>>> +    # Ensure the test binary is accurately doing post pivot_root profile 
>>> verification
>>> +    genprofile $cap "pivot_root:-> $new_prof" -- image=$new_prof $cur
>>> +    do_test "bad transition comparison" fail "$put_old" "$new_root" "$test"
>>> +
>>> +    # Give sufficient perms with new_root and a transition
>>> +    genprofile $cap "pivot_root:$new_root -> $new_prof" -- image=$new_prof 
>>> $cur
>>> +    do_test "new_root, transition" pass "$put_old" "$new_root" "$new_prof"
>>> +
>>> +    # Ensure failure when the new profile doesn't exist and new_root is 
>>> specified
>>> +    genprofile $cap "pivot_root:$new_root -> $bad" -- image=$new_prof $cur
>>> +    do_test "new_root, bad transition" fail "$put_old" "$new_root" 
>>> "$new_prof"
>>> +
>>> +    # Give sufficient perms with new_root, put_old, and a transition
>>> +    genprofile $cap "pivot_root:oldroot=$put_old $new_root -> $new_prof" 
>>> -- image=$new_prof $cur
>>> +    do_test "put_old, new_root, transition" pass "$put_old" "$new_root" 
>>> "$new_prof"
>>> +
>>> +    # Ensure failure when the new profile doesn't exist and new_root and 
>>> put_old are specified
>>> +    genprofile $cap "pivot_root:oldroot=$put_old $new_root -> $bad" -- 
>>> image=$new_prof $cur
>>> +    do_test "put_old, new_root, bad transition" fail "$put_old" 
>>> "$new_root" "$new_prof"
>>>  
>>> -# Ensure failure when the the new profile can't read 
>>> /proc/<PID>/attr/current
>>> -genprofile $cap "pivot_root:-> $new_prof" -- image=$new_prof
>>> -do_test "transition, no perms" fail "$put_old" "$new_root" "$new_prof"
>>> -
>>> -# Ensure failure when the new profile doesn't exist
>>> -genprofile $cap "pivot_root:-> $bad" -- image=$new_prof $cur
>>> -do_test "bad transition" fail "$put_old" "$new_root" "$new_prof"
>>> -
>>> -# Ensure the test binary is accurately doing post pivot_root profile 
>>> verification
>>> -genprofile $cap "pivot_root:-> $new_prof" -- image=$new_prof $cur
>>> -do_test "bad transition comparison" fail "$put_old" "$new_root" "$test"
>>> -
>>> -# Give sufficient perms with new_root and a transition
>>> -genprofile $cap "pivot_root:$new_root -> $new_prof" -- image=$new_prof $cur
>>> -do_test "new_root, transition" pass "$put_old" "$new_root" "$new_prof"
>>> -
>>> -# Ensure failure when the new profile doesn't exist and new_root is 
>>> specified
>>> -genprofile $cap "pivot_root:$new_root -> $bad" -- image=$new_prof $cur
>>> -do_test "new_root, bad transition" fail "$put_old" "$new_root" "$new_prof"
>>> -
>>> -# Give sufficient perms with new_root, put_old, and a transition
>>> -genprofile $cap "pivot_root:oldroot=$put_old $new_root -> $new_prof" -- 
>>> image=$new_prof $cur
>>> -do_test "put_old, new_root, transition" pass "$put_old" "$new_root" 
>>> "$new_prof"
>>> -
>>> -# Ensure failure when the new profile doesn't exist and new_root and 
>>> put_old are specified
>>> -genprofile $cap "pivot_root:oldroot=$put_old $new_root -> $bad" -- 
>>> image=$new_prof $cur
>>> -do_test "put_old, new_root, bad transition" fail "$put_old" "$new_root" 
>>> "$new_prof"
>>> +fi
>>> diff --git a/tests/regression/apparmor/prologue.inc 
>>> b/tests/regression/apparmor/prologue.inc
>>> index a77fda5..66a0edc 100755
>>> --- a/tests/regression/apparmor/prologue.inc
>>> +++ b/tests/regression/apparmor/prologue.inc
>>> @@ -22,6 +22,30 @@
>>>  # For this file, functions are first, entry point code is at end, see 
>>> "MAIN"
>>>  
>>>  #use $() to retreive the failure message or "true" if success
>>> +
>>> +kernel_features_istrue()
>>> +{
>>> +   if [ ! -e "/sys/kernel/security/apparmor/features/" ] ; then
>>> +           echo "Kernel feature masks not supported."
>>> +           return 1;
>>> +   fi
>>> +
>>> +   for f in $@ ; do
>>> +           if [ ! -e "/sys/kernel/security/apparmor/features/$f" ] ; then
>>> +                   echo "Required feature '$f' not available."
>>> +                   return 2;
>>> +           fi
>>> +           if [ ! -f "/sys/kernel/security/apparmor/features/$f" -o \
>>> +                `cat "/sys/kernel/security/apparmor/features/$f"` == 'no' 
>>> ] ; then
>>> +                   echo "Required feature '$f' not available."
>>> +                   return 3;
>>> +           fi
>>> +        done
>>> +
>>> +   echo "true"
>>> +   return 0;
>>> +}
>>
>> I don't think I'd know when to call kernel_features_istrue() and when to
>> call kernel_features(). Is there really a need for both of them or can
>> you just add the additional check for "no" to the existing
>> kernel_features()?
>>
> yes, but we need to patch some of the tests that are just checking a directory
> path exists vs. a file's value

Ah, I didn't think about that.

> 
> I can work on a more comprehensive patch

How about just a quick couple of comments describing when to use each
function?

Tyler

> 
> 
>> Tyler
>>
>>> +
>>>  kernel_features()
>>>  {
>>>     if [ ! -e "/sys/kernel/security/apparmor/features/" ] ; then
>>>
>>
>>
> 


Attachment: signature.asc
Description: OpenPGP digital signature

-- 
AppArmor mailing list
AppArmor@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/apparmor

Reply via email to