Re: [PATCH 1/3] ovl: don't warn when the mount is completed from another user namespace
Miklos Szeredi <[email protected]>
| Newsgroups | org.kernel.vger.linux-unionfs,org.kernel.vger.linux-fsdevel,org.kernel.vger.stable,org.kvack.linux-mm |
|---|---|
| Message-ID | <CAJfpegtXbdpFZmV2dYSbp6eL0DBGmZin98TFr42nxJCfuryfrw@mail.gmail.com> |
On Sun, 2 Aug 2026 at 20:00, Christian Brauner <[email protected]> wrote: > > fsopen() records the caller's user namespace in fc->user_ns and hands > back an ordinary file descriptor. Nothing ties the task that calls > fsconfig(FSCONFIG_CMD_CREATE) to the task that created the context. The > fd is inherited across fork() and exec() and it can be passed over a > unix socket. > > Completing a context from another user namespace is allowed on purpose. > vfs_cmd_create() authorizes the create with mount_capable(), which for > FS_USERNS_MOUNT checks ns_capable(fc->user_ns, CAP_SYS_ADMIN), and that > succeeds for a task holding CAP_SYS_ADMIN in an ancestor of fc->user_ns. > So an unprivileged task can reach the WARN_ON() in ovl_fill_super(): > create a user and a mount namespace in a child, call fsopen("overlay") > there, send the fscontext fd to the parent and let the parent issue > FSCONFIG_CMD_CREATE. Both namespaces come from a plain unshare(1) and no > capability is needed anywhere: > > WARNING: fs/overlayfs/super.c:1551 at ovl_fill_super+0x7b9/0x1e20 [overlay] > CPU: 3 UID: 1000 PID: 3243376 Comm: fswarn > Call Trace: > get_tree_nodev+0x71/0xa0 > ovl_get_tree+0x15/0x20 [overlay] > vfs_get_tree+0x2a/0x100 > vfs_cmd_create+0x60/0xf0 > __do_sys_fsconfig+0x4b2/0x500 > > The child needs the mount namespace because fsopen() itself gates on > may_mount(), which asks for CAP_SYS_ADMIN in the user namespace owning > the caller's mount namespace. fsconfig() doesn't repeat that check. > > It is a WARN_ON() and not a WARN_ON_ONCE(), so the condition can be > raised in a loop to taint the kernel and flood the log, and it panics a > kernel booted with panic_on_warn. > > Keep refusing the mount and stop warning about it. ovl_parse_param() > already spells a user namespace check this way for Opt_override_creds. > > Fixes: 1784fbc2ed9c ("ovl: port to new mount api") > Cc: [email protected] # v6.5+ > Signed-off-by: Christian Brauner (Amutable) <[email protected]> > --- > fs/overlayfs/super.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c > index 60f0b7ceef0a..60b808b85fc4 100644 > --- a/fs/overlayfs/super.c > +++ b/fs/overlayfs/super.c > @@ -1544,7 +1544,8 @@ int ovl_fill_super(struct super_block *sb, struct fs_context *fc) > int err; > > err = -EIO; > - if (WARN_ON(fc->user_ns != current_user_ns())) > + /* The fscontext fd may have been passed to another user namespace. */ > + if (fc->user_ns != current_user_ns()) > goto out_err; Just one comment on this (I know it's been merged, will do a fixup patch): EIO should be turned into EINVAL. The EIO was used to signal an internal error (commit 9efb069de4ba ("ovl: add warning on user_ns mismatch")) , which is no longer the case. Thanks, Miklos