Skip to contentSkip to conversation

userns: automount cleanups

PATCH In review Eric W. Biederman 4 participants 9 messages Nov 30, 2017 2 messages not in the archive VFS

lore
Share & tools
lore
#0 lore raw

cover userns: automount cleanups

While reviewing some code I realized that in getting d_automount working with s_user_ns I had left behind some unnecessary relics of the blind path I started down. Here are two patches that remove those relics.

Unless someone has another preference I will drop them in my userns tree and merge them that way.

Eric W. Biederman (2):
userns: Don't fail follow_automount based on s_user_ns
autofs4: Modify autofs_wait to use current_uid() and current_gid()

 fs/autofs4/waitq.c | 4 ++--
 fs/namei.c         | 3 ---
 2 files changed, 2 insertions(+), 5 deletions(-)

A message that is not in the archive (sent off-list or not yet received): 874lpck52r.fsf-aS9lmoZGLiVWk0Htik3J/[email protected]

#2 lore raw

PATCH 1/2 userns: Don't fail follow_automount based on s_user_ns

When vfs_submount was added the test to limit automounts from filesystems that with s_user_ns != &init_user_ns accidentially left in follow_automount. The test was never about any security concerns and was always about how do we implement this for filesystems whose s_user_ns != &init_user_ns.

At the moment this check makes no difference as there are no filesystems that both set FS_USERNS_MOUNT and implement d_automount.

Remove this check now while I am thinking about it so there will not be odd booby traps for someone who does want to make this combination work.

vfs_submount still needs improvements to allow this combination to work, and vfs_submount contains a check that presents a warning.

The autofs4 filesystem could be modified to set FS_USERNS_MOUNT and it would need not work on this code path, as userspace performs the mounts.

Fixes 93faccbbfa95 ("fs: Better permission checking for submounts")
Fixes aeaa4a79ff6a ("fs: Call d_automount with the filesystems creds")
---
 fs/namei.c | 3 ---
 1 file changed, 3 deletions(-)
fs/namei.c +0 -3
index f0c7a7b9b6ca..f47118ed36e7 100644
@@ -1142,9 +1142,6 @@ static int follow_automount(struct path *path, struct nameidata *nd,
 			return -ENOENT;
 	}
 
-	if (path->dentry->d_sb->s_user_ns != &init_user_ns)
-		return -EACCES;
-
 	nd->total_link_count++;
 	if (nd->total_link_count >= 40)
 		return -ELOOP;
Signature · 1 line
2.14.1
#3 lore raw
In reply to a message not in the archive
Quoted 7 lines · Eric W. Biederman

While reviewing some code I realized that in getting d_automount working with s_user_ns I had left behind some unnecessary relics of the blind path I started down. Here are two patches that remove those relics.

Unless someone has another preference I will drop them in my userns tree and merge them that way.

I saw the "<etc>->s_user_ns != &init_user_ns" and wondered if that would trigger for automount(8) run entirely with a container (eg. docker)?

Anyway, it's gone now, so ACK to these two, thanks Eric.

Quoted 10 lines

Eric W. Biederman (2):
userns: Don't fail follow_automount based on s_user_ns
autofs4: Modify autofs_wait to use current_uid() and current_gid()

 fs/autofs4/waitq.c | 4 ++--
 fs/namei.c         | 3 ---
 2 files changed, 2 insertions(+), 5 deletions(-)
#4 lore raw

PATCH 1/2 userns: Don't fail follow_automount based on s_user_ns

In reply to Eric W. Biederman

When vfs_submount was added the test to limit automounts from filesystems that with s_user_ns != &init_user_ns accidentially left in follow_automount. The test was never about any security concerns and was always about how do we implement this for filesystems whose s_user_ns != &init_user_ns.

At the moment this check makes no difference as there are no filesystems that both set FS_USERNS_MOUNT and implement d_automount.

Remove this check now while I am thinking about it so there will not be odd booby traps for someone who does want to make this combination work.

vfs_submount still needs improvements to allow this combination to work, and vfs_submount contains a check that presents a warning.

The autofs4 filesystem could be modified to set FS_USERNS_MOUNT and it would need not work on this code path, as userspace performs the mounts.

Fixes 93faccbbfa95 ("fs: Better permission checking for submounts")
Fixes aeaa4a79ff6a ("fs: Call d_automount with the filesystems creds")
---
 fs/namei.c | 3 ---
 1 file changed, 3 deletions(-)
fs/namei.c +0 -3
index f0c7a7b9b6ca..f47118ed36e7 100644
@@ -1142,9 +1142,6 @@ static int follow_automount(struct path *path, struct nameidata *nd,
 			return -ENOENT;
 	}
 
-	if (path->dentry->d_sb->s_user_ns != &init_user_ns)
-		return -EACCES;
-
 	nd->total_link_count++;
 	if (nd->total_link_count >= 40)
 		return -ELOOP;
Signature · 1 line
2.14.1
#5 lore raw

PATCH 2/2 autofs4: Modify autofs_wait to use current_uid() and current_gid()

In reply to Eric W. Biederman

