| From 4013c1496c49615d90d36b9d513eee8e369778e9 Mon Sep 17 00:00:00 2001 |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| Date: Mon, 5 Oct 2020 10:56:22 -0700 |
| Subject: usermodehelper: reset umask to default before executing user process |
| |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| |
| commit 4013c1496c49615d90d36b9d513eee8e369778e9 upstream. |
| |
| Kernel threads intentionally do CLONE_FS in order to follow any changes |
| that 'init' does to set up the root directory (or cwd). |
| |
| It is admittedly a bit odd, but it avoids the situation where 'init' |
| does some extensive setup to initialize the system environment, and then |
| we execute a usermode helper program, and it uses the original FS setup |
| from boot time that may be very limited and incomplete. |
| |
| [ Both Al Viro and Eric Biederman point out that 'pivot_root()' will |
| follow the root regardless, since it fixes up other users of root (see |
| chroot_fs_refs() for details), but overmounting root and doing a |
| chroot() would not. ] |
| |
| However, Vegard Nossum noticed that the CLONE_FS not only means that we |
| follow the root and current working directories, it also means we share |
| umask with whatever init changed it to. That wasn't intentional. |
| |
| Just reset umask to the original default (0022) before actually starting |
| the usermode helper program. |
| |
| Reported-by: Vegard Nossum <vegard.nossum@oracle.com> |
| Cc: Al Viro <viro@zeniv.linux.org.uk> |
| Acked-by: Eric W. Biederman <ebiederm@xmission.com> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/umh.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/kernel/umh.c |
| +++ b/kernel/umh.c |
| @@ -14,6 +14,7 @@ |
| #include <linux/cred.h> |
| #include <linux/file.h> |
| #include <linux/fdtable.h> |
| +#include <linux/fs_struct.h> |
| #include <linux/workqueue.h> |
| #include <linux/security.h> |
| #include <linux/mount.h> |
| @@ -76,6 +77,14 @@ static int call_usermodehelper_exec_asyn |
| spin_unlock_irq(¤t->sighand->siglock); |
| |
| /* |
| + * Initial kernel threads share ther FS with init, in order to |
| + * get the init root directory. But we've now created a new |
| + * thread that is going to execve a user process and has its own |
| + * 'struct fs_struct'. Reset umask to the default. |
| + */ |
| + current->fs->umask = 0022; |
| + |
| + /* |
| * Our parent (unbound workqueue) runs with elevated scheduling |
| * priority. Avoid propagating that into the userspace child. |
| */ |