* [PATCH] Smack: allow to access /smack/access as normal user
@ 2011-10-18 18:21 Jarkko Sakkinen
2011-10-21 18:47 ` Casey Schaufler
0 siblings, 1 reply; 3+ messages in thread
From: Jarkko Sakkinen @ 2011-10-18 18:21 UTC (permalink / raw)
To: Casey Schaufler; +Cc: linux-kernel, linux-security-module, Jarkko Sakkinen
Allow query access as a normal user removing the need
for CAP_MAC_ADMIN. Give RW access to /smack/access
for UGO. Do not import smack labels in access check.
Signed-off-by: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
---
security/smack/smack.h | 1 +
security/smack/smack_access.c | 27 +++++++++++++++++-------
security/smack/smackfs.c | 45 +++++++++++++++++++++++++++-------------
3 files changed, 50 insertions(+), 23 deletions(-)
diff --git a/security/smack/smack.h b/security/smack/smack.h
index 9da2b2d..2ad0065 100644
--- a/security/smack/smack.h
+++ b/security/smack/smack.h
@@ -208,6 +208,7 @@ int smk_curacc(char *, u32, struct smk_audit_info *);
int smack_to_cipso(const char *, struct smack_cipso *);
char *smack_from_cipso(u32, char *);
char *smack_from_secid(const u32);
+void smk_parse_smack(const char *string, int len, char *smack);
char *smk_import(const char *, int);
struct smack_known *smk_import_entry(const char *, int);
struct smack_known *smk_find_entry(const char *);
diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
index a885f62..cc7cb6e 100644
--- a/security/smack/smack_access.c
+++ b/security/smack/smack_access.c
@@ -353,17 +353,13 @@ struct smack_known *smk_find_entry(const char *string)
}
/**
- * smk_import_entry - import a label, return the list entry
- * @string: a text string that might be a Smack label
+ * smk_parse_smack - parse smack label from a text string
+ * @string: a text string that might contain a Smack label
* @len: the maximum size, or zero if it is NULL terminated.
- *
- * Returns a pointer to the entry in the label list that
- * matches the passed string, adding it if necessary.
+ * @smack: parsed smack label, or NULL if parse error
*/
-struct smack_known *smk_import_entry(const char *string, int len)
+void smk_parse_smack(const char *string, int len, char *smack)
{
- struct smack_known *skp;
- char smack[SMK_LABELLEN];
int found;
int i;
@@ -381,7 +377,22 @@ struct smack_known *smk_import_entry(const char *string, int len)
} else
smack[i] = string[i];
}
+}
+
+/**
+ * smk_import_entry - import a label, return the list entry
+ * @string: a text string that might be a Smack label
+ * @len: the maximum size, or zero if it is NULL terminated.
+ *
+ * Returns a pointer to the entry in the label list that
+ * matches the passed string, adding it if necessary.
+ */
+struct smack_known *smk_import_entry(const char *string, int len)
+{
+ struct smack_known *skp;
+ char smack[SMK_LABELLEN];
+ smk_parse_smack(string, len, smack);
if (smack[0] == '\0')
return NULL;
diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
index 381eecf..6aceef5 100644
--- a/security/smack/smackfs.c
+++ b/security/smack/smackfs.c
@@ -191,19 +191,37 @@ static int smk_set_access(struct smack_rule *srp, struct list_head *rule_list,
}
/**
- * smk_parse_rule - parse subject, object and access type
+ * smk_parse_rule - parse Smack rule from load string
* @data: string to be parsed whose size is SMK_LOADLEN
- * @rule: parsed entities are stored in here
+ * @rule: Smack rule
+ * @import: if non-zero, import labels
*/
-static int smk_parse_rule(const char *data, struct smack_rule *rule)
+static int smk_parse_rule(const char *data, struct smack_rule *rule, int import)
{
- rule->smk_subject = smk_import(data, 0);
- if (rule->smk_subject == NULL)
- return -1;
+ char smack[SMK_LABELLEN];
+ struct smack_known *skp;
- rule->smk_object = smk_import(data + SMK_LABELLEN, 0);
- if (rule->smk_object == NULL)
- return -1;
+ if (import) {
+ rule->smk_subject = smk_import(data, 0);
+ if (rule->smk_subject == NULL)
+ return -1;
+
+ rule->smk_object = smk_import(data + SMK_LABELLEN, 0);
+ if (rule->smk_object == NULL)
+ return -1;
+ } else {
+ smk_parse_smack(data, 0, smack);
+ skp = smk_find_entry(smack);
+ if (skp == NULL)
+ return -1;
+ rule->smk_subject = skp->smk_known;
+
+ smk_parse_smack(data + SMK_LABELLEN, 0, smack);
+ skp = smk_find_entry(smack);
+ if (skp == NULL)
+ return -1;
+ rule->smk_object = skp->smk_known;
+ }
rule->smk_access = 0;
@@ -327,7 +345,7 @@ static ssize_t smk_write_load_list(struct file *file, const char __user *buf,
goto out;
}
- if (smk_parse_rule(data, rule))
+ if (smk_parse_rule(data, rule, 1))
goto out_free_rule;
if (rule_list == NULL) {
@@ -1499,14 +1517,11 @@ static ssize_t smk_write_access(struct file *file, const char __user *buf,
char *data;
int res;
- if (!capable(CAP_MAC_ADMIN))
- return -EPERM;
-
data = simple_transaction_get(file, buf, count);
if (IS_ERR(data))
return PTR_ERR(data);
- if (count < SMK_LOADLEN || smk_parse_rule(data, &rule))
+ if (count < SMK_LOADLEN || smk_parse_rule(data, &rule, 0))
return -EINVAL;
res = smk_access(rule.smk_subject, rule.smk_object, rule.smk_access,
@@ -1560,7 +1575,7 @@ static int smk_fill_super(struct super_block *sb, void *data, int silent)
[SMK_LOAD_SELF] = {
"load-self", &smk_load_self_ops, S_IRUGO|S_IWUGO},
[SMK_ACCESSES] = {
- "access", &smk_access_ops, S_IRUGO|S_IWUSR},
+ "access", &smk_access_ops, S_IRUGO|S_IWUGO},
/* last one */
{""}
};
--
1.7.5.4
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] Smack: allow to access /smack/access as normal user
2011-10-18 18:21 [PATCH] Smack: allow to access /smack/access as normal user Jarkko Sakkinen
@ 2011-10-21 18:47 ` Casey Schaufler
2011-10-22 20:24 ` James Morris
0 siblings, 1 reply; 3+ messages in thread
From: Casey Schaufler @ 2011-10-21 18:47 UTC (permalink / raw)
To: Jarkko Sakkinen, James Morris; +Cc: linux-kernel, linux-security-module
On 10/18/2011 11:21 AM, Jarkko Sakkinen wrote:
> Allow query access as a normal user removing the need
> for CAP_MAC_ADMIN. Give RW access to /smack/access
> for UGO. Do not import smack labels in access check.
>
> Signed-off-by: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
Applied to git://gitorious.org/smack-next/kernel.git#master
James, will you please pull:
commit 0e94ae17c857b3835a2b8ea46ce44b5da4e2cc5d
Author: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
Date: Tue Oct 18 21:21:36 2011 +0300
Smack: allow to access /smack/access as normal user
Allow query access as a normal user removing the need
for CAP_MAC_ADMIN. Give RW access to /smack/access
for UGO. Do not import smack labels in access check.
Signed-off-by: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
Signed-off-by: Casey Schaufler <cschaufler@cschaufler-intel.(none)>
commit d86b2b61d4dea614d6f319772a90a8f98b55ed67
Author: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
Date: Tue Oct 18 14:34:28 2011 +0300
Smack: fix: invalid length set for the result of /smack/access
Forgot to update simple_transaction_set() to take terminator
character into account.
Signed-off-by: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
Signed-off-by: Casey Schaufler <cschaufler@cschaufler-intel.(none)>
> ---
> security/smack/smack.h | 1 +
> security/smack/smack_access.c | 27 +++++++++++++++++-------
> security/smack/smackfs.c | 45 +++++++++++++++++++++++++++-------------
> 3 files changed, 50 insertions(+), 23 deletions(-)
>
> diff --git a/security/smack/smack.h b/security/smack/smack.h
> index 9da2b2d..2ad0065 100644
> --- a/security/smack/smack.h
> +++ b/security/smack/smack.h
> @@ -208,6 +208,7 @@ int smk_curacc(char *, u32, struct smk_audit_info *);
> int smack_to_cipso(const char *, struct smack_cipso *);
> char *smack_from_cipso(u32, char *);
> char *smack_from_secid(const u32);
> +void smk_parse_smack(const char *string, int len, char *smack);
> char *smk_import(const char *, int);
> struct smack_known *smk_import_entry(const char *, int);
> struct smack_known *smk_find_entry(const char *);
> diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
> index a885f62..cc7cb6e 100644
> --- a/security/smack/smack_access.c
> +++ b/security/smack/smack_access.c
> @@ -353,17 +353,13 @@ struct smack_known *smk_find_entry(const char *string)
> }
>
> /**
> - * smk_import_entry - import a label, return the list entry
> - * @string: a text string that might be a Smack label
> + * smk_parse_smack - parse smack label from a text string
> + * @string: a text string that might contain a Smack label
> * @len: the maximum size, or zero if it is NULL terminated.
> - *
> - * Returns a pointer to the entry in the label list that
> - * matches the passed string, adding it if necessary.
> + * @smack: parsed smack label, or NULL if parse error
> */
> -struct smack_known *smk_import_entry(const char *string, int len)
> +void smk_parse_smack(const char *string, int len, char *smack)
> {
> - struct smack_known *skp;
> - char smack[SMK_LABELLEN];
> int found;
> int i;
>
> @@ -381,7 +377,22 @@ struct smack_known *smk_import_entry(const char *string, int len)
> } else
> smack[i] = string[i];
> }
> +}
> +
> +/**
> + * smk_import_entry - import a label, return the list entry
> + * @string: a text string that might be a Smack label
> + * @len: the maximum size, or zero if it is NULL terminated.
> + *
> + * Returns a pointer to the entry in the label list that
> + * matches the passed string, adding it if necessary.
> + */
> +struct smack_known *smk_import_entry(const char *string, int len)
> +{
> + struct smack_known *skp;
> + char smack[SMK_LABELLEN];
>
> + smk_parse_smack(string, len, smack);
> if (smack[0] == '\0')
> return NULL;
>
> diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
> index 381eecf..6aceef5 100644
> --- a/security/smack/smackfs.c
> +++ b/security/smack/smackfs.c
> @@ -191,19 +191,37 @@ static int smk_set_access(struct smack_rule *srp, struct list_head *rule_list,
> }
>
> /**
> - * smk_parse_rule - parse subject, object and access type
> + * smk_parse_rule - parse Smack rule from load string
> * @data: string to be parsed whose size is SMK_LOADLEN
> - * @rule: parsed entities are stored in here
> + * @rule: Smack rule
> + * @import: if non-zero, import labels
> */
> -static int smk_parse_rule(const char *data, struct smack_rule *rule)
> +static int smk_parse_rule(const char *data, struct smack_rule *rule, int import)
> {
> - rule->smk_subject = smk_import(data, 0);
> - if (rule->smk_subject == NULL)
> - return -1;
> + char smack[SMK_LABELLEN];
> + struct smack_known *skp;
>
> - rule->smk_object = smk_import(data + SMK_LABELLEN, 0);
> - if (rule->smk_object == NULL)
> - return -1;
> + if (import) {
> + rule->smk_subject = smk_import(data, 0);
> + if (rule->smk_subject == NULL)
> + return -1;
> +
> + rule->smk_object = smk_import(data + SMK_LABELLEN, 0);
> + if (rule->smk_object == NULL)
> + return -1;
> + } else {
> + smk_parse_smack(data, 0, smack);
> + skp = smk_find_entry(smack);
> + if (skp == NULL)
> + return -1;
> + rule->smk_subject = skp->smk_known;
> +
> + smk_parse_smack(data + SMK_LABELLEN, 0, smack);
> + skp = smk_find_entry(smack);
> + if (skp == NULL)
> + return -1;
> + rule->smk_object = skp->smk_known;
> + }
>
> rule->smk_access = 0;
>
> @@ -327,7 +345,7 @@ static ssize_t smk_write_load_list(struct file *file, const char __user *buf,
> goto out;
> }
>
> - if (smk_parse_rule(data, rule))
> + if (smk_parse_rule(data, rule, 1))
> goto out_free_rule;
>
> if (rule_list == NULL) {
> @@ -1499,14 +1517,11 @@ static ssize_t smk_write_access(struct file *file, const char __user *buf,
> char *data;
> int res;
>
> - if (!capable(CAP_MAC_ADMIN))
> - return -EPERM;
> -
> data = simple_transaction_get(file, buf, count);
> if (IS_ERR(data))
> return PTR_ERR(data);
>
> - if (count < SMK_LOADLEN || smk_parse_rule(data, &rule))
> + if (count < SMK_LOADLEN || smk_parse_rule(data, &rule, 0))
> return -EINVAL;
>
> res = smk_access(rule.smk_subject, rule.smk_object, rule.smk_access,
> @@ -1560,7 +1575,7 @@ static int smk_fill_super(struct super_block *sb, void *data, int silent)
> [SMK_LOAD_SELF] = {
> "load-self", &smk_load_self_ops, S_IRUGO|S_IWUGO},
> [SMK_ACCESSES] = {
> - "access", &smk_access_ops, S_IRUGO|S_IWUSR},
> + "access", &smk_access_ops, S_IRUGO|S_IWUGO},
> /* last one */
> {""}
> };
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] Smack: allow to access /smack/access as normal user
2011-10-21 18:47 ` Casey Schaufler
@ 2011-10-22 20:24 ` James Morris
0 siblings, 0 replies; 3+ messages in thread
From: James Morris @ 2011-10-22 20:24 UTC (permalink / raw)
To: Casey Schaufler; +Cc: Jarkko Sakkinen, linux-kernel, linux-security-module
On Fri, 21 Oct 2011, Casey Schaufler wrote:
> On 10/18/2011 11:21 AM, Jarkko Sakkinen wrote:
> > Allow query access as a normal user removing the need
> > for CAP_MAC_ADMIN. Give RW access to /smack/access
> > for UGO. Do not import smack labels in access check.
> >
> > Signed-off-by: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
>
> Applied to git://gitorious.org/smack-next/kernel.git#master
>
> James, will you please pull:
Pulled, but please use git-request-pull for these requests.
>
> commit 0e94ae17c857b3835a2b8ea46ce44b5da4e2cc5d
> Author: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
> Date: Tue Oct 18 21:21:36 2011 +0300
>
> Smack: allow to access /smack/access as normal user
>
> Allow query access as a normal user removing the need
> for CAP_MAC_ADMIN. Give RW access to /smack/access
> for UGO. Do not import smack labels in access check.
>
> Signed-off-by: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
> Signed-off-by: Casey Schaufler <cschaufler@cschaufler-intel.(none)>
>
> commit d86b2b61d4dea614d6f319772a90a8f98b55ed67
> Author: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
> Date: Tue Oct 18 14:34:28 2011 +0300
>
> Smack: fix: invalid length set for the result of /smack/access
>
> Forgot to update simple_transaction_set() to take terminator
> character into account.
>
> Signed-off-by: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>
> Signed-off-by: Casey Schaufler <cschaufler@cschaufler-intel.(none)>
>
>
>
> > ---
> > security/smack/smack.h | 1 +
> > security/smack/smack_access.c | 27 +++++++++++++++++-------
> > security/smack/smackfs.c | 45 +++++++++++++++++++++++++++-------------
> > 3 files changed, 50 insertions(+), 23 deletions(-)
> >
> > diff --git a/security/smack/smack.h b/security/smack/smack.h
> > index 9da2b2d..2ad0065 100644
> > --- a/security/smack/smack.h
> > +++ b/security/smack/smack.h
> > @@ -208,6 +208,7 @@ int smk_curacc(char *, u32, struct smk_audit_info *);
> > int smack_to_cipso(const char *, struct smack_cipso *);
> > char *smack_from_cipso(u32, char *);
> > char *smack_from_secid(const u32);
> > +void smk_parse_smack(const char *string, int len, char *smack);
> > char *smk_import(const char *, int);
> > struct smack_known *smk_import_entry(const char *, int);
> > struct smack_known *smk_find_entry(const char *);
> > diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
> > index a885f62..cc7cb6e 100644
> > --- a/security/smack/smack_access.c
> > +++ b/security/smack/smack_access.c
> > @@ -353,17 +353,13 @@ struct smack_known *smk_find_entry(const char *string)
> > }
> >
> > /**
> > - * smk_import_entry - import a label, return the list entry
> > - * @string: a text string that might be a Smack label
> > + * smk_parse_smack - parse smack label from a text string
> > + * @string: a text string that might contain a Smack label
> > * @len: the maximum size, or zero if it is NULL terminated.
> > - *
> > - * Returns a pointer to the entry in the label list that
> > - * matches the passed string, adding it if necessary.
> > + * @smack: parsed smack label, or NULL if parse error
> > */
> > -struct smack_known *smk_import_entry(const char *string, int len)
> > +void smk_parse_smack(const char *string, int len, char *smack)
> > {
> > - struct smack_known *skp;
> > - char smack[SMK_LABELLEN];
> > int found;
> > int i;
> >
> > @@ -381,7 +377,22 @@ struct smack_known *smk_import_entry(const char *string, int len)
> > } else
> > smack[i] = string[i];
> > }
> > +}
> > +
> > +/**
> > + * smk_import_entry - import a label, return the list entry
> > + * @string: a text string that might be a Smack label
> > + * @len: the maximum size, or zero if it is NULL terminated.
> > + *
> > + * Returns a pointer to the entry in the label list that
> > + * matches the passed string, adding it if necessary.
> > + */
> > +struct smack_known *smk_import_entry(const char *string, int len)
> > +{
> > + struct smack_known *skp;
> > + char smack[SMK_LABELLEN];
> >
> > + smk_parse_smack(string, len, smack);
> > if (smack[0] == '\0')
> > return NULL;
> >
> > diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
> > index 381eecf..6aceef5 100644
> > --- a/security/smack/smackfs.c
> > +++ b/security/smack/smackfs.c
> > @@ -191,19 +191,37 @@ static int smk_set_access(struct smack_rule *srp, struct list_head *rule_list,
> > }
> >
> > /**
> > - * smk_parse_rule - parse subject, object and access type
> > + * smk_parse_rule - parse Smack rule from load string
> > * @data: string to be parsed whose size is SMK_LOADLEN
> > - * @rule: parsed entities are stored in here
> > + * @rule: Smack rule
> > + * @import: if non-zero, import labels
> > */
> > -static int smk_parse_rule(const char *data, struct smack_rule *rule)
> > +static int smk_parse_rule(const char *data, struct smack_rule *rule, int import)
> > {
> > - rule->smk_subject = smk_import(data, 0);
> > - if (rule->smk_subject == NULL)
> > - return -1;
> > + char smack[SMK_LABELLEN];
> > + struct smack_known *skp;
> >
> > - rule->smk_object = smk_import(data + SMK_LABELLEN, 0);
> > - if (rule->smk_object == NULL)
> > - return -1;
> > + if (import) {
> > + rule->smk_subject = smk_import(data, 0);
> > + if (rule->smk_subject == NULL)
> > + return -1;
> > +
> > + rule->smk_object = smk_import(data + SMK_LABELLEN, 0);
> > + if (rule->smk_object == NULL)
> > + return -1;
> > + } else {
> > + smk_parse_smack(data, 0, smack);
> > + skp = smk_find_entry(smack);
> > + if (skp == NULL)
> > + return -1;
> > + rule->smk_subject = skp->smk_known;
> > +
> > + smk_parse_smack(data + SMK_LABELLEN, 0, smack);
> > + skp = smk_find_entry(smack);
> > + if (skp == NULL)
> > + return -1;
> > + rule->smk_object = skp->smk_known;
> > + }
> >
> > rule->smk_access = 0;
> >
> > @@ -327,7 +345,7 @@ static ssize_t smk_write_load_list(struct file *file, const char __user *buf,
> > goto out;
> > }
> >
> > - if (smk_parse_rule(data, rule))
> > + if (smk_parse_rule(data, rule, 1))
> > goto out_free_rule;
> >
> > if (rule_list == NULL) {
> > @@ -1499,14 +1517,11 @@ static ssize_t smk_write_access(struct file *file, const char __user *buf,
> > char *data;
> > int res;
> >
> > - if (!capable(CAP_MAC_ADMIN))
> > - return -EPERM;
> > -
> > data = simple_transaction_get(file, buf, count);
> > if (IS_ERR(data))
> > return PTR_ERR(data);
> >
> > - if (count < SMK_LOADLEN || smk_parse_rule(data, &rule))
> > + if (count < SMK_LOADLEN || smk_parse_rule(data, &rule, 0))
> > return -EINVAL;
> >
> > res = smk_access(rule.smk_subject, rule.smk_object, rule.smk_access,
> > @@ -1560,7 +1575,7 @@ static int smk_fill_super(struct super_block *sb, void *data, int silent)
> > [SMK_LOAD_SELF] = {
> > "load-self", &smk_load_self_ops, S_IRUGO|S_IWUGO},
> > [SMK_ACCESSES] = {
> > - "access", &smk_access_ops, S_IRUGO|S_IWUSR},
> > + "access", &smk_access_ops, S_IRUGO|S_IWUGO},
> > /* last one */
> > {""}
> > };
>
--
James Morris
<jmorris@namei.org>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-10-22 20:24 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-18 18:21 [PATCH] Smack: allow to access /smack/access as normal user Jarkko Sakkinen
2011-10-21 18:47 ` Casey Schaufler
2011-10-22 20:24 ` James Morris
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.