It is the reasonable expectation that if an executable file is not readable there will be no way for a user without special privileges to read the file. This is enforced in ptrace_attach but if we are already attached there is no enforcement if a readonly executable is exec'd. Therefore do the simple thing and if there is a non-dumpable executable that we are tracing without privilege fail to exec it. Fixes: v1.0 Cc: stable@xxxxxxxxxxxxxxx Reported-by: Andy Lutomirski <luto@xxxxxxxxxxxxxx> Signed-off-by: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> --- fs/exec.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/exec.c b/fs/exec.c index fdec760bfac3..de107f74e055 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1230,6 +1230,11 @@ int flush_old_exec(struct linux_binprm * bprm) { int retval; + /* Fail if the tracer can't read the executable */ + if ((bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP) && + !ptracer_capable(current, bprm->mm->user_ns)) + return -EPERM; + /* * Make sure we have a private signal table and that * we are unassociated from the previous thread group. @@ -1301,7 +1306,6 @@ void setup_new_exec(struct linux_binprm * bprm) !gid_eq(bprm->cred->gid, current_egid())) { current->pdeath_signal = 0; } else { - would_dump(bprm, bprm->file); if (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP) set_dumpable(current->mm, suid_dumpable); } @@ -1736,6 +1740,8 @@ static int do_execveat_common(int fd, struct filename *filename, if (retval < 0) goto out; + would_dump(bprm, bprm->file); + retval = exec_binprm(bprm); if (retval < 0) goto out; -- 2.10.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>