Skip to content

Commit

Permalink
xsm, argo: XSM control for argo register
Browse files Browse the repository at this point in the history
XSM controls for argo ring registration with two distinct cases, where
the ring being registered is:

1) Single source:  registering a ring for communication to receive messages
                   from a specified single other domain.
   Default policy: allow.

2) Any source:     registering a ring for communication to receive messages
                   from any, or all, other domains (ie. wildcard).
   Default policy: deny, with runtime policy configuration via bootparam.

The existing argo-mac boot parameter indicates administrator preference for
either permissive or strict access control, which will allow or deny
registration of any-sender rings.

This commit modifies the signature of core XSM hook functions in order to
apply 'const' to arguments, needed in order for 'const' to be accepted in
signature of functions that invoke them.

Signed-off-by: Christopher Clark <[email protected]>

v3 Daniel/Jan: add to the default xsm policy for the register op
v3 hoist opt_argo_mac_permissive check to allow default policy to match non-XSM
v3 was: Acked-by: Daniel De Graaf <[email protected]>
v3 Add Daniel's Acked-by ; note minor changes required for v4
v3 feedback xen-project#7 Roger: use opt_argo_mac_permissive : a boolean opt
v2 feedback #9 Jan: refactor to use argo-mac bootparam at point of introduction
v1 feedback Paul: replace use of strncmp with strcmp
v1 feedback #16 Jan: apply const to function signatures
v1 feedback #14 Jan: add blank line before return in parse_argo_mac_param
  • Loading branch information
dozylynx authored and andyhhp committed Jan 15, 2019
1 parent 62c98e5 commit 3f2d1da
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 7 deletions.
6 changes: 6 additions & 0 deletions tools/flask/policy/modules/guest_features.te
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ allow domain_type xen_t:xen tmem_op;
# pmu_ctrl is for)
allow domain_type xen_t:xen2 pmu_use;

# Allow all domains:
# to register single-sender (unicast) rings to partner with any domain; and
# to register any-sender (wildcard) rings that can be sent to by any domain.
allow domain_type xen_t:argo { register_any_source };
allow domain_type domain_type:argo { register_single_source };

# Allow guest console output to the serial console. This is used by PV Linux
# and stub domains for early boot output, so don't audit even when we deny it.
# Without XSM, this is enabled only if the Xen was compiled in debug mode.
Expand Down
15 changes: 11 additions & 4 deletions xen/common/argo.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <xen/nospec.h>
#include <xen/sched.h>
#include <xen/time.h>
#include <xsm/xsm.h>

#include <public/argo.h>

Expand Down Expand Up @@ -1603,11 +1604,10 @@ register_ring(struct domain *currd,

if ( reg.partner_id == XEN_ARGO_DOMID_ANY )
{
if ( !opt_argo_mac_permissive )
{
ret = -EPERM;
ret = opt_argo_mac_permissive ? xsm_argo_register_any_source(currd) :
-EPERM;
if ( ret )
goto out_unlock;
}
}
else
{
Expand All @@ -1619,6 +1619,13 @@ register_ring(struct domain *currd,
goto out_unlock;
}

ret = xsm_argo_register_single_source(currd, dst_d);
if ( ret )
{
put_domain(dst_d);
goto out_unlock;
}

if ( !dst_d->argo )
{
argo_dprintk("!dst_d->argo, ECONNREFUSED\n");
Expand Down
14 changes: 14 additions & 0 deletions xen/include/xsm/dummy.h
Original file line number Diff line number Diff line change
Expand Up @@ -720,6 +720,20 @@ static XSM_INLINE int xsm_dm_op(XSM_DEFAULT_ARG struct domain *d)

#endif /* CONFIG_X86 */

#ifdef CONFIG_ARGO
static XSM_INLINE int xsm_argo_register_single_source(struct domain *d,
struct domain *t)
{
return 0;
}

static XSM_INLINE int xsm_argo_register_any_source(struct domain *d)
{
return 0;
}

#endif /* CONFIG_ARGO */

#include <public/version.h>
static XSM_INLINE int xsm_xen_version (XSM_DEFAULT_ARG uint32_t op)
{
Expand Down
19 changes: 19 additions & 0 deletions xen/include/xsm/xsm.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,11 @@ struct xsm_operations {
#endif
int (*xen_version) (uint32_t cmd);
int (*domain_resource_map) (struct domain *d);
#ifdef CONFIG_ARGO
int (*argo_register_single_source) (const struct domain *d,
const struct domain *t);
int (*argo_register_any_source) (const struct domain *d);
#endif
};

#ifdef CONFIG_XSM
Expand Down Expand Up @@ -698,6 +703,20 @@ static inline int xsm_domain_resource_map(xsm_default_t def, struct domain *d)
return xsm_ops->domain_resource_map(d);
}

#ifdef CONFIG_ARGO
static inline xsm_argo_register_single_source(const struct domain *d,
const struct domain *t)
{
return xsm_ops->argo_register_single_source(d, t);
}

static inline xsm_argo_register_any_source(const struct domain *d)
{
return xsm_ops->argo_register_any_source(d);
}

#endif /* CONFIG_ARGO */

#endif /* XSM_NO_WRAPPERS */

#ifdef CONFIG_MULTIBOOT
Expand Down
4 changes: 4 additions & 0 deletions xen/xsm/dummy.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,4 +152,8 @@ void __init xsm_fixup_ops (struct xsm_operations *ops)
#endif
set_to_dummy_if_null(ops, xen_version);
set_to_dummy_if_null(ops, domain_resource_map);
#ifdef CONFIG_ARGO
set_to_dummy_if_null(ops, argo_register_single_source);
set_to_dummy_if_null(ops, argo_register_any_source);
#endif
}
27 changes: 24 additions & 3 deletions xen/xsm/flask/hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,14 @@
#include <objsec.h>
#include <conditional.h>

static u32 domain_sid(struct domain *dom)
static u32 domain_sid(const struct domain *dom)
{
struct domain_security_struct *dsec = dom->ssid;
return dsec->sid;
}

static u32 domain_target_sid(struct domain *src, struct domain *dst)
static u32 domain_target_sid(const struct domain *src,
const struct domain *dst)
{
struct domain_security_struct *ssec = src->ssid;
struct domain_security_struct *dsec = dst->ssid;
Expand All @@ -58,7 +59,8 @@ static u32 evtchn_sid(const struct evtchn *chn)
return chn->ssid.flask_sid;
}

static int domain_has_perm(struct domain *dom1, struct domain *dom2,
static int domain_has_perm(const struct domain *dom1,
const struct domain *dom2,
u16 class, u32 perms)
{
u32 ssid, tsid;
Expand Down Expand Up @@ -1717,6 +1719,21 @@ static int flask_domain_resource_map(struct domain *d)
return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__RESOURCE_MAP);
}

#ifdef CONFIG_ARGO
static int flask_argo_register_single_source(const struct domain *d,
const struct domain *t)
{
return domain_has_perm(d, t, SECCLASS_ARGO,
ARGO__REGISTER_SINGLE_SOURCE);
}

static int flask_argo_register_any_source(const struct domain *d)
{
return avc_has_perm(domain_sid(d), SECINITSID_XEN, SECCLASS_ARGO,
ARGO__REGISTER_ANY_SOURCE, NULL);
}
#endif

long do_flask_op(XEN_GUEST_HANDLE_PARAM(xsm_op_t) u_flask_op);
int compat_flask_op(XEN_GUEST_HANDLE_PARAM(xsm_op_t) u_flask_op);

Expand Down Expand Up @@ -1851,6 +1868,10 @@ static struct xsm_operations flask_ops = {
#endif
.xen_version = flask_xen_version,
.domain_resource_map = flask_domain_resource_map,
#ifdef CONFIG_ARGO
.argo_register_single_source = flask_argo_register_single_source,
.argo_register_any_source = flask_argo_register_any_source,
#endif
};

void __init flask_init(const void *policy_buffer, size_t policy_size)
Expand Down
11 changes: 11 additions & 0 deletions xen/xsm/flask/policy/access_vectors
Original file line number Diff line number Diff line change
Expand Up @@ -531,3 +531,14 @@ class version
# Xen build id
xen_build_id
}

# Class argo is used to describe the Argo interdomain communication system.
class argo
{
# Domain requesting registration of a communication ring
# to receive messages from a specific other domain.
register_single_source
# Domain requesting registration of a communication ring
# to receive messages from any other domain.
register_any_source
}
1 change: 1 addition & 0 deletions xen/xsm/flask/policy/security_classes
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@ class event
class grant
class security
class version
class argo

# FLASK

0 comments on commit 3f2d1da

Please sign in to comment.