Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1700514

[PATCH v4 08/15] commoncap: Move cap_elevated calculation into bprm_set_creds

From Kees Cook <keescook@chromium.org>
Newsgroups linux.kernel
Subject [PATCH v4 08/15] commoncap: Move cap_elevated calculation into bprm_set_creds
Date 2017-08-01 02:00 +0200
Message-ID <u9sLo-4eo-11@gated-at.bofh.it> (permalink)
References <u9sLn-4eo-5@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Instead of a separate function, open-code the cap_elevated test, which
lets us entirely remove bprm->cap_effective (to use the local "effective"
variable instead), and more accurately examine euid/egid changes via the
existing local "is_setid".

The following LTP tests were run to validate the changes:

	# ./runltp -f syscalls -s cap
	# ./runltp -f securebits
	# ./runltp -f cap_bounds
	# ./runltp -f filecaps

All kernel selftests for capabilities and exec continue to pass as well.

Cc: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: James Morris <james.l.morris@oracle.com>
Acked-by: Serge Hallyn <serge@hallyn.com>
---
 include/linux/binfmts.h |  3 ---
 security/commoncap.c    | 52 ++++++++++---------------------------------------
 2 files changed, 10 insertions(+), 45 deletions(-)

diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
index ebc4030fc6bb..b2c1563091e5 100644
--- a/include/linux/binfmts.h
+++ b/include/linux/binfmts.h
@@ -31,9 +31,6 @@ struct linux_binprm {
 		 * binfmt_script/misc).
 		 */
 		called_set_creds:1,
-		cap_effective:1;/* true if has elevated effective capabilities,
-				 * false if not; except for init which inherits
-				 * its parent's caps anyway */
 		/*
 		 * True if most recent call to the commoncaps bprm_set_creds
 		 * hook (due to multiple prepare_binprm() calls from the
diff --git a/security/commoncap.c b/security/commoncap.c
index abb6050c8083..d8e26fb9781d 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -285,15 +285,6 @@ int cap_capset(struct cred *new,
 	return 0;
 }
 
-/*
- * Clear proposed capability sets for execve().
- */
-static inline void bprm_clear_caps(struct linux_binprm *bprm)
-{
-	cap_clear(bprm->cred->cap_permitted);
-	bprm->cap_effective = false;
-}
-
 /**
  * cap_inode_need_killpriv - Determine if inode change affects privileges
  * @dentry: The inode/dentry in being changed with change marked ATTR_KILL_PRIV
@@ -443,7 +434,7 @@ static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_c
 	int rc = 0;
 	struct cpu_vfs_cap_data vcaps;
 
-	bprm_clear_caps(bprm);
+	cap_clear(bprm->cred->cap_permitted);
 
 	if (!file_caps_enabled)
 		return 0;
@@ -476,13 +467,11 @@ static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_c
 
 out:
 	if (rc)
-		bprm_clear_caps(bprm);
+		cap_clear(bprm->cred->cap_permitted);
 
 	return rc;
 }
 
-static int is_secureexec(struct linux_binprm *bprm);
-
 /**
  * cap_bprm_set_creds - Set up the proposed credentials for execve().
  * @bprm: The execution parameters, including the proposed creds
@@ -587,8 +576,6 @@ int cap_bprm_set_creds(struct linux_binprm *bprm)
 	if (WARN_ON(!cap_ambient_invariant_ok(new)))
 		return -EPERM;
 
-	bprm->cap_effective = effective;
-
 	/*
 	 * Audit candidate if current->cap_effective is set
 	 *
@@ -617,35 +604,16 @@ int cap_bprm_set_creds(struct linux_binprm *bprm)
 		return -EPERM;
 
 	/* Check for privilege-elevated exec. */
