Skip to content

Commit

Permalink
selftests/exec: Verify execve of non-regular files fail
Browse files Browse the repository at this point in the history
Add a named pipe as an exec target to make sure that non-regular
files are rejected by execve() with EACCES. This can help verify
commit 73601ea ("fs/open.c: allow opening only regular files
during execve()").

Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
  • Loading branch information
Kees Cook authored and Shuah Khan committed May 22, 2020
1 parent a5f3046 commit 61016db
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 1 deletion.
1 change: 1 addition & 0 deletions tools/testing/selftests/exec/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ execveat.ephemeral
execveat.denatured
/recursion-depth
xxxxxxxx*
pipe
2 changes: 1 addition & 1 deletion tools/testing/selftests/exec/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ CFLAGS += -Wno-nonnull
CFLAGS += -D_GNU_SOURCE

TEST_GEN_PROGS := execveat
TEST_GEN_FILES := execveat.symlink execveat.denatured script subdir
TEST_GEN_FILES := execveat.symlink execveat.denatured script subdir pipe
# Makefile is a run-time dependency, since it's accessed by the execveat test
TEST_FILES := Makefile

Expand Down
8 changes: 8 additions & 0 deletions tools/testing/selftests/exec/execveat.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
* Selftests for execveat(2).
*/

#ifndef _GNU_SOURCE
#define _GNU_SOURCE /* to get O_PATH, AT_EMPTY_PATH */
#endif
#include <sys/sendfile.h>
#include <sys/stat.h>
#include <sys/syscall.h>
Expand Down Expand Up @@ -311,6 +313,10 @@ static int run_tests(void)
fail += check_execveat_fail(AT_FDCWD, fullname_symlink,
AT_SYMLINK_NOFOLLOW, ELOOP);

/* Non-regular file failure */
fail += check_execveat_fail(dot_dfd, "pipe", 0, EACCES);
unlink("pipe");

/* Shell script wrapping executable file: */
/* dfd + path */
fail += check_execveat(subdir_dfd, "../script", 0);
Expand Down Expand Up @@ -384,6 +390,8 @@ static void prerequisites(void)
fd = open("subdir.ephemeral/script", O_RDWR|O_CREAT|O_TRUNC, 0755);
write(fd, script, strlen(script));
close(fd);

mkfifo("pipe", 0755);
}

int main(int argc, char **argv)
Expand Down

0 comments on commit 61016db

Please sign in to comment.