Synopsis: noexec mount flag is not properly handled by non-root mount
NetBSD versions: NetBSD 1.3.3 and prior; NetBSD-current until 19990318
Thanks to: Manuel Bouyer
Reported in NetBSD Security Advisory: SA1999-007

This patch fixes the non-root mount problem described in the NetBSD-SA1999-007
security advisory. For it to apply, make sure you have NetBSD 1.3.3 kernel
sources unpacked in /usr/src, then do:
   % cd /usr/src/sys
   % patch <19990317-mount
   % cd arch/`uname -m`/conf
   % config GENERIC
   % cd ../compile/GENERIC
   % make depend && make
   % su root
   # mv /netbsd /netbsd.old
   # cp netbsd /
   # chmod 444 /netbsd
   # sync; reboot


Index: kern/vfs_syscalls.c
===================================================================
RCS file: /archive/cvs/cvsroot/NetBSD/src/sys/kern/vfs_syscalls.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 vfs_syscalls.c
--- vfs_syscalls.c      1997/12/15 16:49:57     1.1.1.1
+++ vfs_syscalls.c      1999/03/17 16:29:35
@@ -163,8 +163,9 @@
                       return (error);
               }
               /*
-                * Do not allow NFS export by non-root users. Silently
-                * enforce MNT_NOSUID and MNT_NODEV for non-root users.
+                * Do not allow NFS export by non-root users. For non-root
+                * users, silently enforce MNT_NOSUID and MNT_NODEV, and
+                * MNT_NOEXEC if mount point is already MNT_NOEXEC.
                */
               if (p->p_ucred->cr_uid != 0) {
                       if (SCARG(uap, flags) & MNT_EXPORTED) {
@@ -172,6 +173,8 @@
                               return (EPERM);
                       }
                       SCARG(uap, flags) |= MNT_NOSUID | MNT_NODEV;
+                       if (flag & MNT_NOEXEC)
+                               SCARG(uap, flags) |= MNT_NOEXEC;
               }
               VOP_UNLOCK(vp);
               goto update;
@@ -187,8 +190,9 @@
               return (error);
       }
       /*
-        * Do not allow NFS export by non-root users. Silently
-        * enforce MNT_NOSUID and MNT_NODEV for non-root users.
+        * Do not allow NFS export by non-root users. For non-root users,
+        * silently enforce MNT_NOSUID and MNT_NODEV, and MNT_NOEXEC if the
+        * mount point is already MNT_NOEXEC.
        */
       if (p->p_ucred->cr_uid != 0) {
               if (SCARG(uap, flags) & MNT_EXPORTED) {
@@ -196,6 +200,8 @@
                       return (EPERM);
               }
               SCARG(uap, flags) |= MNT_NOSUID | MNT_NODEV;
+               if (vp->v_mount->mnt_flag & MNT_NOEXEC)
+                       SCARG(uap, flags) |= MNT_NOEXEC;
       }
       if ((error = vinvalbuf(vp, V_SAVE, p->p_ucred, p, 0, 0)) != 0)
               return (error);