diff options
Diffstat (limited to 'security/selinux/hooks.c')
| -rw-r--r-- | security/selinux/hooks.c | 10 | 
1 files changed, 9 insertions, 1 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index e94349b85bf..fa2341b6833 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -1986,6 +1986,13 @@ static int selinux_bprm_set_creds(struct linux_binprm *bprm)  		new_tsec->sid = old_tsec->exec_sid;  		/* Reset exec SID on execve. */  		new_tsec->exec_sid = 0; + +		/* +		 * Minimize confusion: if no_new_privs and a transition is +		 * explicitly requested, then fail the exec. +		 */ +		if (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS) +			return -EPERM;  	} else {  		/* Check for a default transition on this program. */  		rc = security_transition_sid(old_tsec->sid, isec->sid, @@ -1998,7 +2005,8 @@ static int selinux_bprm_set_creds(struct linux_binprm *bprm)  	ad.type = LSM_AUDIT_DATA_PATH;  	ad.u.path = bprm->file->f_path; -	if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) +	if ((bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) || +	    (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS))  		new_tsec->sid = old_tsec->sid;  	if (new_tsec->sid == old_tsec->sid) {  |