Thread (32 messages) 32 messages, 2 authors, 2019-11-21
STALE2505d REVIEWED: 2 (1M)

Revision v11 of 54 in this series; 2 review trailers.

Revisions (54)
  1. v1 [diff vs current]
  2. v1 [diff vs current]
  3. v1 [diff vs current]
  4. v1 [diff vs current]
  5. v1 [diff vs current]
  6. v2 [diff vs current]
  7. v3 [diff vs current]
  8. v3 [diff vs current]
  9. v4 [diff vs current]
  10. v5 [diff vs current]
  11. v5 [diff vs current]
  12. v7 [diff vs current]
  13. v8 [diff vs current]
  14. v10 [diff vs current]
  15. v10 [diff vs current]
  16. v10 [diff vs current]
  17. v11 [diff vs current]
  18. v11 [diff vs current]
  19. v11 current
  20. v11 [diff vs current]
  21. v12 [diff vs current]
  22. v12 [diff vs current]
  23. v12 [diff vs current]
  24. v12 [diff vs current]
  25. v13 [diff vs current]
  26. v14 [diff vs current]
  27. v15 [diff vs current]
  28. v15 [diff vs current]
  29. v15 [diff vs current]
  30. v15 [diff vs current]
  31. v16 [diff vs current]
  32. v17 [diff vs current]
  33. v18 [diff vs current]
  34. v19 [diff vs current]
  35. v20 [diff vs current]
  36. v22 [diff vs current]
  37. v22 [diff vs current]
  38. v22 [diff vs current]
  39. v24 [diff vs current]
  40. v25 [diff vs current]
  41. v26 [diff vs current]
  42. v27 [diff vs current]
  43. v28 [diff vs current]
  44. v29 [diff vs current]
  45. v30 [diff vs current]
  46. v31 [diff vs current]
  47. v32 [diff vs current]
  48. v33 [diff vs current]
  49. v34 [diff vs current]
  50. v34 [diff vs current]
  51. v35 [diff vs current]
  52. v36 [diff vs current]
  53. v37 [diff vs current]
  54. v38 [diff vs current]

[PATCH v11 08/25] LSM: Use lsmblob in security_ipc_getsecid

From: Casey Schaufler <casey@schaufler-ca.com>
Date: 2019-11-13 18:20:09
Also in: selinux
Subsystem: audit subsystem, security subsystem, the rest · Maintainers: Paul Moore, Eric Paris, James Morris, "Serge E. Hallyn", Linus Torvalds

Possibly related (same subject, not in this thread)

There may be more than one LSM that provides IPC data
for auditing. Change security_ipc_getsecid() to fill in
a lsmblob structure instead of the u32 secid. The
audit data structure containing the secid will be updated
later, so there is a bit of scaffolding here.

Reviewed-by: Kees Cook <redacted>
Reviewed-by: John Johansen <john.johansen@canonical.com>
Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
---
 include/linux/security.h |  7 ++++---
 kernel/auditsc.c         |  5 ++++-
 security/security.c      | 12 +++++++++---
 3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/include/linux/security.h b/include/linux/security.h
index a3e99bccb1bb..9519b4fb43ae 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -464,7 +464,7 @@ int security_task_prctl(int option, unsigned long arg2, unsigned long arg3,
 			unsigned long arg4, unsigned long arg5);
 void security_task_to_inode(struct task_struct *p, struct inode *inode);
 int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag);
-void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid);
+void security_ipc_getsecid(struct kern_ipc_perm *ipcp, struct lsmblob *blob);
 int security_msg_msg_alloc(struct msg_msg *msg);
 void security_msg_msg_free(struct msg_msg *msg);
 int security_msg_queue_alloc(struct kern_ipc_perm *msq);
@@ -1172,9 +1172,10 @@ static inline int security_ipc_permission(struct kern_ipc_perm *ipcp,
 	return 0;
 }
 
-static inline void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
+static inline void security_ipc_getsecid(struct kern_ipc_perm *ipcp,
+					 struct lsmblob *blob)
 {
-	*secid = 0;
+	lsmblob_init(blob, 0);
 }
 
 static inline int security_msg_msg_alloc(struct msg_msg *msg)
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index 04803c3099b2..ce8bf2d8f8d2 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -2285,11 +2285,14 @@ void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
 void __audit_ipc_obj(struct kern_ipc_perm *ipcp)
 {
 	struct audit_context *context = audit_context();
+	struct lsmblob blob;
 	context->ipc.uid = ipcp->uid;
 	context->ipc.gid = ipcp->gid;
 	context->ipc.mode = ipcp->mode;
 	context->ipc.has_perm = 0;
-	security_ipc_getsecid(ipcp, &context->ipc.osid);
+	security_ipc_getsecid(ipcp, &blob);
+	/* scaffolding on the [0] - change "osid" to a lsmblob */
+	context->ipc.osid = blob.secid[0];
 	context->type = AUDIT_IPC;
 }
 
diff --git a/security/security.c b/security/security.c
index 0fc75a31a6bb..b60c6a51f622 100644
--- a/security/security.c
+++ b/security/security.c
@@ -1783,10 +1783,16 @@ int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
 	return call_int_hook(ipc_permission, 0, ipcp, flag);
 }
 
-void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
+void security_ipc_getsecid(struct kern_ipc_perm *ipcp, struct lsmblob *blob)
 {
-	*secid = 0;
-	call_void_hook(ipc_getsecid, ipcp, secid);
+	struct security_hook_list *hp;
+
+	lsmblob_init(blob, 0);
+	hlist_for_each_entry(hp, &security_hook_heads.ipc_getsecid, list) {
+		if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot))
+			continue;
+		hp->hook.ipc_getsecid(ipcp, &blob->secid[hp->lsmid->slot]);
+	}
 }
 
 int security_msg_msg_alloc(struct msg_msg *msg)
-- 
2.20.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help