[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] Booting with a policy




Hello!

  The patch below does the following:

- allows to optionally boot the system with a policy already being active at startup; this works by adding a module line into the grub configuration file and placing the binary policy generated by the policy tool into the boot directory; This assumes that a maximum of one module line is used for the initrd in the grub configuration file - Question: do users pass more than one module to the kernel?
- enables the policy hypervisor call on x86/64
- some function prototypes moved to include files
- moves the version number in the java tool up to the current version (a better way of doing this will be submitted soon)

Please let us know about comments.

   Stefan

Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxx>
Signed-off-by: Reiner Sailer <sailer@xxxxxxxxxx>


diff -uprN xen-unstable.hg.ori/xen/acm/acm_core.c xen-unstable.hg/xen/acm/acm_core.c
--- xen-unstable.hg.ori/xen/acm/acm_core.c        2005-07-01 10:36:08.000000000 -0400
+++ xen-unstable.hg/xen/acm/acm_core.c        2005-07-25 15:11:25.000000000 -0400
@@ -6,6 +6,9 @@
  * Author:
  * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
  *
+ * Contributors:
+ * Stefan Berger <stefanb@xxxxxxxxxxxxxx>
+ *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  * published by the Free Software Foundation, version 2 of the
@@ -25,6 +28,7 @@
 #include <xen/lib.h>
 #include <xen/delay.h>
 #include <xen/sched.h>
+#include <xen/multiboot.h>
 #include <acm/acm_hooks.h>
 #include <acm/acm_endian.h>
 
@@ -81,9 +85,68 @@ acm_init_binary_policy(void *primary, vo
         acm_bin_pol.secondary_binary_policy = secondary;
 }
 
+static int
+acm_setup(unsigned int *initrdidx,
+          const multiboot_info_t *mbi,
+          unsigned long initial_images_start)
+{
+    int i;
+    module_t *mod = (module_t *)__va(mbi->mods_addr);
+    int rc = ACM_OK;
+
+    if (mbi->mods_count > 1)
+            *initrdidx = 1;
+
+    /*
+     * Try all modules and see whichever could be the binary policy.
+     * Adjust the initrdidx if module[1] is the binary policy.
+     */
+    for (i = mbi->mods_count-1; i >= 1; i--) {
+        struct acm_policy_buffer *pol;
+        char *_policy_start;
+        unsigned long _policy_len;
+#if defined(__i386__)
+        _policy_start = (char *)(initial_images_start + (mod[i].mod_start-mod[0].mod_start));
+#elif defined(__x86_64__)
+        _policy_start = __va(initial_images_start + (mod[i].mod_start-mod[0].mod_start));
+#else
+#error Architecture unsupported by sHype
+#endif
+        _policy_len   = mod[i].mod_end - mod[i].mod_start;
+        if (_policy_len < sizeof(struct acm_policy_buffer))
+                continue; /* not a policy */
+
+        pol = (struct acm_policy_buffer *)_policy_start;
+        if (ntohl(pol->magic) == ACM_MAGIC) {
+            rc = acm_set_policy((void *)_policy_start,
+                                (u16)_policy_len,
+                                ACM_USE_SECURITY_POLICY,
+                                0);
+            if (rc == ACM_OK) {
+                printf("Policy len  0x%lx, start at %p.\n",_policy_len,_policy_start);
+                if (i == 1) {
+                    if (mbi->mods_count > 2) {
+                        *initrdidx = 2;
+                    } else {
+                        *initrdidx = 0;
+                    }
+                } else {
+                    *initrdidx = 1;
+                }
+                break;
+            } else {
+                    printk("Invalid policy. %d.th module line.\n", i+1);
+            }
+        } /* end if a binary policy definition, i.e., (ntohl(pol->magic) == ACM_MAGIC ) */
+    }
+    return rc;
+}
+
 
 int