The code used to do that and then I mucked with it and never quite put the code back. Today the code references current_cred()->uid and current_cred()->gid which is equivalent but more wordy, and not idiomatic.

Fixes 93faccbbfa95 ("fs: Better permission checking for submounts")
Fixes 069d5ac9ae0d ("autofs: Fix automounts by using current_real_cred()->uid")
---
 fs/autofs4/waitq.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
fs/autofs4/waitq.c +2 -2
index 8fc41705c7cd..9908ecf7fce0 100644
@@ -443,8 +443,8 @@ int autofs4_wait(struct autofs_sb_info *sbi,
 		memcpy(&wq->name, &qstr, sizeof(struct qstr));
 		wq->dev = autofs4_get_dev(sbi);
 		wq->ino = autofs4_get_ino(sbi);
-		wq->uid = current_cred()->uid;
-		wq->gid = current_cred()->gid;
+		wq->uid = current_uid();
+		wq->gid = current_gid();
 		wq->pid = pid;
 		wq->tgid = tgid;
 		wq->status = -EINTR; /* Status return if interrupted */
Signature · 1 line
2.14.1
#6 lore raw
In reply to Eric W. Biederman
Quoted 7 lines · Eric W. Biederman

While reviewing some code I realized that in getting d_automount working with s_user_ns I had left behind some unnecessary relics of the blind path I started down. Here are two patches that remove those relics.

Unless someone has another preference I will drop them in my userns tree and merge them that way.

I saw the "<etc>->s_user_ns != &init_user_ns" and wondered if that would trigger for automount(8) run entirely with a container (eg. docker)?

Anyway, it's gone now, so ACK to these two, thanks Eric.

Quoted 10 lines

Eric W. Biederman (2):
userns: Don't fail follow_automount based on s_user_ns
autofs4: Modify autofs_wait to use current_uid() and current_gid()

 fs/autofs4/waitq.c | 4 ++--
 fs/namei.c         | 3 ---
 2 files changed, 2 insertions(+), 5 deletions(-)

A message that is not in the archive (sent off-list or not yet received): c5174597-ab58-9b71-e6e9-6b15d256f22c-PKsaG3nR2I+sTnJN9+BGXg@public.gmane.org

#8 lore raw
Quoted 11 lines · Ian Kent
Quoted 7 lines · Eric W. Biederman

While reviewing some code I realized that in getting d_automount working with s_user_ns I had left behind some unnecessary relics of the blind path I started down. Here are two patches that remove those relics.

Unless someone has another preference I will drop them in my userns tree and merge them that way.

I saw the "<etc>->s_user_ns != &init_user_ns" and wondered if that would trigger for automount(8) run entirely with a container (eg. docker)?

autofs still needs FS_USERNS_MOUNT before you can reach that point. But docker does have a mode ?--userns-remap? where it sets up the containers mounts that way.

I think in principle that should work and be safe. I don't know how robust autofs is against malicious users. Which is the question to ask before actually adding FS_USERNS_MOUNT in struct file_system_type.

Quoted 1 line

Anyway, it's gone now, so ACK to these two, thanks Eric.

Eric

#9 lore raw
In reply to Ian Kent
Quoted 11 lines · Ian Kent
Quoted 7 lines · Eric W. Biederman

While reviewing some code I realized that in getting d_automount working with s_user_ns I had left behind some unnecessary relics of the blind path I started down. Here are two patches that remove those relics.

Unless someone has another preference I will drop them in my userns tree and merge them that way.

I saw the "<etc>->s_user_ns != &init_user_ns" and wondered if that would trigger for automount(8) run entirely with a container (eg. docker)?

autofs still needs FS_USERNS_MOUNT before you can reach that point. But docker does have a mode ?--userns-remap? where it sets up the containers mounts that way.

I think in principle that should work and be safe. I don't know how robust autofs is against malicious users. Which is the question to ask before actually adding FS_USERNS_MOUNT in struct file_system_type.

Quoted 1 line

Anyway, it's gone now, so ACK to these two, thanks Eric.

Eric

#10 lore raw
Quoted 14 lines · Eric W. Biederman
Quoted 11 lines · Ian Kent
Quoted 7 lines · Eric W. Biederman

While reviewing some code I realized that in getting d_automount working with s_user_ns I had left behind some unnecessary relics of the blind path I started down. Here are two patches that remove those relics.

Unless someone has another preference I will drop them in my userns tree and merge them that way.

I saw the "<etc>->s_user_ns != &init_user_ns" and wondered if that would trigger for automount(8) run entirely with a container (eg. docker)?

Quoted 7 lines

autofs still needs FS_USERNS_MOUNT before you can reach that point. But docker does have a mode ?--userns-remap? where it sets up the containers mounts that way.

I think in principle that should work and be safe. I don't know how robust autofs is against malicious users. Which is the question to ask before actually adding FS_USERNS_MOUNT in struct file_system_type.

automount(8) thinks it is running as uid 0 (which it is in the container) so this would require a bit of thought since automount(8) doesn't take special precautions.

The restrictions, in the case of running entirely within a container, are those of the container itself. For example, if there are no granular capabilities available then the admin needs to run the container as privileged in order to be able to mount NFS file systems, which is a common usage case.

Ian