mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	exec: load_script: don't blindly truncate shebang string
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>
This commit is contained in:
		
							parent
							
								
									fb5bf31722
								
							
						
					
					
						commit
						8099b047ec
					
				
					 1 changed files with 7 additions and 3 deletions
				
			
		|  | @ -42,10 +42,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')) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Oleg Nesterov
						Oleg Nesterov