Re: [PATCH v2] selinux: preserve user SID across nested backing files
From: Paul Moore
Date: Fri Aug 28 2026 - 18:05:47 EST
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.
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?
--
paul-moore.com