[PATCH 09/97] LSM: Use lsm_export in the ipc_getsecid and task_getsecid hooks
Casey Schaufler
casey at schaufler-ca.com
Thu Feb 28 22:18:05 UTC 2019
Convert the cred_getsecid and task_getsecid hooks to use the
lsm_export structure instead of a u32 secid. There is some
scaffolding involved that will be removed when
security_ipc_getsecid() and security_task_getsecid() are
updated.
Signed-off-by: Casey Schaufler <casey at schaufler-ca.com>
---
include/linux/lsm_hooks.h | 8 ++++----
security/apparmor/lsm.c | 12 ++++++++++--
security/security.c | 12 ++++++++----
security/selinux/hooks.c | 10 ++++++----
security/smack/smack_lsm.c | 8 ++++----
5 files changed, 32 insertions(+), 18 deletions(-)
diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
index 2e8516447bfd..f798a947bf8d 100644
--- a/include/linux/lsm_hooks.h
+++ b/include/linux/lsm_hooks.h
@@ -622,7 +622,7 @@
* Return 0 if permission is granted.
* @task_getsecid:
* Retrieve the security identifier of the process @p.
- * @p contains the task_struct for the process and place is into @secid.
+ * @p contains the task_struct for the process and place is into @l.
* In case of failure, @secid will be set to zero.
*
* @task_setnice:
@@ -1080,7 +1080,7 @@
* @ipc_getsecid:
* Get the secid associated with the ipc object.
* @ipcp contains the kernel IPC permission structure.
- * @secid contains a pointer to the location where result will be saved.
+ * @l contains a pointer to the location where result will be saved.
* In case of failure, @secid will be set to zero.
*
* Security hooks for individual messages held in System V IPC message queues
@@ -1600,7 +1600,7 @@ union security_list_options {
int (*task_setpgid)(struct task_struct *p, pid_t pgid);
int (*task_getpgid)(struct task_struct *p);
int (*task_getsid)(struct task_struct *p);
- void (*task_getsecid)(struct task_struct *p, u32 *secid);
+ void (*task_getsecid)(struct task_struct *p, struct lsm_export *l);
int (*task_setnice)(struct task_struct *p, int nice);
int (*task_setioprio)(struct task_struct *p, int ioprio);
int (*task_getioprio)(struct task_struct *p);
@@ -1618,7 +1618,7 @@ union security_list_options {
void (*task_to_inode)(struct task_struct *p, struct inode *inode);
int (*ipc_permission)(struct kern_ipc_perm *ipcp, short flag);
- void (*ipc_getsecid)(struct kern_ipc_perm *ipcp, u32 *secid);
+ void (*ipc_getsecid)(struct kern_ipc_perm *ipcp, struct lsm_export *l);
int (*msg_msg_alloc_security)(struct msg_msg *msg);
void (*msg_msg_free_security)(struct msg_msg *msg);
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index b77571ddbed3..377fa4ed1518 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -49,6 +49,14 @@ int apparmor_initialized;
DEFINE_PER_CPU(struct aa_buffers, aa_buffers);
+/*
+ * Set the AppArmor secid in an lsm_export structure
+ */
+static inline void apparmor_export_secid(struct lsm_export *l, u32 secid)
+{
+ l->apparmor = secid;
+ l->flags |= LSM_EXPORT_APPARMOR;
+}
/*
* LSM hook functions
@@ -710,10 +718,10 @@ static void apparmor_bprm_committed_creds(struct linux_binprm *bprm)
return;
}
-static void apparmor_task_getsecid(struct task_struct *p, u32 *secid)
+static void apparmor_task_getsecid(struct task_struct *p, struct lsm_export *l)
{
struct aa_label *label = aa_get_task_label(p);
- *secid = label->secid;
+ apparmor_export_secid(l, label->secid);
aa_put_label(label);
}
diff --git a/security/security.c b/security/security.c
index 9c10d9aae83f..f6ee25ebfa3c 100644
--- a/security/security.c
+++ b/security/security.c
@@ -1708,8 +1708,10 @@ int security_task_getsid(struct task_struct *p)
void security_task_getsecid(struct task_struct *p, u32 *secid)
{
- *secid = 0;
- call_void_hook(task_getsecid, p, secid);
+ struct lsm_export data = { .flags = LSM_EXPORT_NONE };
+
+ call_void_hook(task_getsecid, p, &data);
+ lsm_export_secid(&data, secid);
}
EXPORT_SYMBOL(security_task_getsecid);
@@ -1791,8 +1793,10 @@ int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
{
- *secid = 0;
- call_void_hook(ipc_getsecid, ipcp, secid);
+ struct lsm_export data = { .flags = LSM_EXPORT_NONE };
+
+ call_void_hook(ipc_getsecid, ipcp, &data);
+ lsm_export_secid(&data, secid);
}
int security_msg_msg_alloc(struct msg_msg *msg)
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index d9179b75acb7..104b2315d36d 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -3807,9 +3807,9 @@ static int selinux_task_getsid(struct task_struct *p)
PROCESS__GETSESSION, NULL);
}
-static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
+static void selinux_task_getsecid(struct task_struct *p, struct lsm_export *l)
{
- *secid = task_sid(p);
+ selinux_export_secid(l, task_sid(p));
}
static int selinux_task_setnice(struct task_struct *p, int nice)
@@ -5987,10 +5987,12 @@ static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
return ipc_has_perm(ipcp, av);
}
-static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
+static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp,
+ struct lsm_export *l)
{
struct ipc_security_struct *isec = selinux_ipc(ipcp);
- *secid = isec->sid;
+
+ selinux_export_secid(l, isec->sid);
}
static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index e3639d6f1b62..d5ff34a5803b 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -2000,11 +2000,11 @@ static int smack_task_getsid(struct task_struct *p)
*
* Sets the secid to contain a u32 version of the smack label.
*/
-static void smack_task_getsecid(struct task_struct *p, u32 *secid)
+static void smack_task_getsecid(struct task_struct *p, struct lsm_export *l)
{
struct smack_known *skp = smk_of_task_struct(p);
- *secid = skp->smk_secid;
+ smack_export_secid(l, skp->smk_secid);
}
/**
@@ -3144,12 +3144,12 @@ static int smack_ipc_permission(struct kern_ipc_perm *ipp, short flag)
* @ipp: the object permissions
* @secid: where result will be saved
*/
-static void smack_ipc_getsecid(struct kern_ipc_perm *ipp, u32 *secid)
+static void smack_ipc_getsecid(struct kern_ipc_perm *ipp, struct lsm_export *l)
{
struct smack_known **blob = smack_ipc(ipp);
struct smack_known *iskp = *blob;
- *secid = iskp->smk_secid;
+ smack_export_secid(l, iskp->smk_secid);
}
/**
--
2.17.0
More information about the Linux-security-module-archive
mailing list