mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 21:02:43 +01:00
exec: move path_noexec() check earlier
The path_noexec() check, like the regular file check, was happening too
late, letting LSMs see impossible execve()s. Check it earlier as well in
may_open() and collect the redundant fs/exec.c path_noexec() test under
the same robustness comment as the S_ISREG() check.
My notes on the call path, and related arguments, checks, etc:
do_open_execat()
struct open_flags open_exec_flags = {
.open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC,
.acc_mode = MAY_EXEC,
...
do_filp_open(dfd, filename, open_flags)
path_openat(nameidata, open_flags, flags)
file = alloc_empty_file(open_flags, current_cred());
do_open(nameidata, file, open_flags)
may_open(path, acc_mode, open_flag)
/* new location of MAY_EXEC vs path_noexec() test */
inode_permission(inode, MAY_OPEN | acc_mode)
security_inode_permission(inode, acc_mode)
vfs_open(path, file)
do_dentry_open(file, path->dentry->d_inode, open)
security_file_open(f)
open()
/* old location of path_noexec() test */
Signed-off-by: Kees Cook <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Cc: Alexander Viro <[email protected]>
Cc: Aleksa Sarai <[email protected]>
Cc: Christian Brauner <[email protected]>
Cc: Dmitry Vyukov <[email protected]>
Cc: Eric Biggers <[email protected]>
Cc: Tetsuo Handa <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
633fb6ac39
commit
0fd338b2d2
2 files changed
+8
-8
No files matched your search
@@ -147,10 +147,8 @@ SYSCALL_DEFINE1(uselib, const char __user *, library)
|
||||
* and check again at the very end too.
|
||||
*/
|
||||
error = -EACCES;
|
||||
if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode)))
|
||||
goto exit;
|
||||
|
||||
if (path_noexec(&file->f_path))
|
||||
if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode) ||
|
||||
path_noexec(&file->f_path)))
|
||||
goto exit;
|
||||
|
||||
fsnotify_open(file);
|
||||
@@ -919,10 +917,8 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags)
|
||||
* and check again at the very end too.
|
||||
*/
|
||||
err = -EACCES;
|
||||
if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode)))
|
||||
goto exit;
|
||||
|
||||
if (path_noexec(&file->f_path))
|
||||
if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode) ||
|
||||
path_noexec(&file->f_path)))
|
||||
goto exit;
|
||||
|
||||
err = deny_write_access(file);
|
||||
|
||||
@@ -2863,6 +2863,10 @@ static int may_open(const struct path *path, int acc_mode, int flag)
|
||||
return -EACCES;
|
||||
flag &= ~O_TRUNC;
|
||||
break;
|
||||
case S_IFREG:
|
||||
if ((acc_mode & MAY_EXEC) && path_noexec(path))
|
||||
return -EACCES;
|
||||
break;
|
||||
}
|
||||
|
||||
error = inode_permission(inode, MAY_OPEN | acc_mode);
|
||||
|
||||
Reference in new issue
Block a user