clone_private_mnt(): make sure that caller has CAP_SYS_ADMIN in the right userns
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 2 Jun 2025 00:11:06 +0000 (20:11 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 7 Jun 2025 05:37:24 +0000 (01:37 -0400)
What we want is to verify there is that clone won't expose something
hidden by a mount we wouldn't be able to undo.  "Wouldn't be able to undo"
may be a result of MNT_LOCKED on a child, but it may also come from
lacking admin rights in the userns of the namespace mount belongs to.

clone_private_mnt() checks the former, but not the latter.

There's a number of rather confusing CAP_SYS_ADMIN checks in various
userns during the mount, especially with the new mount API; they serve
different purposes and in case of clone_private_mnt() they usually,
but not always end up covering the missing check mentioned above.

Reviewed-by: Christian Brauner <brauner@kernel.org>
Reported-by: "Orlando, Noah" <Noah.Orlando@deshaw.com>
Fixes: 427215d85e8d ("ovl: prevent private clone if bind mount is not allowed")
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namespace.c

index 2e939b783618d92d88a3db4d2529c6653c686c3c..1c54c16c7babebb9dfcec0e8807324ec891e6d44 100644 (file)
@@ -2510,6 +2510,9 @@ struct vfsmount *clone_private_mount(const struct path *path)
                        return ERR_PTR(-EINVAL);
        }
 
+        if (!ns_capable(old_mnt->mnt_ns->user_ns, CAP_SYS_ADMIN))
+               return ERR_PTR(-EPERM);
+
        if (__has_locked_children(old_mnt, path->dentry))
                return ERR_PTR(-EINVAL);