summaryrefslogtreecommitdiffstats
path: root/security
diff options
context:
space:
mode:
authorDavid Quigley <dpquigl@davequigley.com>2013-05-22 12:50:35 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-06-08 16:20:11 -0400
commit746df9b59c8a5f162c907796c7295d3c4c0d8995 (patch)
tree6c0e7ae018bfb33f482afdc74d0c77d6b9edd152 /security
parentd47be3dfecaf20255af89a57460285c82d5271ad (diff)
Security: Add Hook to test if the particular xattr is part of a MAC model.
The interface to request security labels from user space is the xattr interface. When requesting the security label from an NFS server it is important to make sure the requested xattr actually is a MAC label. This allows us to make sure that we get the desired semantics from the attribute instead of something else such as capabilities or a time based LSM. Acked-by: Eric Paris <eparis@redhat.com> Acked-by: James Morris <james.l.morris@oracle.com> Signed-off-by: Matthew N. Dodd <Matthew.Dodd@sparta.com> Signed-off-by: Miguel Rodel Felipe <Rodel_FM@dsi.a-star.edu.sg> Signed-off-by: Phua Eu Gene <PHUA_Eu_Gene@dsi.a-star.edu.sg> Signed-off-by: Khin Mi Mi Aung <Mi_Mi_AUNG@dsi.a-star.edu.sg> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'security')
-rw-r--r--security/capability.c6
-rw-r--r--security/security.c6
-rw-r--r--security/selinux/hooks.c6
-rw-r--r--security/smack/smack_lsm.c11
4 files changed, 29 insertions, 0 deletions
diff --git a/security/capability.c b/security/capability.c
index 58578b4bdad4..71f9682bfb54 100644
--- a/security/capability.c
+++ b/security/capability.c
@@ -823,6 +823,11 @@ static int cap_setprocattr(struct task_struct *p, char *name, void *value,
823 return -EINVAL; 823 return -EINVAL;
824} 824}
825 825
826static int cap_ismaclabel(const char *name)
827{
828 return 0;
829}
830
826static int cap_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) 831static int cap_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
827{ 832{
828 return -EOPNOTSUPP; 833 return -EOPNOTSUPP;
@@ -1042,6 +1047,7 @@ void __init security_fixup_ops(struct security_operations *ops)
1042 set_to_cap_if_null(ops, d_instantiate); 1047 set_to_cap_if_null(ops, d_instantiate);
1043 set_to_cap_if_null(ops, getprocattr); 1048 set_to_cap_if_null(ops, getprocattr);
1044 set_to_cap_if_null(ops, setprocattr); 1049 set_to_cap_if_null(ops, setprocattr);
1050 set_to_cap_if_null(ops, ismaclabel);
1045 set_to_cap_if_null(ops, secid_to_secctx); 1051 set_to_cap_if_null(ops, secid_to_secctx);
1046 set_to_cap_if_null(ops, secctx_to_secid); 1052 set_to_cap_if_null(ops, secctx_to_secid);
1047 set_to_cap_if_null(ops, release_secctx); 1053 set_to_cap_if_null(ops, release_secctx);
diff --git a/security/security.c b/security/security.c
index 0fe2b2ee9545..c3ceb754e705 100644
--- a/security/security.c
+++ b/security/security.c
@@ -1057,6 +1057,12 @@ int security_netlink_send(struct sock *sk, struct sk_buff *skb)
1057 return security_ops->netlink_send(sk, skb); 1057 return security_ops->netlink_send(sk, skb);
1058} 1058}
1059 1059
1060int security_ismaclabel(const char *name)
1061{
1062 return security_ops->ismaclabel(name);
1063}
1064EXPORT_SYMBOL(security_ismaclabel);
1065
1060int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) 1066int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
1061{ 1067{
1062 return security_ops->secid_to_secctx(secid, secdata, seclen); 1068 return security_ops->secid_to_secctx(secid, secdata, seclen);
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index b1f7bd727bd9..bbf219a494d0 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -5454,6 +5454,11 @@ abort_change:
5454 return error; 5454 return error;
5455} 5455}
5456 5456
5457static int selinux_ismaclabel(const char *name)
5458{
5459 return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0);
5460}
5461
5457static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) 5462static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
5458{ 5463{
5459 return security_sid_to_context(secid, secdata, seclen); 5464 return security_sid_to_context(secid, secdata, seclen);
@@ -5692,6 +5697,7 @@ static struct security_operations selinux_ops = {
5692 .getprocattr = selinux_getprocattr, 5697 .getprocattr = selinux_getprocattr,
5693 .setprocattr = selinux_setprocattr, 5698 .setprocattr = selinux_setprocattr,
5694 5699
5700 .ismaclabel = selinux_ismaclabel,
5695 .secid_to_secctx = selinux_secid_to_secctx, 5701 .secid_to_secctx = selinux_secid_to_secctx,
5696 .secctx_to_secid = selinux_secctx_to_secid, 5702 .secctx_to_secid = selinux_secctx_to_secid,
5697 .release_secctx = selinux_release_secctx, 5703 .release_secctx = selinux_release_secctx,
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index d52c780bdb78..a7f485bb4e2e 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -3329,6 +3329,16 @@ static void smack_audit_rule_free(void *vrule)
3329#endif /* CONFIG_AUDIT */ 3329#endif /* CONFIG_AUDIT */
3330 3330
3331/** 3331/**
3332 * smack_ismaclabel - check if xattr @name references a smack MAC label
3333 * @name: Full xattr name to check.
3334 */
3335static int smack_ismaclabel(const char *name)
3336{
3337 return (strcmp(name, XATTR_SMACK_SUFFIX) == 0);
3338}
3339
3340
3341/**
3332 * smack_secid_to_secctx - return the smack label for a secid 3342 * smack_secid_to_secctx - return the smack label for a secid
3333 * @secid: incoming integer 3343 * @secid: incoming integer
3334 * @secdata: destination 3344 * @secdata: destination
@@ -3524,6 +3534,7 @@ struct security_operations smack_ops = {
3524 .audit_rule_free = smack_audit_rule_free, 3534 .audit_rule_free = smack_audit_rule_free,
3525#endif /* CONFIG_AUDIT */ 3535#endif /* CONFIG_AUDIT */
3526 3536
3537 .ismaclabel = smack_ismaclabel,
3527 .secid_to_secctx = smack_secid_to_secctx, 3538 .secid_to_secctx = smack_secid_to_secctx,
3528 .secctx_to_secid = smack_secctx_to_secid, 3539 .secctx_to_secid = smack_secctx_to_secid,
3529 .release_secctx = smack_release_secctx, 3540 .release_secctx = smack_release_secctx,