-	bprm->cap_elevated = is_secureexec(bprm);
-
-	return 0;
-}
-
-/**
- * is_secureexec - Determine whether a secure execution is required
- * @bprm: The execution parameters
- *
- * Determine whether a secure execution is required, return 1 if it is, and 0
- * if it is not.
- *
- * The credentials have been committed by this point, and so are no longer
- * available through @bprm->cred.
- */
-static int is_secureexec(struct linux_binprm *bprm)
-{
-	const struct cred *cred = bprm->cred;
-	kuid_t root_uid = make_kuid(cred->user_ns, 0);
-
-	if (!uid_eq(cred->uid, root_uid)) {
-		if (bprm->cap_effective)
-			return 1;
-		if (!cap_issubset(cred->cap_permitted, cred->cap_ambient))
-			return 1;
+	bprm->cap_elevated = 0;
+	if (is_setid) {
+		bprm->cap_elevated = 1;
+	} else if (!uid_eq(new->uid, root_uid)) {
+		if (effective ||
+		    !cap_issubset(new->cap_permitted, new->cap_ambient))
+			bprm->cap_elevated = 1;
 	}
 
-	return (!uid_eq(cred->euid, cred->uid) ||
-		!gid_eq(cred->egid, cred->gid));
+	return 0;
 }
 
 /**
-- 
2.7.4

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v4 00/15] exec: Use sane stack rlimit under secureexec Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  [PATCH v4 02/15] exec: Correct comments about "point of no return" Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  [PATCH v4 10/15] exec: Use secureexec for setting dumpability Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
    Re: [PATCH v4 10/15] exec: Use secureexec for setting dumpability James Morris <jmorris@namei.org> - 2017-08-01 02:50 +0200
  [PATCH v4 08/15] commoncap: Move cap_elevated calculation into bprm_set_creds Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
    Re: [PATCH v4 08/15] commoncap: Move cap_elevated calculation into bprm_set_creds Andy Lutomirski <luto@kernel.org> - 2017-08-01 15:50 +0200
  [PATCH v4 11/15] exec: Use secureexec for clearing pdeath_signal Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  [PATCH v4 05/15] selinux: Refactor to remove bprm_secureexec hook Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
    Re: [PATCH v4 05/15] selinux: Refactor to remove bprm_secureexec  hook James Morris <jmorris@namei.org> - 2017-08-01 02:50 +0200
    Re: [PATCH v4 05/15] selinux: Refactor to remove bprm_secureexec hook Andy Lutomirski <luto@kernel.org> - 2017-08-01 15:30 +0200
  [PATCH v4 09/15] LSM: drop bprm_secureexec hook Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  [PATCH v4 01/15] exec: Rename bprm->cred_prepared to called_set_creds Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  [PATCH v4 03/15] binfmt: Introduce secureexec flag Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
    Re: [PATCH v4 03/15] binfmt: Introduce secureexec flag Kees Cook <keescook@chromium.org> - 2017-08-01 02:30 +0200
    Re: [PATCH v4 03/15] binfmt: Introduce secureexec flag James Morris <jmorris@namei.org> - 2017-08-01 02:50 +0200
  [PATCH v4 06/15] smack: Refactor to remove bprm_secureexec hook Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
    Re: [PATCH v4 06/15] smack: Refactor to remove bprm_secureexec  hook James Morris <jmorris@namei.org> - 2017-08-01 02:50 +0200
    Re: [PATCH v4 06/15] smack: Refactor to remove bprm_secureexec hook Casey Schaufler <casey@schaufler-ca.com> - 2017-08-01 17:30 +0200
  [PATCH v4 07/15] commoncap: Refactor to remove bprm_secureexec hook Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  [PATCH v4 04/15] apparmor: Refactor to remove bprm_secureexec hook Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  [PATCH v4 13/15] exec: Consolidate dumpability logic Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  [PATCH v4 12/15] smack: Remove redundant pdeath_signal clearing Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
    Re: [PATCH v4 12/15] smack: Remove redundant pdeath_signal  clearing James Morris <jmorris@namei.org> - 2017-08-01 03:00 +0200
    Re: [PATCH v4 12/15] smack: Remove redundant pdeath_signal clearing Casey Schaufler <casey@schaufler-ca.com> - 2017-08-01 17:30 +0200
  [PATCH v4 15/15] exec: Consolidate pdeath_signal clearing Kees Cook <keescook@chromium.org> - 2017-08-01 02:00 +0200
  Re: [PATCH v4 00/15] exec: Use sane stack rlimit under secureexec Kees Cook <keescook@chromium.org> - 2017-08-01 02:40 +0200
    Re: [PATCH v4 00/15] exec: Use sane stack rlimit under secureexec James Morris <jmorris@namei.org> - 2017-08-01 03:00 +0200
      Re: [PATCH v4 00/15] exec: Use sane stack rlimit under secureexec Kees Cook <keescook@chromium.org> - 2017-08-01 05:10 +0200
        Re: [PATCH v4 00/15] exec: Use sane stack rlimit under secureexec Linus Torvalds <torvalds@linux-foundation.org> - 2017-08-01 07:20 +0200
          Re: [PATCH v4 00/15] exec: Use sane stack rlimit under secureexec Linus Torvalds <torvalds@linux-foundation.org> - 2017-08-01 07:20 +0200
          Re: [PATCH v4 00/15] exec: Use sane stack rlimit under secureexec Kees Cook <keescook@chromium.org> - 2017-08-01 17:10 +0200
            Re: [PATCH v4 00/15] exec: Use sane stack rlimit under secureexec Linus Torvalds <torvalds@linux-foundation.org> - 2017-08-01 22:20 +0200
              Re: [PATCH v4 00/15] exec: Use sane stack rlimit under secureexec Kees Cook <keescook@chromium.org> - 2017-08-01 23:10 +0200

csiph-web