diff options
| author | Eric W. Biederman <ebiederm@xmission.com> | 2017-01-31 12:06:16 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-14 22:02:44 -0400 |
| commit | d3381fab77cbca6f9664cf49b3f5dd3171f1f6d3 (patch) | |
| tree | 1b50cb1e44acabab069caf9c03b90dcf2b621877 /kernel/trace | |
| parent | 48e2181b0b8d1a1e226b2932a11d6f94aef28fb8 (diff) | |
fs: Better permission checking for submounts
commit 93faccbbfa958a9668d3ab4e30f38dd205cee8d8 upstream.
To support unprivileged users mounting filesystems two permission
checks have to be performed: a test to see if the user allowed to
create a mount in the mount namespace, and a test to see if
the user is allowed to access the specified filesystem.
The automount case is special in that mounting the original filesystem
grants permission to mount the sub-filesystems, to any user who
happens to stumble across the their mountpoint and satisfies the
ordinary filesystem permission checks.
Attempting to handle the automount case by using override_creds
almost works. It preserves the idea that permission to mount
the original filesystem is permission to mount the sub-filesystem.
Unfortunately using override_creds messes up the filesystems
ordinary permission checks.
Solve this by being explicit that a mount is a submount by introducing
vfs_submount, and using it where appropriate.
vfs_submount uses a new mount internal mount flags MS_SUBMOUNT, to let
sget and friends know that a mount is a submount so they can take appropriate
action.
sget and sget_userns are modified to not perform any permission checks
on submounts.
follow_automount is modified to stop using override_creds as that
has proven problemantic.
do_mount is modified to always remove the new MS_SUBMOUNT flag so
that we know userspace will never by able to specify it.
autofs4 is modified to stop using current_real_cred that was put in
there to handle the previous version of submount permission checking.
cifs is modified to pass the mountpoint all of the way down to vfs_submount.
debugfs is modified to pass the mountpoint all of the way down to
trace_automount by adding a new parameter. To make this change easier
a new typedef debugfs_automount_t is introduced to capture the type of
the debugfs automount function.
Fixes: 069d5ac9ae0d ("autofs: Fix automounts by using current_real_cred()->uid")
Fixes: aeaa4a79ff6a ("fs: Call d_automount with the filesystems creds")
Reviewed-by: Trond Myklebust <trond.myklebust@primarydata.com>
Reviewed-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/trace.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 8696ce6bf2f6..90b66ed6f0e2 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -7241,7 +7241,7 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer) | |||
| 7241 | ftrace_init_tracefs(tr, d_tracer); | 7241 | ftrace_init_tracefs(tr, d_tracer); |
| 7242 | } | 7242 | } |
| 7243 | 7243 | ||
| 7244 | static struct vfsmount *trace_automount(void *ingore) | 7244 | static struct vfsmount *trace_automount(struct dentry *mntpt, void *ingore) |
| 7245 | { | 7245 | { |
| 7246 | struct vfsmount *mnt; | 7246 | struct vfsmount *mnt; |
| 7247 | struct file_system_type *type; | 7247 | struct file_system_type *type; |
| @@ -7254,7 +7254,7 @@ static struct vfsmount *trace_automount(void *ingore) | |||
| 7254 | type = get_fs_type("tracefs"); | 7254 | type = get_fs_type("tracefs"); |
| 7255 | if (!type) | 7255 | if (!type) |
| 7256 | return NULL; | 7256 | return NULL; |
| 7257 | mnt = vfs_kern_mount(type, 0, "tracefs", NULL); | 7257 | mnt = vfs_submount(mntpt, type, "tracefs", NULL); |
| 7258 | put_filesystem(type); | 7258 | put_filesystem(type); |
| 7259 | if (IS_ERR(mnt)) | 7259 | if (IS_ERR(mnt)) |
| 7260 | return NULL; | 7260 | return NULL; |
