|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] xsm/flask: Handle policy load failures properly
When the hypervisor is booted with an XSM policy containing an error
(such as a mismatched permission value), this error is mostly ignored
during boot. This causes FLASK to suspend security policy enforcement
until a policy is loaded, effectively allowing all access.
This patch adds a call to panic() if the policy load fails and a
security policy was specified. If no security policy was specified, the
existing behavior remains to allow systems to load the security policy
during the boot process with "xl loadpolicy". A distinct initialization
message has been added to distinguish this case from a successful policy
load in logs.
To clarify that the return value of XSM initcalls is ignored, this patch
also changes the return type of these functions to void.
Reported-by: Julien Grall <julien.grall@xxxxxxxxxx>
Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
Changes from v1:
* Don't try to load policy when it is not present
* Clarified message when policy is not loaded at boot
* Added output on first policy load to match at-boot message
xen/include/xsm/xsm.h | 2 +-
xen/xsm/flask/flask_op.c | 5 +++++
xen/xsm/flask/hooks.c | 21 +++++++++++----------
3 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
index 4ce089f..0437735 100644
--- a/xen/include/xsm/xsm.h
+++ b/xen/include/xsm/xsm.h
@@ -42,7 +42,7 @@ typedef enum xsm_default xsm_default_t;
extern char *policy_buffer;
extern u32 policy_size;
-typedef int (*xsm_initcall_t)(void);
+typedef void (*xsm_initcall_t)(void);
extern xsm_initcall_t __xsm_initcall_start[], __xsm_initcall_end[];
diff --git a/xen/xsm/flask/flask_op.c b/xen/xsm/flask/flask_op.c
index 7743aac..6fd5afa 100644
--- a/xen/xsm/flask/flask_op.c
+++ b/xen/xsm/flask/flask_op.c
@@ -506,6 +506,7 @@ static int flask_security_load(struct xen_flask_load *load)
{
int ret;
void *buf = NULL;
+ int is_reload = ss_initialized;
ret = domain_has_security(current->domain, SECURITY__LOAD_POLICY);
if ( ret )
@@ -530,6 +531,10 @@ static int flask_security_load(struct xen_flask_load *load)
if ( ret )
goto out;
+ if ( !is_reload )
+ printk("Flask: Starting in %s mode.\n",
+ flask_enforcing ? "enforcing" : "permissive");
+
xfree(bool_pending_values);
bool_pending_values = NULL;
ret = 0;
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index d48463f..7ce7fe9 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -1625,14 +1625,12 @@ static struct xsm_operations flask_ops = {
#endif
};
-static __init int flask_init(void)
+static __init void flask_init(void)
{
- int ret = 0;
-
if ( !flask_enabled )
{
printk("Flask: Disabled at boot.\n");
- return 0;
+ return;
}
printk("Flask: Initializing.\n");
@@ -1643,14 +1641,17 @@ static __init int flask_init(void)
if ( register_xsm(&flask_ops) )
panic("Flask: Unable to register with XSM");
- ret = security_load_policy(policy_buffer, policy_size);
+ if ( policy_size == 0 )
+ {
+ printk("Flask: Access controls disabled until policy is loaded.\n");
+ return;
+ }
- if ( flask_enforcing )
- printk("Flask: Starting in enforcing mode.\n");
- else
- printk("Flask: Starting in permissive mode.\n");
+ if ( security_load_policy(policy_buffer, policy_size) )
+ panic("Flask: Unable to load XSM policy");
- return ret;
+ printk("Flask: Starting in %s mode.\n",
+ flask_enforcing ? "enforcing" : "permissive");
}
xsm_initcall(flask_init);
--
2.1.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |