Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1684037
| From | Kees Cook <keescook@chromium.org> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH v2 4/8] exec: Use secureexec for clearing pdeath_signal |
| Date | 2017-07-10 10:10 +0200 |
| Message-ID | <u1BVw-2uD-13@gated-at.bofh.it> (permalink) |
| References | <u1BLP-2bz-7@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Like dumpability, clearing pdeath_signal happens both in setup_new_exec()
and later in commit_creds(). The test in setup_new_exec() is different
from all other privilege comparisons, though: it is checking the new cred
(bprm) uid vs the old cred (current) euid. This appears to be a bug,
introduced by commit a6f76f23d297 ("CRED: Make execve() take advantage of
copy-on-write credentials"):
- if (bprm->e_uid != current_euid() ||
- bprm->e_gid != current_egid()) {
- set_dumpable(current->mm, suid_dumpable);
+ /* install the new credentials */
+ if (bprm->cred->uid != current_euid() ||
+ bprm->cred->gid != current_egid()) {
It was bprm euid vs current euid (and egids), but the effective got
dropped. Nothing in the exec flow changes bprm->cred->uid (nor gid).
The call traces are:
prepare_bprm_creds()
prepare_exec_creds()
prepare_creds()
memcpy(new_creds, old_creds, ...)
security_prepare_creds() (unimplemented by commoncap)
...
prepare_binprm()
bprm_fill_uid()
resets euid/egid to current euid/egid
sets euid/egid on bprm based on set*id file bits
security_bprm_set_creds()
cap_bprm_set_creds()
handle all caps-based manipulations
so this test is effectively a test of current_uid() vs current_euid(),
which is wrong, just like the prior dumpability tests were wrong.
The commit log says "Clear pdeath_signal and set dumpable on
certain circumstances that may not be covered by commit_creds()." This
may be meaning the earlier old euid vs new euid (and egid) test that
got changed.
Luckily, as with dumpability, this is all masked by commit_creds()
which performs old/new euid and egid tests and clears pdeath_signal.
And again, like dumpability, we should include LSM secureexec logic for
pdeath_signal clearing. For example, Smack goes out of its way to clear
pdeath_signal when it finds a secureexec condition.
Signed-off-by: Kees Cook <keescook@chromium.org>
---
fs/exec.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/fs/exec.c b/fs/exec.c
index 3e519d4f0bd3..d7bda5b60e7b 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1361,8 +1361,7 @@ void setup_new_exec(struct linux_binprm * bprm)
*/
current->mm->task_size = TASK_SIZE;
- if (!uid_eq(bprm->cred->uid, current_euid()) ||
- !gid_eq(bprm->cred->gid, current_egid())) {
+ if (bprm->secureexec) {
current->pdeath_signal = 0;
} else {
if (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP)
--
2.7.4
Back to linux.kernel | Previous | Next — Previous in thread | Find similar | Unroll thread
[PATCH v2 0/8] exec: Use sane stack rlimit under secureexec Kees Cook <keescook@chromium.org> - 2017-07-10 10:00 +0200
[PATCH v2 2/8] exec: Move security_bprm_secureexec() earlier Kees Cook <keescook@chromium.org> - 2017-07-10 10:00 +0200
Re: [PATCH v2 2/8] exec: Move security_bprm_secureexec() earlier ebiederm@xmission.com (Eric W. Biederman) - 2017-07-10 11:10 +0200
Re: [PATCH v2 2/8] exec: Move security_bprm_secureexec() earlier Kees Cook <keescook@chromium.org> - 2017-07-10 18:10 +0200
Re: [PATCH v2 2/8] exec: Move security_bprm_secureexec() earlier Kees Cook <keescook@chromium.org> - 2017-07-11 04:10 +0200
Re: [PATCH v2 2/8] exec: Move security_bprm_secureexec() earlier Kees Cook <keescook@chromium.org> - 2017-07-18 08:50 +0200
[PATCH v2 6/8] exec: Consolidate dumpability logic Kees Cook <keescook@chromium.org> - 2017-07-10 10:00 +0200
[PATCH v2 3/8] exec: Use secureexec for setting dumpability Kees Cook <keescook@chromium.org> - 2017-07-10 10:00 +0200
[PATCH v2 4/8] exec: Use secureexec for clearing pdeath_signal Kees Cook <keescook@chromium.org> - 2017-07-10 10:10 +0200
csiph-web