mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-11 09:50:12 +00:00
Add MAC_STATIC, a kernel option that disables internal MAC Framework
synchronization protecting against dynamic load and unload of MAC policies, and instead simply blocks load and unload. In a static configuration, this allows you to avoid the synchronization costs associated with introducing dynamicism. Obtained from: TrustedBSD Project Sponsored by: DARPA, McAfee Research
This commit is contained in:
parent
100ed7e49e
commit
0a05006dd2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=128885
@ -93,6 +93,7 @@ MAC_NONE opt_dontuse.h
|
|||||||
MAC_PARTITION opt_dontuse.h
|
MAC_PARTITION opt_dontuse.h
|
||||||
MAC_PORTACL opt_dontuse.h
|
MAC_PORTACL opt_dontuse.h
|
||||||
MAC_SEEOTHERUIDS opt_dontuse.h
|
MAC_SEEOTHERUIDS opt_dontuse.h
|
||||||
|
MAC_STATIC opt_mac.h
|
||||||
MAC_STUB opt_dontuse.h
|
MAC_STUB opt_dontuse.h
|
||||||
MAC_TEST opt_dontuse.h
|
MAC_TEST opt_dontuse.h
|
||||||
MD_ROOT opt_md.h
|
MD_ROOT opt_md.h
|
||||||
|
@ -166,9 +166,11 @@ MALLOC_DEFINE(M_MACTEMP, "mactemp", "MAC temporary label storage");
|
|||||||
* exclusive consumers that they should try to acquire the lock if a
|
* exclusive consumers that they should try to acquire the lock if a
|
||||||
* first attempt at exclusive access fails.
|
* first attempt at exclusive access fails.
|
||||||
*/
|
*/
|
||||||
|
#ifndef MAC_STATIC
|
||||||
static struct mtx mac_policy_mtx;
|
static struct mtx mac_policy_mtx;
|
||||||
static struct cv mac_policy_cv;
|
static struct cv mac_policy_cv;
|
||||||
static int mac_policy_count;
|
static int mac_policy_count;
|
||||||
|
#endif
|
||||||
struct mac_policy_list_head mac_policy_list;
|
struct mac_policy_list_head mac_policy_list;
|
||||||
struct mac_policy_list_head mac_static_policy_list;
|
struct mac_policy_list_head mac_static_policy_list;
|
||||||
|
|
||||||
@ -185,44 +187,53 @@ void
|
|||||||
mac_policy_grab_exclusive(void)
|
mac_policy_grab_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
|
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
|
||||||
"mac_policy_grab_exclusive() at %s:%d", __FILE__, __LINE__);
|
"mac_policy_grab_exclusive() at %s:%d", __FILE__, __LINE__);
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
while (mac_policy_count != 0)
|
while (mac_policy_count != 0)
|
||||||
cv_wait(&mac_policy_cv, &mac_policy_mtx);
|
cv_wait(&mac_policy_cv, &mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_assert_exclusive(void)
|
mac_policy_assert_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_assert(&mac_policy_mtx, MA_OWNED);
|
mtx_assert(&mac_policy_mtx, MA_OWNED);
|
||||||
KASSERT(mac_policy_count == 0,
|
KASSERT(mac_policy_count == 0,
|
||||||
("mac_policy_assert_exclusive(): not exclusive"));
|
("mac_policy_assert_exclusive(): not exclusive"));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_release_exclusive(void)
|
mac_policy_release_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
KASSERT(mac_policy_count == 0,
|
KASSERT(mac_policy_count == 0,
|
||||||
("mac_policy_release_exclusive(): not exclusive"));
|
("mac_policy_release_exclusive(): not exclusive"));
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
cv_signal(&mac_policy_cv);
|
cv_signal(&mac_policy_cv);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_list_busy(void)
|
mac_policy_list_busy(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
mac_policy_count++;
|
mac_policy_count++;
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
mac_policy_list_conditional_busy(void)
|
mac_policy_list_conditional_busy(void)
|
||||||
{
|
{
|
||||||
|
#ifndef MAC_STATIC
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
@ -233,18 +244,23 @@ mac_policy_list_conditional_busy(void)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
return (ret);
|
return (ret);
|
||||||
|
#else
|
||||||
|
return (1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_list_unbusy(void)
|
mac_policy_list_unbusy(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
mac_policy_count--;
|
mac_policy_count--;
|
||||||
KASSERT(mac_policy_count >= 0, ("MAC_POLICY_LIST_LOCK"));
|
KASSERT(mac_policy_count >= 0, ("MAC_POLICY_LIST_LOCK"));
|
||||||
if (mac_policy_count == 0)
|
if (mac_policy_count == 0)
|
||||||
cv_signal(&mac_policy_cv);
|
cv_signal(&mac_policy_cv);
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -258,8 +274,10 @@ mac_init(void)
|
|||||||
LIST_INIT(&mac_policy_list);
|
LIST_INIT(&mac_policy_list);
|
||||||
mac_labelzone_init();
|
mac_labelzone_init();
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_init(&mac_policy_mtx, "mac_policy_mtx", NULL, MTX_DEF);
|
mtx_init(&mac_policy_mtx, "mac_policy_mtx", NULL, MTX_DEF);
|
||||||
cv_init(&mac_policy_cv, "mac_policy_cv");
|
cv_init(&mac_policy_cv, "mac_policy_cv");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -314,6 +332,13 @@ mac_policy_modevent(module_t mod, int type, void *data)
|
|||||||
error = 0;
|
error = 0;
|
||||||
mpc = (struct mac_policy_conf *) data;
|
mpc = (struct mac_policy_conf *) data;
|
||||||
|
|
||||||
|
#ifdef MAC_STATIC
|
||||||
|
if (mac_late) {
|
||||||
|
printf("mac_policy_modevent: MAC_STATIC and late\n");
|
||||||
|
return (EBUSY);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MOD_LOAD:
|
case MOD_LOAD:
|
||||||
if (mpc->mpc_loadtime_flags & MPC_LOADTIME_FLAG_NOTLATE &&
|
if (mpc->mpc_loadtime_flags & MPC_LOADTIME_FLAG_NOTLATE &&
|
||||||
|
@ -166,9 +166,11 @@ MALLOC_DEFINE(M_MACTEMP, "mactemp", "MAC temporary label storage");
|
|||||||
* exclusive consumers that they should try to acquire the lock if a
|
* exclusive consumers that they should try to acquire the lock if a
|
||||||
* first attempt at exclusive access fails.
|
* first attempt at exclusive access fails.
|
||||||
*/
|
*/
|
||||||
|
#ifndef MAC_STATIC
|
||||||
static struct mtx mac_policy_mtx;
|
static struct mtx mac_policy_mtx;
|
||||||
static struct cv mac_policy_cv;
|
static struct cv mac_policy_cv;
|
||||||
static int mac_policy_count;
|
static int mac_policy_count;
|
||||||
|
#endif
|
||||||
struct mac_policy_list_head mac_policy_list;
|
struct mac_policy_list_head mac_policy_list;
|
||||||
struct mac_policy_list_head mac_static_policy_list;
|
struct mac_policy_list_head mac_static_policy_list;
|
||||||
|
|
||||||
@ -185,44 +187,53 @@ void
|
|||||||
mac_policy_grab_exclusive(void)
|
mac_policy_grab_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
|
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
|
||||||
"mac_policy_grab_exclusive() at %s:%d", __FILE__, __LINE__);
|
"mac_policy_grab_exclusive() at %s:%d", __FILE__, __LINE__);
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
while (mac_policy_count != 0)
|
while (mac_policy_count != 0)
|
||||||
cv_wait(&mac_policy_cv, &mac_policy_mtx);
|
cv_wait(&mac_policy_cv, &mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_assert_exclusive(void)
|
mac_policy_assert_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_assert(&mac_policy_mtx, MA_OWNED);
|
mtx_assert(&mac_policy_mtx, MA_OWNED);
|
||||||
KASSERT(mac_policy_count == 0,
|
KASSERT(mac_policy_count == 0,
|
||||||
("mac_policy_assert_exclusive(): not exclusive"));
|
("mac_policy_assert_exclusive(): not exclusive"));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_release_exclusive(void)
|
mac_policy_release_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
KASSERT(mac_policy_count == 0,
|
KASSERT(mac_policy_count == 0,
|
||||||
("mac_policy_release_exclusive(): not exclusive"));
|
("mac_policy_release_exclusive(): not exclusive"));
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
cv_signal(&mac_policy_cv);
|
cv_signal(&mac_policy_cv);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_list_busy(void)
|
mac_policy_list_busy(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
mac_policy_count++;
|
mac_policy_count++;
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
mac_policy_list_conditional_busy(void)
|
mac_policy_list_conditional_busy(void)
|
||||||
{
|
{
|
||||||
|
#ifndef MAC_STATIC
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
@ -233,18 +244,23 @@ mac_policy_list_conditional_busy(void)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
return (ret);
|
return (ret);
|
||||||
|
#else
|
||||||
|
return (1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_list_unbusy(void)
|
mac_policy_list_unbusy(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
mac_policy_count--;
|
mac_policy_count--;
|
||||||
KASSERT(mac_policy_count >= 0, ("MAC_POLICY_LIST_LOCK"));
|
KASSERT(mac_policy_count >= 0, ("MAC_POLICY_LIST_LOCK"));
|
||||||
if (mac_policy_count == 0)
|
if (mac_policy_count == 0)
|
||||||
cv_signal(&mac_policy_cv);
|
cv_signal(&mac_policy_cv);
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -258,8 +274,10 @@ mac_init(void)
|
|||||||
LIST_INIT(&mac_policy_list);
|
LIST_INIT(&mac_policy_list);
|
||||||
mac_labelzone_init();
|
mac_labelzone_init();
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_init(&mac_policy_mtx, "mac_policy_mtx", NULL, MTX_DEF);
|
mtx_init(&mac_policy_mtx, "mac_policy_mtx", NULL, MTX_DEF);
|
||||||
cv_init(&mac_policy_cv, "mac_policy_cv");
|
cv_init(&mac_policy_cv, "mac_policy_cv");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -314,6 +332,13 @@ mac_policy_modevent(module_t mod, int type, void *data)
|
|||||||
error = 0;
|
error = 0;
|
||||||
mpc = (struct mac_policy_conf *) data;
|
mpc = (struct mac_policy_conf *) data;
|
||||||
|
|
||||||
|
#ifdef MAC_STATIC
|
||||||
|
if (mac_late) {
|
||||||
|
printf("mac_policy_modevent: MAC_STATIC and late\n");
|
||||||
|
return (EBUSY);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MOD_LOAD:
|
case MOD_LOAD:
|
||||||
if (mpc->mpc_loadtime_flags & MPC_LOADTIME_FLAG_NOTLATE &&
|
if (mpc->mpc_loadtime_flags & MPC_LOADTIME_FLAG_NOTLATE &&
|
||||||
|
@ -166,9 +166,11 @@ MALLOC_DEFINE(M_MACTEMP, "mactemp", "MAC temporary label storage");
|
|||||||
* exclusive consumers that they should try to acquire the lock if a
|
* exclusive consumers that they should try to acquire the lock if a
|
||||||
* first attempt at exclusive access fails.
|
* first attempt at exclusive access fails.
|
||||||
*/
|
*/
|
||||||
|
#ifndef MAC_STATIC
|
||||||
static struct mtx mac_policy_mtx;
|
static struct mtx mac_policy_mtx;
|
||||||
static struct cv mac_policy_cv;
|
static struct cv mac_policy_cv;
|
||||||
static int mac_policy_count;
|
static int mac_policy_count;
|
||||||
|
#endif
|
||||||
struct mac_policy_list_head mac_policy_list;
|
struct mac_policy_list_head mac_policy_list;
|
||||||
struct mac_policy_list_head mac_static_policy_list;
|
struct mac_policy_list_head mac_static_policy_list;
|
||||||
|
|
||||||
@ -185,44 +187,53 @@ void
|
|||||||
mac_policy_grab_exclusive(void)
|
mac_policy_grab_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
|
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
|
||||||
"mac_policy_grab_exclusive() at %s:%d", __FILE__, __LINE__);
|
"mac_policy_grab_exclusive() at %s:%d", __FILE__, __LINE__);
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
while (mac_policy_count != 0)
|
while (mac_policy_count != 0)
|
||||||
cv_wait(&mac_policy_cv, &mac_policy_mtx);
|
cv_wait(&mac_policy_cv, &mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_assert_exclusive(void)
|
mac_policy_assert_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_assert(&mac_policy_mtx, MA_OWNED);
|
mtx_assert(&mac_policy_mtx, MA_OWNED);
|
||||||
KASSERT(mac_policy_count == 0,
|
KASSERT(mac_policy_count == 0,
|
||||||
("mac_policy_assert_exclusive(): not exclusive"));
|
("mac_policy_assert_exclusive(): not exclusive"));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_release_exclusive(void)
|
mac_policy_release_exclusive(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
KASSERT(mac_policy_count == 0,
|
KASSERT(mac_policy_count == 0,
|
||||||
("mac_policy_release_exclusive(): not exclusive"));
|
("mac_policy_release_exclusive(): not exclusive"));
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
cv_signal(&mac_policy_cv);
|
cv_signal(&mac_policy_cv);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_list_busy(void)
|
mac_policy_list_busy(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
mac_policy_count++;
|
mac_policy_count++;
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
mac_policy_list_conditional_busy(void)
|
mac_policy_list_conditional_busy(void)
|
||||||
{
|
{
|
||||||
|
#ifndef MAC_STATIC
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
@ -233,18 +244,23 @@ mac_policy_list_conditional_busy(void)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
return (ret);
|
return (ret);
|
||||||
|
#else
|
||||||
|
return (1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mac_policy_list_unbusy(void)
|
mac_policy_list_unbusy(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_lock(&mac_policy_mtx);
|
mtx_lock(&mac_policy_mtx);
|
||||||
mac_policy_count--;
|
mac_policy_count--;
|
||||||
KASSERT(mac_policy_count >= 0, ("MAC_POLICY_LIST_LOCK"));
|
KASSERT(mac_policy_count >= 0, ("MAC_POLICY_LIST_LOCK"));
|
||||||
if (mac_policy_count == 0)
|
if (mac_policy_count == 0)
|
||||||
cv_signal(&mac_policy_cv);
|
cv_signal(&mac_policy_cv);
|
||||||
mtx_unlock(&mac_policy_mtx);
|
mtx_unlock(&mac_policy_mtx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -258,8 +274,10 @@ mac_init(void)
|
|||||||
LIST_INIT(&mac_policy_list);
|
LIST_INIT(&mac_policy_list);
|
||||||
mac_labelzone_init();
|
mac_labelzone_init();
|
||||||
|
|
||||||
|
#ifndef MAC_STATIC
|
||||||
mtx_init(&mac_policy_mtx, "mac_policy_mtx", NULL, MTX_DEF);
|
mtx_init(&mac_policy_mtx, "mac_policy_mtx", NULL, MTX_DEF);
|
||||||
cv_init(&mac_policy_cv, "mac_policy_cv");
|
cv_init(&mac_policy_cv, "mac_policy_cv");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -314,6 +332,13 @@ mac_policy_modevent(module_t mod, int type, void *data)
|
|||||||
error = 0;
|
error = 0;
|
||||||
mpc = (struct mac_policy_conf *) data;
|
mpc = (struct mac_policy_conf *) data;
|
||||||
|
|
||||||
|
#ifdef MAC_STATIC
|
||||||
|
if (mac_late) {
|
||||||
|
printf("mac_policy_modevent: MAC_STATIC and late\n");
|
||||||
|
return (EBUSY);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MOD_LOAD:
|
case MOD_LOAD:
|
||||||
if (mpc->mpc_loadtime_flags & MPC_LOADTIME_FLAG_NOTLATE &&
|
if (mpc->mpc_loadtime_flags & MPC_LOADTIME_FLAG_NOTLATE &&
|
||||||
|
Loading…
Reference in New Issue
Block a user