Subject: Re: kern/7129: normal user can bypass mount 'noexec' flags
To: Thor Lancelot Simon <tls@rek.tjls.com>
From: Bill Studenmund <wrstuden@nas.nasa.gov>
List: tech-security
Date: 03/11/1999 17:03:59
On Thu, 11 Mar 1999, Thor Lancelot Simon wrote:
> On Thu, Mar 11, 1999 at 03:11:59PM -0800, Bill Studenmund wrote:
>
> > I think that's a bad idea. Checking each op will be expensive, given that
> > flag changes are rare. Also, there's the problem that I think the idea of
> > a root nullfs mount which has fewer restrictions than the layer on which
> > it's loaded is reasonable (If root wants to hang him/herself, ok :-)
>
> I do not.
>
> Limiting how much damage root can do is *precisely the purpose* of some of
> the mount flags we're talking about, at least the way I see it.
I'm confused. I'm enclosing below a list of all the mountflags we support.
Given how I ripped the flags out of sys/sys/mount.h, there are both
persistent mount bits (NOEXEC, NOSUID, etc) and mount command bits
(UPDATE, DELEXPORT, etc.) in this list.
I do not see any of them whose removal due to a root mount via an
overlapping fs would compromise system security. Yes, a lot of these flags
are there to keep users out of trouble, like the NOSUID and NOEXEC. But if
you have a root process doing this, you've already lost. NOSUID doesn't
matter as the intruder's already root. :-) And noexec doesn't matter as
root can easily cp the file somewhere else.
MNT_RDONLY is enforced by the underlying filesystem, so twiddling it in a
nullfs layer wouldn't help. Besides the fact that nullfs enforces
MNT_RDONLY from the underlying layer. :-)
MNT_RDONLY /* read only filesystem */
MNT_SYNCHRONOUS /* file system written synchronously */
MNT_NOEXEC /* can't exec from filesystem */
MNT_NOSUID /* don't honor setuid bits on fs */
MNT_NODEV /* don't interpret special files */
MNT_UNION /* union with underlying filesystem */
MNT_ASYNC /* file system written asynchronously */
MNT_NOCOREDUMP /* don't write core dumps to this FS */
MNT_NOATIME /* Never update access times in fs */
MNT_NODEVMTIME /* Never update mod times for devs */
MNT_SYMPERM /* recognize symlink permission */
MNT_EXRDONLY /* exported read only */
MNT_EXPORTED /* file system is exported */
MNT_DEFEXPORTED /* exported to the world */
MNT_EXPORTANON /* use anon uid mapping for everyone */
MNT_EXKERB /* exported with Kerberos uid mapping */
MNT_EXNORESPORT /* don't enforce reserved ports (NFS) */
MNT_EXPUBLIC /* public export (WebNFS) */
MNT_LOCAL /* filesystem is stored locally */
MNT_QUOTA /* quotas are enabled on filesystem */
MNT_ROOTFS /* identifies the root filesystem */
MNT_UPDATE /* not a real mount, just an update */
MNT_DELEXPORT /* delete export host lists */
MNT_RELOAD /* reload filesystem data */
MNT_FORCE /* force unmount or readonly change */
MNT_MWAIT /* waiting for unmount to finish */
MNT_UNMOUNT /* unmount in progress */
MNT_WANTRDWR /* upgrade to read/write requested */
A cracker could leave a nullfs which doesn't enforce NOSUID and NOEXEC
around after a break in, with the idea of being able to come back. But
this nullfs will show up in df, mount, etc, and in general be easy to
spot. If I were breaking into a system, I'd just crack login, init, ps,
cksum, and friends. :-)
If there is a gap in this reasoning, please point it out. I'm not seeing
it. :-)
Take care,
Bill