[PATCH 11/14] UBUNTU: SAUCE: apparmor: fix: parameters can be changed after policy is locked
John Johansen
john.johansen at canonical.com
Tue Aug 23 09:05:51 UTC 2016
the policy_lock parameter is a one way switch that prevents policy
from being further modified. Unfortunately some of the module parameters
can effectively modify policy by turning off enforcement.
split policy_admin_capable into a view check and a full admin check,
and update the admin check to test the policy_lock parameter.
BugLink: http://bugs.launchpad.net/bugs/1615895
Signed-off-by: John Johansen <john.johansen at canonical.com>
---
security/apparmor/include/policy.h | 1 +
security/apparmor/lsm.c | 12 +++++-------
security/apparmor/policy.c | 7 ++++++-
3 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/security/apparmor/include/policy.h b/security/apparmor/include/policy.h
index 5e563d7..af2685f 100644
--- a/security/apparmor/include/policy.h
+++ b/security/apparmor/include/policy.h
@@ -280,6 +280,7 @@ static inline int AUDIT_MODE(struct aa_profile *profile)
return profile->audit;
}
+bool policy_view_capable(void);
bool policy_admin_capable(void);
bool aa_may_open_profiles(void);
int aa_may_manage_policy(struct aa_label *label, u32 mask);
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index a24aae5..0e82a89 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -1358,14 +1358,12 @@ static int param_set_aalockpolicy(const char *val, const struct kernel_param *kp
{
if (!policy_admin_capable())
return -EPERM;
- if (aa_g_lock_policy)
- return -EACCES;
return param_set_bool(val, kp);
}
static int param_get_aalockpolicy(char *buffer, const struct kernel_param *kp)
{
- if (!policy_admin_capable())
+ if (!policy_view_capable())
return -EPERM;
if (!apparmor_enabled)
return -EINVAL;
@@ -1383,7 +1381,7 @@ static int param_set_aabool(const char *val, const struct kernel_param *kp)
static int param_get_aabool(char *buffer, const struct kernel_param *kp)
{
- if (!policy_admin_capable())
+ if (!policy_view_capable())
return -EPERM;
if (!apparmor_enabled)
return -EINVAL;
@@ -1401,7 +1399,7 @@ static int param_set_aauint(const char *val, const struct kernel_param *kp)
static int param_get_aauint(char *buffer, const struct kernel_param *kp)
{
- if (!policy_admin_capable())
+ if (!policy_view_capable())
return -EPERM;
if (!apparmor_enabled)
return -EINVAL;
@@ -1410,7 +1408,7 @@ static int param_get_aauint(char *buffer, const struct kernel_param *kp)
static int param_get_audit(char *buffer, struct kernel_param *kp)
{
- if (!policy_admin_capable())
+ if (!policy_view_capable())
return -EPERM;
if (!apparmor_enabled)
return -EINVAL;
@@ -1439,7 +1437,7 @@ static int param_set_audit(const char *val, struct kernel_param *kp)
static int param_get_mode(char *buffer, struct kernel_param *kp)
{
- if (!policy_admin_capable())
+ if (!policy_view_capable())
return -EPERM;
if (!apparmor_enabled)
return -EINVAL;
diff --git a/security/apparmor/policy.c b/security/apparmor/policy.c
index 12cd14f..47dfe65 100644
--- a/security/apparmor/policy.c
+++ b/security/apparmor/policy.c
@@ -617,7 +617,7 @@ static int audit_policy(struct aa_label *label, const char *op,
return error;
}
-bool policy_admin_capable(void)
+bool policy_view_capable(void)
{
struct user_namespace *user_ns = current_user_ns();
struct aa_ns *ns = aa_get_current_ns();
@@ -633,6 +633,11 @@ bool policy_admin_capable(void)
return response;
}
+bool policy_admin_capable(void)
+{
+ return policy_view_capable() && !aa_g_lock_policy;
+}
+
bool aa_may_open_profiles(void)
{
struct user_namespace *user_ns = current_user_ns();
--
2.7.4
More information about the kernel-team
mailing list