diff options
author | Steve Grubb <sgrubb@redhat.com> | 2006-04-03 09:08:13 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2006-05-01 06:09:58 -0400 |
commit | e7c3497013a7e5496ce3d5fd3c73b5cf5af7a56e (patch) | |
tree | 2a57da5e958011b300256988e414387b1455660c | |
parent | 9c7aa6aa74fa8a5cda36e54cbbe4fffe0214497d (diff) |
[PATCH] Reworked patch for labels on user space messages
The below patch should be applied after the inode and ipc sid patches.
This patch is a reworking of Tim's patch that has been updated to match
the inode and ipc patches since its similar.
[updated:
> Stephen Smalley also wanted to change a variable from isec to tsec in the
> user sid patch. ]
Signed-off-by: Steve Grubb <sgrubb@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | include/linux/netlink.h | 1 | ||||
-rw-r--r-- | include/linux/selinux.h | 16 | ||||
-rw-r--r-- | kernel/audit.c | 22 | ||||
-rw-r--r-- | net/netlink/af_netlink.c | 2 | ||||
-rw-r--r-- | security/selinux/exports.c | 11 |
5 files changed, 49 insertions, 3 deletions
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index f8f3d1c927f8..87b8a5703ebc 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
@@ -143,6 +143,7 @@ struct netlink_skb_parms | |||
143 | __u32 dst_group; | 143 | __u32 dst_group; |
144 | kernel_cap_t eff_cap; | 144 | kernel_cap_t eff_cap; |
145 | __u32 loginuid; /* Login (audit) uid */ | 145 | __u32 loginuid; /* Login (audit) uid */ |
146 | __u32 sid; /* SELinux security id */ | ||
146 | }; | 147 | }; |
147 | 148 | ||
148 | #define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) | 149 | #define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) |
diff --git a/include/linux/selinux.h b/include/linux/selinux.h index 413d66773b91..4047bcde4484 100644 --- a/include/linux/selinux.h +++ b/include/linux/selinux.h | |||
@@ -5,6 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Copyright (C) 2005 Red Hat, Inc., James Morris <jmorris@redhat.com> | 6 | * Copyright (C) 2005 Red Hat, Inc., James Morris <jmorris@redhat.com> |
7 | * Copyright (C) 2006 Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> | 7 | * Copyright (C) 2006 Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> |
8 | * Copyright (C) 2006 IBM Corporation, Timothy R. Chavez <tinytim@us.ibm.com> | ||
8 | * | 9 | * |
9 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License version 2, | 11 | * it under the terms of the GNU General Public License version 2, |
@@ -108,6 +109,16 @@ void selinux_get_inode_sid(const struct inode *inode, u32 *sid); | |||
108 | */ | 109 | */ |
109 | void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid); | 110 | void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid); |
110 | 111 | ||
112 | /** | ||
113 | * selinux_get_task_sid - return the SID of task | ||
114 | * @tsk: the task whose SID will be returned | ||
115 | * @sid: pointer to security context ID to be filled in. | ||
116 | * | ||
117 | * Returns nothing | ||
118 | */ | ||
119 | void selinux_get_task_sid(struct task_struct *tsk, u32 *sid); | ||
120 | |||
121 | |||
111 | #else | 122 | #else |
112 | 123 | ||
113 | static inline int selinux_audit_rule_init(u32 field, u32 op, | 124 | static inline int selinux_audit_rule_init(u32 field, u32 op, |
@@ -156,6 +167,11 @@ static inline void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *si | |||
156 | *sid = 0; | 167 | *sid = 0; |
157 | } | 168 | } |
158 | 169 | ||
170 | static inline void selinux_get_task_sid(struct task_struct *tsk, u32 *sid) | ||
171 | { | ||
172 | *sid = 0; | ||
173 | } | ||
174 | |||
159 | #endif /* CONFIG_SECURITY_SELINUX */ | 175 | #endif /* CONFIG_SECURITY_SELINUX */ |
160 | 176 | ||
161 | #endif /* _LINUX_SELINUX_H */ | 177 | #endif /* _LINUX_SELINUX_H */ |
diff --git a/kernel/audit.c b/kernel/audit.c index 9060be750c48..7ec9ccae1299 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -390,7 +390,7 @@ static int audit_netlink_ok(kernel_cap_t eff_cap, u16 msg_type) | |||
390 | 390 | ||
391 | static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | 391 | static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
392 | { | 392 | { |
393 | u32 uid, pid, seq; | 393 | u32 uid, pid, seq, sid; |
394 | void *data; | 394 | void *data; |
395 | struct audit_status *status_get, status_set; | 395 | struct audit_status *status_get, status_set; |
396 | int err; | 396 | int err; |
@@ -416,6 +416,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
416 | pid = NETLINK_CREDS(skb)->pid; | 416 | pid = NETLINK_CREDS(skb)->pid; |
417 | uid = NETLINK_CREDS(skb)->uid; | 417 | uid = NETLINK_CREDS(skb)->uid; |
418 | loginuid = NETLINK_CB(skb).loginuid; | 418 | loginuid = NETLINK_CB(skb).loginuid; |
419 | sid = NETLINK_CB(skb).sid; | ||
419 | seq = nlh->nlmsg_seq; | 420 | seq = nlh->nlmsg_seq; |
420 | data = NLMSG_DATA(nlh); | 421 | data = NLMSG_DATA(nlh); |
421 | 422 | ||
@@ -468,8 +469,23 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
468 | ab = audit_log_start(NULL, GFP_KERNEL, msg_type); | 469 | ab = audit_log_start(NULL, GFP_KERNEL, msg_type); |
469 | if (ab) { | 470 | if (ab) { |
470 | audit_log_format(ab, | 471 | audit_log_format(ab, |
471 | "user pid=%d uid=%u auid=%u msg='%.1024s'", | 472 | "user pid=%d uid=%u auid=%u", |
472 | pid, uid, loginuid, (char *)data); | 473 | pid, uid, loginuid); |
474 | if (sid) { | ||
475 | char *ctx = NULL; | ||
476 | u32 len; | ||
477 | if (selinux_ctxid_to_string( | ||
478 | sid, &ctx, &len)) { | ||
479 | audit_log_format(ab, | ||
480 | " subj=%u", sid); | ||
481 | /* Maybe call audit_panic? */ | ||
482 | } else | ||
483 | audit_log_format(ab, | ||
484 | " subj=%s", ctx); | ||
485 | kfree(ctx); | ||
486 | } | ||
487 | audit_log_format(ab, " msg='%.1024s'", | ||
488 | (char *)data); | ||
473 | audit_set_pid(ab, pid); | 489 | audit_set_pid(ab, pid); |
474 | audit_log_end(ab); | 490 | audit_log_end(ab); |
475 | } | 491 | } |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 2a233ffcf618..09fbc4bc7088 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -56,6 +56,7 @@ | |||
56 | #include <linux/mm.h> | 56 | #include <linux/mm.h> |
57 | #include <linux/types.h> | 57 | #include <linux/types.h> |
58 | #include <linux/audit.h> | 58 | #include <linux/audit.h> |
59 | #include <linux/selinux.h> | ||
59 | 60 | ||
60 | #include <net/sock.h> | 61 | #include <net/sock.h> |
61 | #include <net/scm.h> | 62 | #include <net/scm.h> |
@@ -1157,6 +1158,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
1157 | NETLINK_CB(skb).dst_pid = dst_pid; | 1158 | NETLINK_CB(skb).dst_pid = dst_pid; |
1158 | NETLINK_CB(skb).dst_group = dst_group; | 1159 | NETLINK_CB(skb).dst_group = dst_group; |
1159 | NETLINK_CB(skb).loginuid = audit_get_loginuid(current->audit_context); | 1160 | NETLINK_CB(skb).loginuid = audit_get_loginuid(current->audit_context); |
1161 | selinux_get_task_sid(current, &(NETLINK_CB(skb).sid)); | ||
1160 | memcpy(NETLINK_CREDS(skb), &siocb->scm->creds, sizeof(struct ucred)); | 1162 | memcpy(NETLINK_CREDS(skb), &siocb->scm->creds, sizeof(struct ucred)); |
1161 | 1163 | ||
1162 | /* What can I do? Netlink is asynchronous, so that | 1164 | /* What can I do? Netlink is asynchronous, so that |
diff --git a/security/selinux/exports.c b/security/selinux/exports.c index 7357cf247f60..ae4c73eb3085 100644 --- a/security/selinux/exports.c +++ b/security/selinux/exports.c | |||
@@ -5,6 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Copyright (C) 2005 Red Hat, Inc., James Morris <jmorris@redhat.com> | 6 | * Copyright (C) 2005 Red Hat, Inc., James Morris <jmorris@redhat.com> |
7 | * Copyright (C) 2006 Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> | 7 | * Copyright (C) 2006 Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> |
8 | * Copyright (C) 2006 IBM Corporation, Timothy R. Chavez <tinytim@us.ibm.com> | ||
8 | * | 9 | * |
9 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License version 2, | 11 | * it under the terms of the GNU General Public License version 2, |
@@ -61,3 +62,13 @@ void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid) | |||
61 | *sid = 0; | 62 | *sid = 0; |
62 | } | 63 | } |
63 | 64 | ||
65 | void selinux_get_task_sid(struct task_struct *tsk, u32 *sid) | ||
66 | { | ||
67 | if (selinux_enabled) { | ||
68 | struct task_security_struct *tsec = tsk->security; | ||
69 | *sid = tsec->sid; | ||
70 | return; | ||
71 | } | ||
72 | *sid = 0; | ||
73 | } | ||
74 | |||