On Tue, 2026-11-10 at 10:14 +0100, Christian Brauner wrote: > Initialize selinuxfs as a pseudo filesystem. This raises SB_I_PSEUDO > and > SB_I_NOEXEC. selinuxfs never holds executables. SB_I_NOEXEC also > refuses PROT_EXEC mappings but the status and policy files are only > ever mapped for reading. > > But selinuxfs needs device nodes. The kernel replaces file > descriptors > with /sys/fs/selinux/null on exec via dentry_open() which doesn't > care > about SB_I_NODEV. Android init however opens /sys/fs/selinux/null by > path as /dev/null doesn't exist yet at that point. So clear > SB_I_NODEV > again in sel_fill_super(). > > Signed-off-by: Christian Brauner (Amutable) <[email protected]>
Reviewed-by: Alexander Mikhalitsyn <[email protected]> I. > --- > security/selinux/selinuxfs.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/security/selinux/selinuxfs.c > b/security/selinux/selinuxfs.c > index 310e19efff1d..d7ae853b6d68 100644 > --- a/security/selinux/selinuxfs.c > +++ b/security/selinux/selinuxfs.c > @@ -18,6 +18,7 @@ > #include <linux/vmalloc.h> > #include <linux/fs.h> > #include <linux/fs_context.h> > +#include <linux/pseudo_fs.h> > #include <linux/hex.h> > #include <linux/mount.h> > #include <linux/mutex.h> > @@ -1852,6 +1853,9 @@ static int sel_fill_super(struct super_block > *sb, struct fs_context *fc) > /* last one */ {"", NULL, 0} > }; > > + /* Android init opens the null device below by path. */ > + sb->s_iflags &= ~SB_I_NODEV; > + > ret = selinux_fs_info_create(sb); > if (ret) > goto err; > @@ -1955,6 +1959,7 @@ static const struct fs_context_operations > sel_context_ops = { > > static int sel_init_fs_context(struct fs_context *fc) > { > + fc_init_pseudo(fc); > fc->ops = &sel_context_ops; > return 0; > }
