When propagating mounts across mount namespaces owned by different user namespaces it is not possible anymore to move or umount the mount in the less privileged mount namespace.
Here is a reproducer:
sudo mount -t tmpfs tmpfs /mnt sudo --make-rshared /mnt
# create unprivileged user + mount namespace and preserve propagation unshare -U -m --map-root --propagation=unchanged
# now change back to the original mount namespace in another terminal: sudo mkdir /mnt/aaa sudo mount -t tmpfs tmpfs /mnt/aaa
# now in the unprivileged user + mount namespace mount --move /mnt/aaa /opt
Unfortunately, this is a pretty big deal for userspace since this is e.g. used to inject mounts into running unprivileged containers. So this regression really needs to go away rather quickly.
The problem is that a recent change falsely locked the root of the newly added mounts by setting MNT_LOCKED. Fix this by only locking the mounts on copy_mnt_ns() and not when adding a new mount.
Fixes: 3bd045cc9c4b ("separate copying and locking mount tree on cross-userns copies") Cc: Linus Torvalds torvalds@linux-foundation.org Cc: Al Viro viro@zeniv.linux.org.uk Cc: stable@vger.kernel.org Tested-by: Christian Brauner christian@brauner.io Acked-by: Christian Brauner christian@brauner.io Signed-off-by: "Eric W. Biederman" ebiederm@xmission.com Signed-off-by: Christian Brauner christian@brauner.io --- v1: - Christian Brauner christian@brauner.io: - fix accidental whitespace change --- fs/namespace.c | 1 + fs/pnode.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/namespace.c b/fs/namespace.c index b26778bdc236..44b540e6feb9 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -2105,6 +2105,7 @@ static int attach_recursive_mnt(struct mount *source_mnt, /* Notice when we are propagating across user namespaces */ if (child->mnt_parent->mnt_ns->user_ns != user_ns) lock_mnt_tree(child); + child->mnt.mnt_flags &= ~MNT_LOCKED; commit_tree(child); } put_mountpoint(smp); diff --git a/fs/pnode.c b/fs/pnode.c index 595857a1883e..49f6d7ff2139 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -261,7 +261,6 @@ static int propagate_one(struct mount *m) child = copy_tree(last_source, last_source->mnt.mnt_root, type); if (IS_ERR(child)) return PTR_ERR(child); - child->mnt.mnt_flags &= ~MNT_LOCKED; mnt_set_mountpoint(m, mp, child); last_dest = m; last_source = child;
On Mon, Jun 17, 2019 at 11:22:14PM +0200, Christian Brauner wrote:
When propagating mounts across mount namespaces owned by different user namespaces it is not possible anymore to move or umount the mount in the less privileged mount namespace.
Here is a reproducer:
sudo mount -t tmpfs tmpfs /mnt sudo --make-rshared /mnt
# create unprivileged user + mount namespace and preserve propagation unshare -U -m --map-root --propagation=unchanged
# now change back to the original mount namespace in another terminal: sudo mkdir /mnt/aaa sudo mount -t tmpfs tmpfs /mnt/aaa
# now in the unprivileged user + mount namespace mount --move /mnt/aaa /opt
Unfortunately, this is a pretty big deal for userspace since this is e.g. used to inject mounts into running unprivileged containers. So this regression really needs to go away rather quickly.
The problem is that a recent change falsely locked the root of the newly added mounts by setting MNT_LOCKED. Fix this by only locking the mounts on copy_mnt_ns() and not when adding a new mount.
Applied. Linus, if you want to apply it directly, feel free to add my Acked-by. Alternatively, wait until tonight and I'll send a pull request with that (as well as missing mntget() in fsmount(2) fix, at least).
Al, down to ~3Kmail in the pile...
On Mon, Jun 17, 2019 at 2:32 PM Al Viro viro@zeniv.linux.org.uk wrote:
Applied. Linus, if you want to apply it directly, feel free to add my Acked-by. Alternatively, wait until tonight and I'll send a pull request with that (as well as missing mntget() in fsmount(2) fix, at least).
I've pulled it from you. Thanks,
Linus
linux-stable-mirror@lists.linaro.org