|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] xen/xsm: Add new SILO mode for XSM
When SILO is enabled, there would be no page-sharing between
unprivileged VMs (no grant tables or event channels).
Signed-off-by: Xin Li <xin.li@xxxxxxxxxx>
---
CC: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
CC: Tim Deegan <tim@xxxxxxx>
CC: Wei Liu <wei.liu2@xxxxxxxxxx>
CC: Sergey Dyasli <sergey.dyasli@xxxxxxxxxx>
CC: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CC: Ming Lu <ming.lu@xxxxxxxxxx>
---
docs/misc/xen-command-line.markdown | 3 +
xen/common/Kconfig | 11 +++
xen/include/xsm/xsm.h | 6 ++
xen/xsm/Makefile | 1 +
xen/xsm/silo.c | 106 ++++++++++++++++++++++++++++
xen/xsm/xsm_core.c | 9 +++
6 files changed, 136 insertions(+)
create mode 100644 xen/xsm/silo.c
diff --git a/docs/misc/xen-command-line.markdown
b/docs/misc/xen-command-line.markdown
index 7c689b8225..454de11c3d 100644
--- a/docs/misc/xen-command-line.markdown
+++ b/docs/misc/xen-command-line.markdown
@@ -877,6 +877,9 @@ the hypervisor was compiled with XSM support.
it's also used when XSM is compiled out.
* `flask`: this is the policy based access control. To choose this, the
separated option in kconfig must also be enabled.
+* `silo`: this will deny any unmediated communication channels between
+ unprivileged VMs. To choose this, the separated option in kconfig must also
+ be enabled.
### flask
> `= permissive | enforcing | late | disabled`
diff --git a/xen/common/Kconfig b/xen/common/Kconfig
index 068c3206a1..f3f8e5afbc 100644
--- a/xen/common/Kconfig
+++ b/xen/common/Kconfig
@@ -143,6 +143,17 @@ config XSM_FLASK_POLICY
If unsure, say Y.
+config XSM_SILO
+ def_bool y
+ prompt "SILO support"
+ depends on XSM
+ ---help---
+ Enables SILO as the access control mechanism used by the XSM
framework.
+ This will deny any unmediated communication channels between
unprivileged
+ VMs.
+
+ If unsure, say Y.
+
config LATE_HWDOM
bool "Dedicated hardware domain"
default n
diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
index 70e7a6849f..11518e5bd6 100644
--- a/xen/include/xsm/xsm.h
+++ b/xen/include/xsm/xsm.h
@@ -733,6 +733,12 @@ extern const unsigned char xsm_init_flask_policy[];
extern const unsigned int xsm_init_flask_policy_size;
#endif
+#ifdef CONFIG_XSM_SILO
+extern void silo_init(void);
+#else
+static inline void silo_init(void) {}
+#endif
+
#else /* CONFIG_XSM */
#include <xsm/dummy.h>
diff --git a/xen/xsm/Makefile b/xen/xsm/Makefile
index 8bb4a24f09..e4d581e065 100644
--- a/xen/xsm/Makefile
+++ b/xen/xsm/Makefile
@@ -1,5 +1,6 @@
obj-y += xsm_core.o
obj-$(CONFIG_XSM) += xsm_policy.o
obj-$(CONFIG_XSM) += dummy.o
+obj-$(CONFIG_XSM_SILO) += silo.o
subdir-$(CONFIG_XSM_FLASK) += flask
diff --git a/xen/xsm/silo.c b/xen/xsm/silo.c
new file mode 100644
index 0000000000..cac22432da
--- /dev/null
+++ b/xen/xsm/silo.c
@@ -0,0 +1,106 @@
+/******************************************************************************
+ * xsm/silo.c
+ *
+ * SILO module for XSM(Xen Security Modules)
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (c) 2018 Citrix Systems Ltd.
+ */
+
+#include <xen/sched.h>
+#include <xsm/xsm.h>
+
+struct xsm_operations silo_xsm_ops;
+
+/*
+ * check if inter-domain communication is allowed
+ * return true when pass check
+ */
+static bool silo_mode_dom_check(domid_t ldom, domid_t rdom)
+{
+ domid_t hd_dom = hardware_domain->domain_id;
+ domid_t cur_dom = current->domain->domain_id;
+
+ if ( ldom == DOMID_SELF )
+ ldom = cur_dom;
+ if ( rdom == DOMID_SELF )
+ rdom = cur_dom;
+
+ return (hd_dom == cur_dom || hd_dom == ldom || hd_dom == rdom ||
+ ldom == rdom);
+}
+
+static int silo_evtchn_unbound(struct domain *d1, struct evtchn *chn,
+ domid_t id2)
+{
+ if ( silo_mode_dom_check(d1->domain_id, id2) )
+ return dummy_xsm_ops.evtchn_unbound(d1, chn, id2);
+ return -EPERM;
+}
+
+static int silo_evtchn_interdomain(struct domain *d1, struct evtchn *chan1,
+ struct domain *d2, struct evtchn *chan2)
+{
+ if ( silo_mode_dom_check(d1->domain_id, d2->domain_id) )
+ return dummy_xsm_ops.evtchn_interdomain(d1, chan1, d2, chan2);
+ return -EPERM;
+}
+
+static int silo_grant_mapref(struct domain *d1, struct domain *d2,
+ uint32_t flags)
+{
+ if ( silo_mode_dom_check(d1->domain_id, d2->domain_id) )
+ return dummy_xsm_ops.grant_mapref(d1, d2, flags);
+ return -EPERM;
+}
+
+static int silo_grant_transfer(struct domain *d1, struct domain *d2)
+{
+ if ( silo_mode_dom_check(d1->domain_id, d2->domain_id) )
+ return dummy_xsm_ops.grant_transfer(d1, d2);
+ return -EPERM;
+}
+
+static int silo_grant_copy(struct domain *d1, struct domain *d2)
+{
+ if ( silo_mode_dom_check(d1->domain_id, d2->domain_id) )
+ return dummy_xsm_ops.grant_copy(d1, d2);
+ return -EPERM;
+}
+
+void __init silo_init(void)
+{
+ printk("Initialising XSM SILO mode");
+
+ silo_xsm_ops = dummy_xsm_ops;
+
+ silo_xsm_ops.evtchn_unbound = silo_evtchn_unbound;
+ silo_xsm_ops.evtchn_interdomain = silo_evtchn_interdomain;
+ silo_xsm_ops.grant_mapref = silo_grant_mapref;
+ silo_xsm_ops.grant_transfer = silo_grant_transfer;
+ silo_xsm_ops.grant_copy = silo_grant_copy;
+
+ xsm_ops = &silo_xsm_ops;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/xsm/xsm_core.c b/xen/xsm/xsm_core.c
index e002200578..7842f6dd44 100644
--- a/xen/xsm/xsm_core.c
+++ b/xen/xsm/xsm_core.c
@@ -34,6 +34,7 @@ struct xsm_operations *xsm_ops;
enum xsm_bootparam {
XSM_BOOTPARAM_DUMMY,
XSM_BOOTPARAM_FLASK,
+ XSM_BOOTPARAM_SILO,
XSM_BOOTPARAM_INVALID,
};
@@ -46,6 +47,10 @@ static int __init parse_xsm_param(const char *s)
#ifdef CONFIG_XSM_FLASK
else if ( !strcmp(s, "flask") )
xsm_bootparam = XSM_BOOTPARAM_FLASK;
+#endif
+#ifdef CONFIG_XSM_SILO
+ else if ( !strcmp(s, "silo") )
+ xsm_bootparam = XSM_BOOTPARAM_SILO;
#endif
else
xsm_bootparam = XSM_BOOTPARAM_INVALID;
@@ -92,6 +97,10 @@ static int __init xsm_core_init(const void *policy_buffer,
size_t policy_size)
flask_init(policy_buffer, policy_size);
break;
+ case XSM_BOOTPARAM_SILO:
+ silo_init();
+ break;
+
default:
printk("XSM: Invalid value for xsm= boot parameter.\n");
}
--
2.18.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |