Message ID | 20250407-work-anon_inode-v1-5-53a44c20d44e@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | fs: harden anon inodes | expand |
On Mon 07-04-25 11:54:19, Christian Brauner wrote: > It isn't possible to execute anoymous inodes because they cannot be ^^ anonymous > opened in any way after they have been created. This includes execution: > > execveat(fd_anon_inode, "", NULL, NULL, AT_EMPTY_PATH) > > Anonymous inodes have inode->f_op set to no_open_fops which sets > no_open() which returns ENXIO. That means any call to do_dentry_open() > which is the endpoint of the do_open_execat() will fail. There's no > chance to execute an anonymous inode. Unless a given subsystem overrides > it ofc. > > Howerver, we should still harden this and raise SB_I_NODEV and ^^^ However > SB_I_NOEXEC on the superblock itself so that no one gets any creative > ideas. ;) Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > > Cc: <stable@vger.kernel.org> # all LTS kernels > Signed-off-by: Christian Brauner <brauner@kernel.org> > --- > fs/anon_inodes.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c > index cb51a90bece0..e51e7d88980a 100644 > --- a/fs/anon_inodes.c > +++ b/fs/anon_inodes.c > @@ -86,6 +86,8 @@ static int anon_inodefs_init_fs_context(struct fs_context *fc) > struct pseudo_fs_context *ctx = init_pseudo(fc, ANON_INODE_FS_MAGIC); > if (!ctx) > return -ENOMEM; > + fc->s_iflags |= SB_I_NOEXEC; > + fc->s_iflags |= SB_I_NODEV; > ctx->dops = &anon_inodefs_dentry_operations; > return 0; > } > > -- > 2.47.2 >
On Mon, Apr 07, 2025 at 04:07:47PM +0200, Jan Kara wrote: > On Mon 07-04-25 11:54:19, Christian Brauner wrote: > > It isn't possible to execute anoymous inodes because they cannot be > ^^ anonymous > > > opened in any way after they have been created. This includes execution: > > > > execveat(fd_anon_inode, "", NULL, NULL, AT_EMPTY_PATH) > > > > Anonymous inodes have inode->f_op set to no_open_fops which sets > > no_open() which returns ENXIO. That means any call to do_dentry_open() > > which is the endpoint of the do_open_execat() will fail. There's no > > chance to execute an anonymous inode. Unless a given subsystem overrides > > it ofc. > > > > Howerver, we should still harden this and raise SB_I_NODEV and > ^^^ However > > > SB_I_NOEXEC on the superblock itself so that no one gets any creative > > ideas. > > ;) I've told our new AI overloards to sprinkle-in some typos so no one realizes I've been mostly replaced by a bot. Or I'm just generally tired so I fat-finger a lot more than usual. :D > > Feel free to add: > > Reviewed-by: Jan Kara <jack@suse.cz> > > Honza > > > > > Cc: <stable@vger.kernel.org> # all LTS kernels > > Signed-off-by: Christian Brauner <brauner@kernel.org> > > --- > > fs/anon_inodes.c | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c > > index cb51a90bece0..e51e7d88980a 100644 > > --- a/fs/anon_inodes.c > > +++ b/fs/anon_inodes.c > > @@ -86,6 +86,8 @@ static int anon_inodefs_init_fs_context(struct fs_context *fc) > > struct pseudo_fs_context *ctx = init_pseudo(fc, ANON_INODE_FS_MAGIC); > > if (!ctx) > > return -ENOMEM; > > + fc->s_iflags |= SB_I_NOEXEC; > > + fc->s_iflags |= SB_I_NODEV; > > ctx->dops = &anon_inodefs_dentry_operations; > > return 0; > > } > > > > -- > > 2.47.2 > > > -- > Jan Kara <jack@suse.com> > SUSE Labs, CR
diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index cb51a90bece0..e51e7d88980a 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -86,6 +86,8 @@ static int anon_inodefs_init_fs_context(struct fs_context *fc) struct pseudo_fs_context *ctx = init_pseudo(fc, ANON_INODE_FS_MAGIC); if (!ctx) return -ENOMEM; + fc->s_iflags |= SB_I_NOEXEC; + fc->s_iflags |= SB_I_NODEV; ctx->dops = &anon_inodefs_dentry_operations; return 0; }
It isn't possible to execute anoymous inodes because they cannot be opened in any way after they have been created. This includes execution: execveat(fd_anon_inode, "", NULL, NULL, AT_EMPTY_PATH) Anonymous inodes have inode->f_op set to no_open_fops which sets no_open() which returns ENXIO. That means any call to do_dentry_open() which is the endpoint of the do_open_execat() will fail. There's no chance to execute an anonymous inode. Unless a given subsystem overrides it ofc. Howerver, we should still harden this and raise SB_I_NODEV and SB_I_NOEXEC on the superblock itself so that no one gets any creative ideas. Cc: <stable@vger.kernel.org> # all LTS kernels Signed-off-by: Christian Brauner <brauner@kernel.org> --- fs/anon_inodes.c | 2 ++ 1 file changed, 2 insertions(+)