-acm_init(void)
+acm_init(unsigned int *initrdidx,
+         const multiboot_info_t *mbi,
+         unsigned long initial_images_start)
 {
         int ret = -EINVAL;
 
@@ -127,11 +190,13 @@ acm_init(void)
 
         if (ret != ACM_OK)
                 return -EINVAL;                
+        acm_setup(initrdidx, mbi, initial_images_start);
         printk("%s: Enforcing Primary %s, Secondary %s.\n", __func__,
                ACM_POLICY_NAME(acm_bin_pol.primary_policy_code), ACM_POLICY_NAME(acm_bin_pol.secondary_policy_code));
-        return ACM_OK;
+        return ret;
 }
 
+
 #endif
 
 int
diff -uprN xen-unstable.hg.ori/xen/acm/acm_policy.c xen-unstable.hg/xen/acm/acm_policy.c
--- xen-unstable.hg.ori/xen/acm/acm_policy.c        2005-07-01 10:36:08.000000000 -0400
+++ xen-unstable.hg/xen/acm/acm_policy.c        2005-07-25 15:11:25.000000000 -0400
@@ -33,7 +33,7 @@
 #include <acm/acm_endian.h>
 
 int
-acm_set_policy(void *buf, u16 buf_size, u16 policy)
+acm_set_policy(void *buf, u16 buf_size, u16 policy, int isuserbuffer)
 {
         u8 *policy_buffer = NULL;
         struct acm_policy_buffer *pol;
@@ -53,16 +53,21 @@ acm_set_policy(void *buf, u16 buf_size,
         /* 1. copy buffer from domain */
         if ((policy_buffer = xmalloc_array(u8, buf_size)) == NULL)
             goto error_free;
-        if (copy_from_user(policy_buffer, buf, buf_size)) {
-                printk("%s: Error copying!\n",__func__);
-                goto error_free;
+        if (isuserbuffer) {
+                if (copy_from_user(policy_buffer, buf, buf_size)) {
+                        printk("%s: Error copying!\n",__func__);
+                        goto error_free;
+                }
+        } else {
+                memcpy(policy_buffer, buf, buf_size);
         }
         /* 2. some sanity checking */
         pol = (struct acm_policy_buffer *)policy_buffer;
 
         if ((ntohl(pol->magic) != ACM_MAGIC) ||
             (ntohs(pol->primary_policy_code) != acm_bin_pol.primary_policy_code) ||
-            (ntohs(pol->secondary_policy_code) != acm_bin_pol.secondary_policy_code)) {
+            (ntohs(pol->secondary_policy_code) != acm_bin_pol.secondary_policy_code) ||
+            (ntohl(pol->policyversion) != POLICY_INTERFACE_VERSION)) {
                 printkd("%s: Wrong policy magics!\n", __func__);
                 goto error_free;
         }
diff -uprN xen-unstable.hg.ori/xen/arch/x86/setup.c xen-unstable.hg/xen/arch/x86/setup.c
--- xen-unstable.hg.ori/xen/arch/x86/setup.c        2005-07-21 19:42:29.000000000 -0400
+++ xen-unstable.hg/xen/arch/x86/setup.c        2005-07-25 15:11:25.000000000 -0400
@@ -245,6 +245,8 @@ void __init __start_xen(multiboot_info_t
     module_t *mod = (module_t *)__va(mbi->mods_addr);
     unsigned long firsthole_start, nr_pages;
     unsigned long initial_images_start, initial_images_end;
+    unsigned long _initrd_start = 0, _initrd_len = 0;
+    unsigned int initrdidx = 1;
     struct e820entry e820_raw[E820MAX];
     int i, e820_raw_nr = 0, bytes = 0;
     struct ns16550_defaults ns16550 = {
@@ -411,7 +413,7 @@ void __init __start_xen(multiboot_info_t
     shadow_mode_init();
 
     /* initialize access control security module */
-    acm_init();
+    acm_init(&initrdidx, mbi, initial_images_start);
 
     /* Create initial domain 0. */
     dom0 = do_createdomain(0, 0);
@@ -454,14 +456,20 @@ void __init __start_xen(multiboot_info_t
      * We're going to setup domain0 using the module(s) that we stashed safely
      * above our heap. The second module, if present, is an initrd ramdisk.
      */
+    if (mbi->mods_count > 1) {
+        _initrd_start = (initrdidx == 0)
+                         ? 0
+                         : initial_images_start +
+                           (mod[initrdidx].mod_start-mod[0].mod_start);
+        _initrd_len   = (initrdidx == 0)
+                         ? 0
+                         : mod[initrdidx].mod_end - mod[initrdidx].mod_start;
+    }
     if ( construct_dom0(dom0,
                         initial_images_start,
                         mod[0].mod_end-mod[0].mod_start,
-                        (mbi->mods_count == 1) ? 0 :
-                        initial_images_start +
-                        (mod[1].mod_start-mod[0].mod_start),
-                        (mbi->mods_count == 1) ? 0 :
-                        mod[mbi->mods_count-1].mod_end - mod[1].mod_start,
+                        _initrd_start,
+                        _initrd_len,
                         cmdline) != 0)
         panic("Could not set up DOM0 guest OS\n");
 
diff -uprN xen-unstable.hg.ori/xen/arch/x86/x86_64/entry.S xen-unstable.hg/xen/arch/x86/x86_64/entry.S
--- xen-unstable.hg.ori/xen/arch/x86/x86_64/entry.S        2005-07-15 16:29:01.000000000 -0400
+++ xen-unstable.hg/xen/arch/x86/x86_64/entry.S        2005-07-25 15:11:25.000000000 -0400
@@ -587,6 +587,7 @@ ENTRY(hypercall_table)
         .quad do_boot_vcpu
         .quad do_set_segment_base   /* 25 */
         .quad do_mmuext_op
+        .quad do_policy_op
         .rept NR_hypercalls-((.-hypercall_table)/4)
         .quad do_ni_hypercall
         .endr
diff -uprN xen-unstable.hg.ori/xen/common/policy_ops.c xen-unstable.hg/xen/common/policy_ops.c
--- xen-unstable.hg.ori/xen/common/policy_ops.c        2005-07-01 10:36:08.000000000 -0400
+++ xen-unstable.hg/xen/common/policy_ops.c        2005-07-25 15:15:33.000000000 -0400
@@ -37,11 +37,6 @@ long do_policy_op(policy_op_t *u_policy_
 
 #else
 
-/* function prototypes defined in acm/acm_policy.c */
-int acm_set_policy(void *buf, u16 buf_size, u16 policy);
-int acm_get_policy(void *buf, u16 buf_size);
-int acm_dump_statistics(void *buf, u16 buf_size);
-
 typedef enum policyoperation {
     POLICY,     /* access to policy interface (early drop) */
     GETPOLICY,  /* dump policy cache */
@@ -89,7 +84,8 @@ long do_policy_op(policy_op_t *u_policy_
         ret = acm_set_policy(
             op->u.setpolicy.pushcache,
             op->u.setpolicy.pushcache_size,
-            op->u.setpolicy.policy_type);
+            op->u.setpolicy.policy_type,
+            1);
         if (ret == ACM_OK)
             ret = 0;
         else
diff -uprN xen-unstable.hg.ori/xen/include/acm/acm_core.h xen-unstable.hg/xen/include/acm/acm_core.h
--- xen-unstable.hg.ori/xen/include/acm/acm_core.h        2005-07-15 16:29:01.000000000 -0400
+++ xen-unstable.hg/xen/include/acm/acm_core.h        2005-07-25 15:15:35.000000000 -0400
@@ -113,6 +113,9 @@ struct ste_ssid {
 /* protos */
 int acm_init_domain_ssid(domid_t id, ssidref_t ssidref);
 int acm_free_domain_ssid(struct acm_ssid_domain *ssid);
+int acm_set_policy(void *buf, u16 buf_size, u16 policy, int isuserbuffer);
+int acm_get_policy(void *buf, u16 buf_size);
+int acm_dump_statistics(void *buf, u16 buf_size);
 
 #endif
 
diff -uprN xen-unstable.hg.ori/xen/include/acm/acm_hooks.h xen-unstable.hg/xen/include/acm/acm_hooks.h
--- xen-unstable.hg.ori/xen/include/acm/acm_hooks.h        2005-07-01 10:36:08.000000000 -0400
+++ xen-unstable.hg/xen/include/acm/acm_hooks.h        2005-07-25 15:11:25.000000000 -0400
@@ -24,6 +24,7 @@
 #include <xen/lib.h>
 #include <xen/delay.h>
 #include <xen/sched.h>
+#include <xen/multiboot.h>
 #include <public/acm.h>
 #include <acm/acm_core.h>
 #include <public/dom0_ops.h>
@@ -136,7 +137,9 @@ static inline int acm_pre_grant_map_ref(
 { return 0; }
 static inline int acm_pre_grant_setup(domid_t id)
 { return 0; }
-static inline int acm_init(void)
+static inline int acm_init(unsigned int *initrdidx,
+                           const multiboot_info_t *mbi,
+                           unsigned long start)
 { return 0; }
 static inline void acm_post_domain0_create(domid_t domid)
 { return; }
@@ -337,7 +340,9 @@ static inline void acm_post_domain0_crea
     acm_post_domain_create(domid, ACM_DOM0_SSIDREF);
 }
 
-extern int acm_init(void);
+extern int acm_init(unsigned int *initrdidx,
+                    const multiboot_info_t *mbi,
+                    unsigned long start);
 
 #endif
 
diff -uprN xen-unstable.hg.ori/docs/misc/shype4xen_readme.txt xen-unstable.hg/docs/misc/shype4xen_readme.txt
--- xen-unstable.hg.ori/docs/misc/shype4xen_readme.txt        2005-07-01 10:36:07.000000000 -0400
+++ xen-unstable.hg/docs/misc/shype4xen_readme.txt        2005-07-22 11:09:14.000000000 -0400
@@ -567,4 +567,22 @@ is that policy files/management should b
 Our policy interface enables managers to create a single binary policy file in a trusted
 environment and distributed it to multiple systems for enforcement.
 
+5. Booting with a binary policy:
+********************************
+The grub configuration file can be adapted to boot the hypervisor with an
+already active policy. To do this, a binary policy file - this can be
+the same file as used by the policy_tool - should be placed into the boot
+partition. The following entry from the grub configuration file shows how
+a binary policy can be added to the system during boot time. Note that the
+binary policy must be of the same type that the hypervisor was compiled
+for. The policy module line should also only be added as the last module
+line if XEN was compiled with the access control module (ACM).
+
+title XEN0 3.0 Devel
+        kernel /xen.gz dom0_mem=400000
+        module /vmlinuz-2.6.12-xen0 root=/dev/hda2 ro console=tty0
+        module /initrd-2.6.12-xen0.img
+        module /xen_sample_policy.bin
+
+
 ====================end-of file=======================================
diff -uprN xen-unstable.hg.ori/tools/misc/policyprocessor/XmlToBinInterface.java xen-unstable.hg/tools/misc/policyprocessor/XmlToBinInterface.java
--- xen-unstable.hg.ori/tools/misc/policyprocessor/XmlToBinInterface.java        2005-07-01 10:36:08.000000000 -0400
+++ xen-unstable.hg/tools/misc/policyprocessor/XmlToBinInterface.java        2005-07-24 12:26:40.000000000 -0400
@@ -123,7 +123,7 @@ public interface XmlToBinInterface
   final short binaryBufferHeaderSz = (3 * u32Size + 4* u16Size);
 
   /* copied directlty from policy_ops.h */
-  final int POLICY_INTERFACE_VERSION = 0xAAAA0002;
+  final int POLICY_INTERFACE_VERSION = 0xAAAA0003;
 
   /* copied directly from acm.h */
   final int ACM_MAGIC  =  0x0001debc;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.