Linux Security Modules development
 help / color / mirror / Atom feed
From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: Christian Brauner <brauner@kernel.org>, Ard Biesheuvel <ardb@kernel.org>
Cc: "Al Viro" <viro@zeniv.linux.org.uk>,
	"Ryan Lee" <ryan.lee@canonical.com>,
	"Malte Schröder" <malte.schroeder@tnxip.de>,
	linux-security-module@vger.kernel.org,
	apparmor <apparmor@lists.ubuntu.com>,
	linux-efi@vger.kernel.org,
	"John Johansen" <john.johansen@canonical.com>,
	"jk@ozlabs.org" <jk@ozlabs.org>,
	linux-fsdevel@vger.kernel.org
Subject: Re: apparmor NULL pointer dereference on resume [efivarfs]
Date: Tue, 11 Mar 2025 09:01:36 -0400	[thread overview]
Message-ID: <814a257530ad5e8107ce5f48318ab43a3ef1f783.camel@HansenPartnership.com> (raw)
In-Reply-To: <20250311-visite-rastplatz-d1fdb223dc10@brauner>

On Tue, 2025-03-11 at 09:45 +0100, Christian Brauner wrote:
> On Tue, Mar 11, 2025 at 08:16:34AM +0100, Ard Biesheuvel wrote:
> > (cc Al Viro)
> > 
> > On Mon, 10 Mar 2025 at 22:49, James Bottomley
> > <James.Bottomley@hansenpartnership.com> wrote:
[...]
> > > The problem comes down to the superblock functions not being able
> > > to get the struct vfsmount for the superblock (because it isn't
> > > even allocated until after they've all been called).  The
> > > assumption I was operating under was that provided I added
> > > O_NOATIME to prevent the parent directory being updated, passing
> > > in a NULL mnt for the purposes of iterating the directory dentry
> > > was safe.  What apparmour is trying to do is look up the idmap
> > > for the mount point to do one of its checks.
> > > 
> > > There are two ways of fixing this that I can think of.  One would
> > > be exporting a function that lets me dig the vfsmount out of
> > > s_mounts and use that (it's well hidden in the internals of
> > > fs/mount.h, so I suspect this might not be very acceptable) or to
> > > get mnt_idmap to return
> 
> Nope, please don't.
> 
> > > &nop_mnt_idmap if the passed in mnt is NULL.  I'd lean towards
> > > the latter, but I'm cc'ing fsdevel to see what others think.
> 
> A struct path with mount NULL and dentry != NULL is guaranteed to bit
> us in the ass in other places. That's the bug.
> 
> > > 
> > 
> > 
> > Al spotted the same issue based on a syzbot report [0]
> > 
> > [0] https://lore.kernel.org/all/20250310235831.GL2023217@ZenIV/
> 
> efivars as written only has a single global superblock and it doesn't
> support idmapped mounts and I don't see why it ever would.

So that's not quite true: efivarfs currently supports uid and gid
mapping as mount options, which certainly looks like they were designed
to allow a second mount in a user directory.  I've no idea what the
actual use case for this is, but if I go for a single superblock, any
reconfigure with new uid/gid would become globally effective (change
every current mount) because they're stored in the superblock
information.

So what is the use case for this uid/gid parameter?  If no-one can
remember and no-one actually uses it, perhaps the whole config path can
be simplified by getting rid of the options?  Even if there is a use
case, if it's single mount only then we can still go with a global
superblock.

> But since efivars does only ever have a single global superblock, one
> possibility is to an internal superblock that always exits and is
> resurfaced whenever userspace mounts efivarfs. That's essentially the
> devtmpfs model.
> 
> Then you can stash:
> 
> static struct vfsmount *efivarfs_mnt;
> 
> globally and use that in efivarfs_pm_notify() to fill in struct path.

I didn't see devtmpfs when looking for examples, since it's hiding
outside of the fs/ directory.  However, it does seem to be a bit legacy
nasty as an example to copy.  However, I get the basics: we'd
instantiate the mnt and superblock on init (stashing mnt in the sfi so
the notifier gets it).  Then we can do the variable population on
reconfigure, just in case an EFI system doesn't want to mount efivarfs
to save memory.

I can code that up if I can get an answer to the uid/gid parameter
question above.

Regards,

James


  reply	other threads:[~2025-03-11 13:01 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-05 19:04 apparmor NULL pointer dereference on resume Malte Schröder
2025-03-05 19:22 ` Ryan Lee
2025-03-05 21:47   ` Malte Schröder
2025-03-10 19:57     ` Ryan Lee
2025-03-10 21:49       ` apparmor NULL pointer dereference on resume [efivarfs] James Bottomley
2025-03-11  7:16         ` Ard Biesheuvel
2025-03-11  8:45           ` Christian Brauner
2025-03-11 13:01             ` James Bottomley [this message]
2025-03-11 15:55               ` Christian Brauner
2025-03-11 16:19                 ` Christian Brauner
2025-03-11 16:20                 ` James Bottomley
2025-03-11 17:15                   ` Al Viro
2025-03-11 17:46                     ` James Bottomley
2025-03-14 14:59               ` [RFC 1/1] fix NULL mnt [was Re: apparmor NULL pointer dereference on resume [efivarfs]] James Bottomley
2025-03-15 10:04                 ` Christian Brauner
2025-03-15 18:41                   ` James Bottomley
2025-03-16  6:46                     ` Christian Brauner
2025-03-16 14:26                       ` James Bottomley
2025-03-16 19:19                         ` Ard Biesheuvel
2025-03-17  8:56                         ` Christian Brauner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=814a257530ad5e8107ce5f48318ab43a3ef1f783.camel@HansenPartnership.com \
    --to=james.bottomley@hansenpartnership.com \
    --cc=apparmor@lists.ubuntu.com \
    --cc=ardb@kernel.org \
    --cc=brauner@kernel.org \
    --cc=jk@ozlabs.org \
    --cc=john.johansen@canonical.com \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=malte.schroeder@tnxip.de \
    --cc=ryan.lee@canonical.com \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox