History

[PATCH] selinux: add hooks for key subsystem

Introduce SELinux hooks to support the access key retention subsystem within the kernel. Incorporate new flask headers from a modified version of the SELinux reference policy, with support for the new security class representing retained keys. Extend the "key_alloc" security hook with a task parameter representing the intended ownership context for the key being allocated. Attach security information to root's default keyrings within the SELinux initialization routine. Has passed David's testsuite.

Michael LeMay committed 20 years ago

Commit d7200241 parent f893afb16 files · +155 −27Browse files

Showing the changes to security/selinux (6 of 16 files). Show all

Unified · Split

6 files
  1. security/selinux/hooks.c +64 −0
  2. security/selinux/include/av_perm_to_string.h +6 −0
  3. security/selinux/include/av_permissions.h +8 −0
  4. security/selinux/include/class_to_string.h +1 −0
  5. security/selinux/include/flask.h +1 −0
  6. security/selinux/include/objsec.h +5 −0
security/selinux/hooks.c+64−0
@@ -4252,6 +4252,57 @@ static int selinux_setprocattr(struct task_struct *p, · 4251 unmodified lines
42524252 return size;
42534253 }
42544254
4255+#ifdef CONFIG_KEYS
4256+
4257+static int selinux_key_alloc(struct key *k, struct task_struct *tsk)
4258+{
4259+ struct task_security_struct *tsec = tsk->security;
4260+ struct key_security_struct *ksec;
4261+
4262+ ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
4263+ if (!ksec)
4264+ return -ENOMEM;
4265+
4266+ ksec->obj = k;
4267+ ksec->sid = tsec->sid;
4268+ k->security = ksec;
4269+
4270+ return 0;
4271+}
4272+
4273+static void selinux_key_free(struct key *k)
4274+{
4275+ struct key_security_struct *ksec = k->security;
4276+
4277+ k->security = NULL;
4278+ kfree(ksec);
4279+}
4280+
4281+static int selinux_key_permission(key_ref_t key_ref,
4282+ struct task_struct *ctx,
4283+ key_perm_t perm)
4284+{
4285+ struct key *key;
4286+ struct task_security_struct *tsec;
4287+ struct key_security_struct *ksec;
4288+
4289+ key = key_ref_to_ptr(key_ref);
4290+
4291+ tsec = ctx->security;
4292+ ksec = key->security;
4293+
4294+ /* if no specific permissions are requested, we skip the
4295+ permission check. No serious, additional covert channels
4296+ appear to be created. */
4297+ if (perm == 0)
4298+ return 0;
4299+
4300+ return avc_has_perm(tsec->sid, ksec->sid,
4301+ SECCLASS_KEY, perm, NULL);
4302+}
4303+
4304+#endif
4305+
42554306 static struct security_operations selinux_ops = {
42564307 .ptrace = selinux_ptrace,
42574308 .capget = selinux_capget,
@@ -4406,6 +4457,12 @@ static struct security_operations selinux_ops = { · 148 unmodified lines
44064457 .xfrm_state_delete_security = selinux_xfrm_state_delete,
44074458 .xfrm_policy_lookup = selinux_xfrm_policy_lookup,
44084459 #endif
4460+
4461+#ifdef CONFIG_KEYS
4462+ .key_alloc = selinux_key_alloc,
4463+ .key_free = selinux_key_free,
4464+ .key_permission = selinux_key_permission,
4465+#endif
44094466 };
44104467
44114468 static __init int selinux_init(void)
@@ -4441,6 +4498,13 @@ static __init int selinux_init(void) · 29 unmodified lines
44414498 } else {
44424499 printk(KERN_INFO "SELinux: Starting in permissive mode\n");
44434500 }
4501+
4502+#ifdef CONFIG_KEYS
4503+ /* Add security information to initial keyrings */
4504+ security_key_alloc(&root_user_keyring, current);
4505+ security_key_alloc(&root_session_keyring, current);
4506+#endif
4507+
44444508 return 0;
44454509 }
44464510
security/selinux/include/av_perm_to_string.h+6−0
@@ -242,3 +242,9 @@ · 241 unmodified lines
242242 S_(SECCLASS_PACKET, PACKET__SEND, "send")
243243 S_(SECCLASS_PACKET, PACKET__RECV, "recv")
244244 S_(SECCLASS_PACKET, PACKET__RELABELTO, "relabelto")
245+ S_(SECCLASS_KEY, KEY__VIEW, "view")
246+ S_(SECCLASS_KEY, KEY__READ, "read")
247+ S_(SECCLASS_KEY, KEY__WRITE, "write")
248+ S_(SECCLASS_KEY, KEY__SEARCH, "search")
249+ S_(SECCLASS_KEY, KEY__LINK, "link")
250+ S_(SECCLASS_KEY, KEY__SETATTR, "setattr")
security/selinux/include/av_permissions.h+8−0
@@ -959,3 +959,11 @@ · 958 unmodified lines
959959 #define PACKET__SEND 0x00000001UL
960960 #define PACKET__RECV 0x00000002UL
961961 #define PACKET__RELABELTO 0x00000004UL
962+
963+#define KEY__VIEW 0x00000001UL
964+#define KEY__READ 0x00000002UL
965+#define KEY__WRITE 0x00000004UL
966+#define KEY__SEARCH 0x00000008UL
967+#define KEY__LINK 0x00000010UL
968+#define KEY__SETATTR 0x00000020UL
969+
security/selinux/include/class_to_string.h+1−0
@@ -60,3 +60,4 @@ · 59 unmodified lines
6060 S_("netlink_kobject_uevent_socket")
6161 S_("appletalk_socket")
6262 S_("packet")
63+ S_("key")
security/selinux/include/flask.h+1−0
@@ -62,6 +62,7 @@ · 61 unmodified lines
6262 #define SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET 55
6363 #define SECCLASS_APPLETALK_SOCKET 56
6464 #define SECCLASS_PACKET 57
65+#define SECCLASS_KEY 58
6566
6667 /*
6768 * Security identifier indices for initial entities
security/selinux/include/objsec.h+5−0
@@ -99,6 +99,11 @@ struct sk_security_struct { · 98 unmodified lines
9999 u32 peer_sid; /* SID of peer */
100100 };
101101
102+struct key_security_struct {
103+ struct key *obj; /* back pointer */
104+ u32 sid; /* SID of key */
105+};
106+
102107 extern unsigned int selinux_checkreqprot;
103108
104109 #endif /* _SELINUX_OBJSEC_H_ */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t