Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Jul 2003 14:46:23 +1000 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        Ian Dowse <iedowse@maths.tcd.ie>
Cc:        arch@freebsd.org
Subject:   Re: *statfs exposure of file system IDs to non-root users
Message-ID:  <20030721135531.V2911@gamplex.bde.org>
In-Reply-To: <200307200306.aa17802@salmon.maths.tcd.ie>
References:  <200307200306.aa17802@salmon.maths.tcd.ie>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 20 Jul 2003, Ian Dowse wrote:

> In changing umount(8) to use statfs(2), I just noticed that the
> various *statfs calls hide the filesystem IDs from non-root users:
>
> 	if (suser(td)) {
> 		bcopy(sp, &sb, sizeof(sb));
> 		sb.f_fsid.val[0] = sb.f_fsid.val[1] = 0;
> 		sp = &sb;
> 	}
>
> This was added in vfs_syscalls.c revision 1.61 (March 1997) and
> came from OpenBSD. I guess the reason was to hide information that
> gets used in NFS filehandles, but it doesn't do us any good now as
> you can get the real IDs from getfsstat() as a normal user.

This seems to be a bug in the import from OpenBSD.  OpenBSD changed
statfs() and getfsstat() in the same commit (rev.1.22 13-Feb-1997 in
this file) to not expose f_fsid to non-root.

> Being
> able to get and compare file system IDs is useful for umount, and
> umount can be used by non-root users when vfs.usermount is set.

> Is there a good reason not to delete this fsid hiding? I guess if

I never really understood hiding f_fsid for the mount point.  In any
case, it never actually worked for FreeBSD and doesn't seemed to have
been adopted by NetBSD.

> we do want to keep the values used in NFS handles secret while still
> exposing useful IDs to userland, we could add a separate user-side
> fsid to struct mount and use that instead. The IDs for NFS need to
> be persistent across reboots, but the user ones don't. Note that
> NFS filesystems use a hidden generation number for each file too,
> so just knowing the filesystem ID isn't enough on its own to form
> a valid handle.

We expose part of the vfsid for at least nfs mountpoints via fake
(st_dev) device numbers for stat().  See getnewfsid().  The exposed
part is a sort of hopefully-unique hash of the fsid.  umount could
use something similar -- a guaranteed-unique unreversable hash of
the fsid -- instead of the fsid if the fsid is considered too
sensitive to expose.  Guaranteed uniqueness in a snall number of
bits (16) wouldn't hurt for getnewfsid() generally, but getnewfsid()
has the additional reqirement of giving fairly persistent ids.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030721135531.V2911>