提交 a16b3357 编写于 作者: E Eric W. Biederman

exec: Allow load_misc_binary to call prepare_binprm unconditionally

Add a flag preserve_creds that binfmt_misc can set to prevent
credentials from being updated.  This allows binfmt_misc to always
call prepare_binprm.  Allowing the credential computation logic to be
consolidated.

Not replacing the credentials with the interpreters credentials is
safe because because an open file descriptor to the executable is
passed to the interpreter.   As the interpreter does not need to
reopen the executable it is guaranteed to see the same file that
exec sees.

Ref: c407c033de84 ("[PATCH] binfmt_misc: improve calculation of interpreter's credentials")
Link: https://lkml.kernel.org/r/87imgszrwo.fsf_-_@x220.int.ebiederm.orgAcked-by: NLinus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: NKees Cook <keescook@chromium.org>
Signed-off-by: N"Eric W. Biederman" <ebiederm@xmission.com>
上级 112b7147
...@@ -218,19 +218,10 @@ static int load_misc_binary(struct linux_binprm *bprm) ...@@ -218,19 +218,10 @@ static int load_misc_binary(struct linux_binprm *bprm)
goto error; goto error;
bprm->file = interp_file; bprm->file = interp_file;
if (fmt->flags & MISC_FMT_CREDENTIALS) { if (fmt->flags & MISC_FMT_CREDENTIALS)
loff_t pos = 0; bprm->preserve_creds = 1;
/*
* No need to call prepare_binprm(), it's already been
* done. bprm->buf is stale, update from interp_file.
*/
memset(bprm->buf, 0, BINPRM_BUF_SIZE);
retval = kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE,
&pos);
} else
retval = prepare_binprm(bprm);
retval = prepare_binprm(bprm);
if (retval < 0) if (retval < 0)
goto error; goto error;
......
...@@ -1631,15 +1631,20 @@ static void bprm_fill_uid(struct linux_binprm *bprm) ...@@ -1631,15 +1631,20 @@ static void bprm_fill_uid(struct linux_binprm *bprm)
*/ */
int prepare_binprm(struct linux_binprm *bprm) int prepare_binprm(struct linux_binprm *bprm)
{ {
int retval;
loff_t pos = 0; loff_t pos = 0;
/* Recompute parts of bprm->cred based on bprm->file */ /* Can the interpreter get to the executable without races? */
bprm->active_secureexec = 0; if (!bprm->preserve_creds) {
bprm_fill_uid(bprm); int retval;
retval = security_bprm_repopulate_creds(bprm);
if (retval) /* Recompute parts of bprm->cred based on bprm->file */
return retval; bprm->active_secureexec = 0;
bprm_fill_uid(bprm);
retval = security_bprm_repopulate_creds(bprm);
if (retval)
return retval;
}
bprm->preserve_creds = 0;
memset(bprm->buf, 0, BINPRM_BUF_SIZE); memset(bprm->buf, 0, BINPRM_BUF_SIZE);
return kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE, &pos); return kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE, &pos);
......
...@@ -26,6 +26,8 @@ struct linux_binprm { ...@@ -26,6 +26,8 @@ struct linux_binprm {
unsigned long p; /* current top of mem */ unsigned long p; /* current top of mem */
unsigned long argmin; /* rlimit marker for copy_strings() */ unsigned long argmin; /* rlimit marker for copy_strings() */
unsigned int unsigned int
/* It is safe to use the creds of a script (see binfmt_misc) */
preserve_creds:1,
/* /*
* True if most recent call to security_bprm_set_creds * True if most recent call to security_bprm_set_creds
* resulted in elevated privileges. * resulted in elevated privileges.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册