--- v14
+++ v31
@@ -1,114 +1,94 @@
-Change the security_inode_getsecid() interface to fill in a
-lsmblob structure instead of a u32 secid. This allows for its
-callers to gather data from all registered LSMs. Data is provided
-for IMA and audit.
+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 <keescook@chromium.org>
Reviewed-by: John Johansen <john.johansen@canonical.com>
+Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
+Acked-by: Paul Moore <paul@paul-moore.com>
Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
-Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
-cc: linux-integrity@vger.kernel.org
+Cc: linux-audit@redhat.com
---
- include/linux/security.h | 7 ++++---
- kernel/auditsc.c | 6 +++++-
- security/integrity/ima/ima_policy.c | 4 +---
- security/security.c | 11 +++++++++--
- 4 files changed, 19 insertions(+), 9 deletions(-)
+ include/linux/security.h | 7 ++++---
+ kernel/auditsc.c | 7 ++++++-
+ security/security.c | 12 +++++++++---
+ 3 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/include/linux/security.h b/include/linux/security.h
-index 9ad1d01fbbe4..a3426c002644 100644
+index 669eff47737a..a0b9bf48a60d 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
-@@ -409,7 +409,7 @@ int security_inode_killpriv(struct dentry *dentry);
- int security_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc);
- int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags);
- int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size);
--void security_inode_getsecid(struct inode *inode, u32 *secid);
-+void security_inode_getsecid(struct inode *inode, struct lsmblob *blob);
- int security_inode_copy_up(struct dentry *src, struct cred **new);
- int security_inode_copy_up_xattr(const char *name);
- int security_kernfs_init_security(struct kernfs_node *kn_dir,
-@@ -924,9 +924,10 @@ static inline int security_inode_listsecurity(struct inode *inode, char *buffer,
+@@ -521,7 +521,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);
+@@ -1284,9 +1284,10 @@ static inline int security_ipc_permission(struct kern_ipc_perm *ipcp,
return 0;
}
--static inline void security_inode_getsecid(struct inode *inode, u32 *secid)
-+static inline void security_inode_getsecid(struct inode *inode,
-+ struct lsmblob *blob)
+-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_inode_copy_up(struct dentry *src, struct cred **new)
+ static inline int security_msg_msg_alloc(struct msg_msg *msg)
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
-index 3e5ccb7a46d1..b55e66c2451d 100644
+index b28e2cbcc92c..c469368818fd 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
-@@ -1931,13 +1931,17 @@ static void audit_copy_inode(struct audit_names *name,
- const struct dentry *dentry,
- struct inode *inode, unsigned int flags)
+@@ -2601,12 +2601,17 @@ 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;
-+
- name->ino = inode->i_ino;
- name->dev = inode->i_sb->s_dev;
- name->mode = inode->i_mode;
- name->uid = inode->i_uid;
- name->gid = inode->i_gid;
- name->rdev = inode->i_rdev;
-- security_inode_getsecid(inode, &name->osid);
-+ security_inode_getsecid(inode, &blob);
-+ /* scaffolding until osid is updated */
-+ name->osid = blob.secid[0];
- if (flags & AUDIT_INODE_NOEVAL) {
- name->fcap_ver = -1;
- return;
-diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
-index 27257af4a8cd..6771c8c83105 100644
---- a/security/integrity/ima/ima_policy.c
-+++ b/security/integrity/ima/ima_policy.c
-@@ -425,7 +425,6 @@ static bool ima_match_rules(struct ima_rule_entry *rule, struct inode *inode,
- return false;
- for (i = 0; i < MAX_LSM_RULES; i++) {
- int rc = 0;
-- u32 osid;
- struct lsmblob blob;
- if (!ima_lsm_isset(rule->lsm[i].rules))
-@@ -435,8 +434,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, struct inode *inode,
- case LSM_OBJ_USER:
- case LSM_OBJ_ROLE:
- case LSM_OBJ_TYPE:
-- security_inode_getsecid(inode, &osid);
-- lsmblob_init(&blob, osid);
-+ security_inode_getsecid(inode, &blob);
- rc = security_filter_rule_match(&blob,
- rule->lsm[i].type,
- Audit_equal,
+ 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);
++ /* context->ipc.osid will be changed to a lsmblob later in
++ * the patch series. This will allow auditing of all the object
++ * labels associated with the ipc object. */
++ context->ipc.osid = lsmblob_value(&blob);
+ context->type = AUDIT_IPC;
+ }
+
diff --git a/security/security.c b/security/security.c
-index 78185ddf232d..a4a1a7cccd4d 100644
+index a0612afefc24..f8b5e2fa37a0 100644
--- a/security/security.c
+++ b/security/security.c
-@@ -1386,9 +1386,16 @@ int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer
+@@ -1996,10 +1996,16 @@ int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
+ return call_int_hook(ipc_permission, 0, ipcp, flag);
}
- EXPORT_SYMBOL(security_inode_listsecurity);
--void security_inode_getsecid(struct inode *inode, u32 *secid)
-+void security_inode_getsecid(struct inode *inode, struct lsmblob *blob)
+-void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
++void security_ipc_getsecid(struct kern_ipc_perm *ipcp, struct lsmblob *blob)
{
-- call_void_hook(inode_getsecid, inode, secid);
+- *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.inode_getsecid, list) {
++ 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.inode_getsecid(inode, &blob->secid[hp->lsmid->slot]);
++ hp->hook.ipc_getsecid(ipcp, &blob->secid[hp->lsmid->slot]);
+ }
}
- int security_inode_copy_up(struct dentry *src, struct cred **new)
+ int security_msg_msg_alloc(struct msg_msg *msg)
--
-2.24.1
+2.31.1