On Arm, exclusive load-store atomics should only be used between trusted
thread. As not all the guests are trusted, it may be possible to DoS Xen
when updating shared memory with guest atomically.
Recent patches introduced new helpers to update shared memory with guest
atomically. Those helpers relies on a memory region to be be shared with
Xen and a single guest.
At the moment, nothing prevent a guest sharing a page with Xen and as
well with another guest (e.g via grant table).
For the scope of the XSA, the quickest way is to deny communications
between unprivileged guest. So this patch is enabling and using SILO
mode by default on Arm.
Users wanted finer graine policy could wrote their own Flask policy.
This is part of XSA-295.
Signed-off-by: Julien Grall <julien.grall@arm.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
#include <xen/vmap.h>
#include <xen/libfdt/libfdt.h>
#include <xen/acpi.h>
+#include <xen/warning.h>
#include <asm/alternative.h>
#include <asm/page.h>
#include <asm/current.h>
tasklet_subsys_init();
-
- xsm_dt_init();
+ if ( xsm_dt_init() != 1 )
+ warning_add("WARNING: SILO mode is not enabled.\n"
+ "It has implications on the security of the system,\n"
+ "unless the communications have been forbidden between\n"
+ "untrusted domains.\n");
init_maintenance_interrupt();
init_timer_interrupt();
config XSM
bool "Xen Security Modules support"
- default n
+ default ARM
---help---
Enables the security framework known as Xen Security Modules which
allows administrators fine-grained control over a Xen domain and
choice
prompt "Default XSM implementation"
depends on XSM
+ default XSM_SILO_DEFAULT if XSM_SILO && ARM
default XSM_FLASK_DEFAULT if XSM_FLASK
default XSM_SILO_DEFAULT if XSM_SILO
default XSM_DUMMY_DEFAULT
#endif
#ifdef CONFIG_HAS_DEVICE_TREE
+/*
+ * Initialize XSM
+ *
+ * On success, return 1 if using SILO mode else 0.
+ */
extern int xsm_dt_init(void);
extern int xsm_dt_policy_init(void **policy_buffer, size_t *policy_size);
extern bool has_xsm_magic(paddr_t);
xfree(policy_buffer);
- return ret;
+ return ret ?: (xsm_bootparam == XSM_BOOTPARAM_SILO);
}
/**