From: Casey Schaufler <casey@schaufler-ca.com>
To: Jarkko Sakkinen <jarkko.j.sakkinen@gmail.com>,
James Morris <jmorris@namei.org>
Cc: linux-kernel@vger.kernel.org, linux-security-module@vger.kernel.org
Subject: Re: [PATCH] Smack: allow to access /smack/access as normal user
Date: Fri, 21 Oct 2011 11:47:12 -0700 [thread overview]
Message-ID: <4EA1BE30.5080900@schaufler-ca.com> (raw)
In-Reply-To: <1318962096-23724-1-git-send-email-jarkko.j.sakkinen@gmail.com>
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 */
> {""}
> };
next prev parent reply other threads:[~2011-10-21 18:47 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-18 18:21 [PATCH] Smack: allow to access /smack/access as normal user Jarkko Sakkinen
2011-10-21 18:47 ` Casey Schaufler [this message]
2011-10-22 20:24 ` James Morris
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EA1BE30.5080900@schaufler-ca.com \
--to=casey@schaufler-ca.com \
--cc=jarkko.j.sakkinen@gmail.com \
--cc=jmorris@namei.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.