Re: [PATCH v2] selinux: preserve user SID across nested backing files
From: Amir Goldstein
Date: Sat Aug 29 2026 - 12:43:15 EST
On Sat, Aug 29, 2026 at 12:05 AM Paul Moore <paul@xxxxxxxxxxxxxx> wrote:
>
> On Fri, Aug 28, 2026 at 5:05 AM Amir Goldstein <amir73il@xxxxxxxxx> wrote:
> > On Thu, Aug 27, 2026 at 9:39 PM Paul Moore <paul@xxxxxxxxxxxxxx> wrote:
> > > On Aug 20, 2026 Karl Mehltretter <kmehltretter@xxxxxxxxx> wrote:
>
> ...
>
> > > > diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> > > > index 1ead2eee1944..171b90412ff1 100644
> > > > --- a/security/selinux/hooks.c
> > > > +++ b/security/selinux/hooks.c
> > > > @@ -3843,13 +3843,20 @@ static int selinux_file_alloc_security(struct file *file)
> > > > return 0;
> > > > }
> > > >
> > > > +static inline u32 selinux_file_user_sid(const struct file *file)
> > > > +{
> > > > + if (unlikely(file->f_mode & FMODE_BACKING))
> > > > + return selinux_backing_file(file)->uf_sid;
> > > > + return selinux_file(file)->sid;
> > > > +}
> > >
> > > I'm a little concerned that this only works for one additional level of
> > > filesystem stacking. Yes, I know that OVL_MAX_NESTING and
> > > FILESYSTEM_MAX_STACK_DEPTH are currently set at "2", but it's not an
> > > unreasonable concern that at some point in the future that number will
> > > increase without proper notification or testing and we will once again
> > > have a problem.
> > >
> > > At the absolute minimum we should have a BUILD_BUG_ON() for the stacking
> > > depth. It would be good if we could watch both the overlayfs and vfs
> > > constants, but the overlayfs constant isn't available outside
> > > fs/overlayfs/inode.c (thankfully it is currently set to the vfs limit).
> > >
> > > BUIILD_BUG_ON(FILESYSTEM_MAX_STACK_DEPTH > 2);
> > >
> > > Ideally, the code would be written to keep diving down the stack until
> > > it hit the true backing file. No one likes to see recursion, but at the
> > > point where this function is called there should already be a reasonable
> > > bound on the stacking depth and the work involved.
> >
> > Unless I am missing something, stack depth should not matter.
> > file_user_path() should hold the user visible path, for all the backing files
> > in all the depths of the backing files stack.
> >
> > This is the issue that was fixed with commit
> > f2381b546e7e6 fs: fix user path of nested backing files
> >
> > This patch makes uf_sid behave the same way and also documents this:
> >
> > struct backing_file_security_struct {
> > - u32 uf_sid; /* associated user file fsec->sid */
> > + u32 uf_sid; /* top-level user file fsec->sid */
> > };
>
> Perhaps I'm not understanding your comment correctly (it's the end of
> a long week), but selinux_backing_file_alloc() and the newly created
> selinux_file_user_sid() functions don't operate on the
> file_user_path() path struct. In fact the path which is resolved in
> backing_file_open() isn't even passed into the
> security_backing_file_alloc() LSM hook.
Right.
But the file that is passed into the hook has the top-level uf_sid
in selinux_file_user_sid().
>
> Are you trying to explain that the way the backing files are allocated
> in a stacked filesystem, regardless of the number of layers, is that
> they will be allocated from the top down in such a way that the uf_sid
> will trickle down to the bottommost backing file?
Yes, both selinux_file_user_sid() and file_user_path() should follow
the same pattern independently - they always stash the top-most user visible
path/creds.
Thanks,
Amir.