[PATCH][SRU][xenial] UBUNTU: SAUCE: apparmor: fix nnp subset check failure, when stacking

John Johansen john.johansen at canonical.com
Fri Aug 9 21:53:43 UTC 2019


On 8/9/19 9:38 AM, Tyler Hicks wrote:
> On 2019-08-05 16:31:33, John Johansen wrote:
>> This is a backport of a fix that landed as part of a larger patch
>> in 4.17 commit 9fcf78cca1986 ("apparmor: update domain transitions that are subsets of confinement at nnp")
> 
> Same question as I had on the Bionic patch. Do we also need to remove
> the no new privs check from change_profile_perms_wrapper()?
> 

change_profile_perms_wrapper() will need a similar change, but that
can come as a separate patch. We didn't catch that one as we didn't
have a test for it, and so I would like to be able to test it before
we push the change.


> Tyler
> 
>>
>> Domain transitions that add a new profile to the confinement stack
>> when under NO NEW PRIVS is allowed as it can not expand privileges.
>>
>> However such transitions are failing due to how/where the subset
>> test is being applied. Applying the test per profile in the
>> profile transition and profile_onexec call backs is incorrect as
>> it disregards the other profiles in the stack so it can not
>> correctly determine if the old confinement stack is a subset of
>> the new confinement stack.
>>
>> Move the test to after the new confinement stack is constructed.
>>
>> BugLink: http://bugs.launchpad.net/bugs/1839037
>> Signed-off-by: John Johansen <john.johansen at canonical.com>
>> ---
>>  security/apparmor/domain.c | 47 ++++++++++++--------------------------
>>  1 file changed, 14 insertions(+), 33 deletions(-)
>>
>> diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c
>> index d9e29b2fdda2..38595ca7e642 100644
>> --- a/security/apparmor/domain.c
>> +++ b/security/apparmor/domain.c
>> @@ -560,22 +560,6 @@ static struct aa_label *profile_transition(struct aa_profile *profile,
>>  	if (!new)
>>  		goto audit;
>>  
>> -	/* Policy has specified a domain transitions. if no_new_privs and
>> -	 * confined and not transitioning to the current domain fail.
>> -	 *
>> -	 * NOTE: Domain transitions from unconfined and to stritly stacked
>> -	 * subsets are allowed even when no_new_privs is set because this
>> -	 * aways results in a further reduction of permissions.
>> -	 */
>> -	if ((bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS) &&
>> -	    !profile_unconfined(profile) &&
>> -	    !aa_label_is_subset(new, &profile->label)) {
>> -		error = -EPERM;
>> -		info = "no new privs";
>> -		nonewprivs = true;
>> -		perms.allow &= ~MAY_EXEC;
>> -		goto audit;
>> -	}
>>  
>>  	if (!(perms.xindex & AA_X_UNSAFE)) {
>>  		if (DEBUG_ON) {
>> @@ -653,22 +637,6 @@ static int profile_onexec(struct aa_profile *profile, struct aa_label *onexec,
>>  		goto audit;
>>  	}
>>  
>> -	/* Policy has specified a domain transitions. if no_new_privs and
>> -	 * confined and not transitioning to the current domain fail.
>> -	 *
>> -	 * NOTE: Domain transitions from unconfined and to stritly stacked
>> -	 * subsets are allowed even when no_new_privs is set because this
>> -	 * aways results in a further reduction of permissions.
>> -	 */
>> -	if ((bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS) &&
>> -	    !profile_unconfined(profile) &&
>> -	    !aa_label_is_subset(onexec, &profile->label)) {
>> -		error = -EPERM;
>> -		info = "no new privs";
>> -		perms.allow &= ~AA_MAY_ONEXEC;
>> -		goto audit;
>> -	}
>> -
>>  	if (!(perms.xindex & AA_X_UNSAFE)) {
>>  		if (DEBUG_ON) {
>>  			dbg_printk("appaarmor: scrubbing environment "
>> @@ -788,7 +756,20 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm)
>>  		goto done;
>>  	}
>>  
>> -	/* TODO: Add ns level no_new_privs subset test */
>> +	/* Policy has specified a domain transitions. If no_new_privs and
>> +	 * confined ensure the transition is to confinement that is subset
>> +	 * of the confinement when the task entered no new privs.
>> +	 *
>> +	 * NOTE: Domain transitions from unconfined and to stacked
>> +	 * subsets are allowed even when no_new_privs is set because this
>> +	 * aways results in a further reduction of permissions.
>> +	 */
>> +	if ((bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS) &&
>> +	    !unconfined(label) && !aa_label_is_subset(new, label)) {
>> +		error = -EPERM;
>> +		info = "no new privs";
>> +		goto audit;
>> +	}
>>  
>>  	if (bprm->unsafe & LSM_UNSAFE_SHARE) {
>>  		/* FIXME: currently don't mediate shared state */
>> -- 
>> 2.17.1
>>




More information about the kernel-team mailing list