We want the virtual kernel to be default-secure. Disable writes to kernel
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 15 Jan 2007 20:51:16 +0000 (20:51 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 15 Jan 2007 20:51:16 +0000 (20:51 +0000)
memory and disable module loading by default when running a virtual kernel.
Run the virtual kernel with the -U option (for Unsecure) to run with these
enabled.

Reads are still allowed since the virtual kernel's memory does not
contain any compromising data from the real kernel.

sys/kern/kern_linker.c
sys/kern/kern_memio.c
sys/kern/kern_mib.c
sys/platform/vkernel/platform/init.c
sys/sys/systm.h

index 58c3b08..d8a33a1 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_linker.c,v 1.41.2.3 2001/11/21 17:50:35 luigi Exp $
- * $DragonFly: src/sys/kern/kern_linker.c,v 1.32 2006/12/23 00:35:04 swildner Exp $
+ * $DragonFly: src/sys/kern/kern_linker.c,v 1.33 2007/01/15 20:51:14 dillon Exp $
  */
 
 #include "opt_ddb.h"
@@ -239,7 +239,7 @@ linker_load_file(const char* filename, linker_file_t* result)
     char *koname = NULL;
 
     /* Refuse to load modules if securelevel raised */
-    if (securelevel > 0)
+    if (securelevel > 0 || kernel_mem_readonly)
        return EPERM; 
 
     lf = linker_find_file_by_name(filename);
@@ -405,7 +405,7 @@ linker_file_unload(linker_file_t file)
     int i;
 
     /* Refuse to unload modules if securelevel raised */
-    if (securelevel > 0)
+    if (securelevel > 0 || kernel_mem_readonly)
        return EPERM; 
 
     KLD_DPF(FILE, ("linker_file_unload: lf->refs=%d\n", file->refs));
@@ -708,7 +708,7 @@ sys_kldload(struct kldload_args *uap)
 
     uap->sysmsg_result = -1;
 
-    if (securelevel > 0)       /* redundant, but that's OK */
+    if (securelevel > 0 || kernel_mem_readonly)        /* redundant, but that's OK */
        return EPERM;
 
     if ((error = suser(td)) != 0)
@@ -748,7 +748,7 @@ sys_kldunload(struct kldunload_args *uap)
     linker_file_t lf;
     int error = 0;
 
-    if (securelevel > 0)       /* redundant, but that's OK */
+    if (securelevel > 0 || kernel_mem_readonly)        /* redundant, but that's OK */
        return EPERM;
 
     if ((error = suser(td)) != 0)
index 5108182..d6b8c82 100644 (file)
@@ -39,7 +39,7 @@
  *     from: Utah $Hdr: mem.c 1.13 89/10/08$
  *     from: @(#)mem.c 7.2 (Berkeley) 5/9/91
  * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $
- * $DragonFly: src/sys/kern/kern_memio.c,v 1.27 2007/01/12 03:05:49 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_memio.c,v 1.28 2007/01/15 20:51:14 dillon Exp $
  */
 
 /*
@@ -106,15 +106,17 @@ mmopen(struct dev_open_args *ap)
        switch (minor(dev)) {
        case 0:
        case 1:
-               if ((ap->a_oflags & FWRITE) && securelevel > 0)
-                       return (EPERM);
+               if (ap->a_oflags & FWRITE) {
+                       if (securelevel > 0 || kernel_mem_readonly)
+                               return (EPERM);
+               }
                error = 0;
                break;
        case 14:
                error = suser_cred(ap->a_cred, 0);
                if (error != 0)
                        break;
-               if (securelevel > 0) {
+               if (securelevel > 0 || kernel_mem_readonly) {
                        error = EPERM;
                        break;
                }
index 40564aa..5a267f2 100644 (file)
@@ -38,7 +38,7 @@
  *
  *     @(#)kern_sysctl.c       8.4 (Berkeley) 4/14/94
  * $FreeBSD: src/sys/kern/kern_mib.c,v 1.29.2.4 2001/07/30 23:28:00 peter Exp $
- * $DragonFly: src/sys/kern/kern_mib.c,v 1.13 2006/12/26 12:16:56 sephe Exp $
+ * $DragonFly: src/sys/kern/kern_mib.c,v 1.14 2007/01/15 20:51:14 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -187,6 +187,7 @@ SYSCTL_PROC(_kern, KERN_HOSTNAME, hostname,
        0, 0, sysctl_hostname, "A", "Hostname");
 
 int securelevel = -1;
+int kernel_mem_readonly = 0;
 
 static int
 sysctl_kern_securelvl(SYSCTL_HANDLER_ARGS)
index f8fedfa..188aaaa 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/init.c,v 1.27 2007/01/15 01:29:04 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/init.c,v 1.28 2007/01/15 20:51:15 dillon Exp $
  */
 
 #include <sys/types.h>
@@ -126,7 +126,9 @@ main(int ac, char **av)
        /*
         * Process options
         */
-       while ((c = getopt(ac, av, "svm:r:e:I:")) != -1) {
+       kernel_mem_readonly = 1;
+
+       while ((c = getopt(ac, av, "svm:r:e:I:U")) != -1) {
                switch(c) {
                case 'e':
                        /*
@@ -183,6 +185,9 @@ main(int ac, char **av)
                                }
                        }
                        break;
+               case 'U':
+                       kernel_mem_readonly = 0;
+                       break;
                }
        }
 
index c469127..cd71a96 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)systm.h     8.7 (Berkeley) 3/29/95
  * $FreeBSD: src/sys/sys/systm.h,v 1.111.2.18 2002/12/17 18:04:02 sam Exp $
- * $DragonFly: src/sys/sys/systm.h,v 1.64 2007/01/13 21:33:30 tgen Exp $
+ * $DragonFly: src/sys/sys/systm.h,v 1.65 2007/01/15 20:51:16 dillon Exp $
  */
 
 #ifndef _SYS_SYSTM_H_
@@ -58,6 +58,7 @@
 #include <sys/callout.h>
 
 extern int securelevel;                /* system security level (see init(8)) */
+extern int kernel_mem_readonly;        /* disable writes to kernel memory */
 
 extern int cold;               /* nonzero if we are doing a cold boot */
 extern const char *panicstr;   /* panic message */