| From 64e8b7cf0c3e47cdd1d9291c1de36eb9194d4bef Mon Sep 17 00:00:00 2001 |
| From: Oleg Nesterov <oleg@redhat.com> |
| Date: Thu, 3 Jan 2019 15:28:07 -0800 |
| Subject: exec: load_script: don't blindly truncate shebang string |
| |
| [ Upstream commit 8099b047ecc431518b9bb6bdbba3549bbecdc343 ] |
| |
| load_script() simply truncates bprm->buf and this is very wrong if the |
| length of shebang string exceeds BINPRM_BUF_SIZE-2. This can silently |
| truncate i_arg or (worse) we can execute the wrong binary if buf[2:126] |
| happens to be the valid executable path. |
| |
| Change load_script() to return ENOEXEC if it can't find '\n' or zero in |
| bprm->buf. Note that '\0' can come from either |
| prepare_binprm()->memset() or from kernel_read(), we do not care. |
| |
| Link: http://lkml.kernel.org/r/20181112160931.GA28463@redhat.com |
| Signed-off-by: Oleg Nesterov <oleg@redhat.com> |
| Acked-by: Kees Cook <keescook@chromium.org> |
| Acked-by: Michal Hocko <mhocko@suse.com> |
| Cc: Ben Woodard <woodard@redhat.com> |
| Cc: "Eric W. Biederman" <ebiederm@xmission.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/binfmt_script.c | 10 +++++++--- |
| 1 file changed, 7 insertions(+), 3 deletions(-) |
| |
| diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c |
| index afdf4e3cafc2..634bdbb23851 100644 |
| --- a/fs/binfmt_script.c |
| +++ b/fs/binfmt_script.c |
| @@ -43,10 +43,14 @@ static int load_script(struct linux_binprm *bprm) |
| fput(bprm->file); |
| bprm->file = NULL; |
| |
| - bprm->buf[BINPRM_BUF_SIZE - 1] = '\0'; |
| - if ((cp = strchr(bprm->buf, '\n')) == NULL) |
| - cp = bprm->buf+BINPRM_BUF_SIZE-1; |
| + for (cp = bprm->buf+2;; cp++) { |
| + if (cp >= bprm->buf + BINPRM_BUF_SIZE) |
| + return -ENOEXEC; |
| + if (!*cp || (*cp == '\n')) |
| + break; |
| + } |
| *cp = '\0'; |
| + |
| while (cp > bprm->buf) { |
| cp--; |
| if ((*cp == ' ') || (*cp == '\t')) |
| -- |
| 2.19.1 |
| |