aboutsummaryrefslogtreecommitdiffstats
path: root/security/selinux/hooks.c
diff options
context:
space:
mode:
authorCasey Schaufler <casey@schaufler-ca.com>2018-11-12 12:30:56 -0500
committerKees Cook <keescook@chromium.org>2019-01-08 16:18:44 -0500
commitbbd3662a834813730912a58efb44dd6df6d952e6 (patch)
treef4c0252814e717185845bde03fe88d341d5967b5 /security/selinux/hooks.c
parent43fc460907dc56a3450654efc6ba1dfbcd4594eb (diff)
Infrastructure management of the cred security blob
Move management of the cred security blob out of the security modules and into the security infrastructre. Instead of allocating and freeing space the security modules tell the infrastructure how much space they require. Signed-off-by: Casey Schaufler <casey@schaufler-ca.com> Reviewed-by: Kees Cook <keescook@chromium.org> [kees: adjusted for ordered init series] Signed-off-by: Kees Cook <keescook@chromium.org>
Diffstat (limited to 'security/selinux/hooks.c')
-rw-r--r--security/selinux/hooks.c51
1 files changed, 10 insertions, 41 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 169cf5b3334b..239b13b442e7 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -210,12 +210,9 @@ static void cred_init_security(void)
210 struct cred *cred = (struct cred *) current->real_cred; 210 struct cred *cred = (struct cred *) current->real_cred;
211 struct task_security_struct *tsec; 211 struct task_security_struct *tsec;
212 212
213 tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL); 213 lsm_early_cred(cred);
214 if (!tsec) 214 tsec = selinux_cred(cred);
215 panic("SELinux: Failed to initialize initial task.\n");
216
217 tsec->osid = tsec->sid = SECINITSID_KERNEL; 215 tsec->osid = tsec->sid = SECINITSID_KERNEL;
218 cred->security = tsec;
219} 216}
220 217
221/* 218/*
@@ -3686,46 +3683,15 @@ static int selinux_task_alloc(struct task_struct *task,
3686} 3683}
3687 3684
3688/* 3685/*
3689 * allocate the SELinux part of blank credentials
3690 */
3691static int selinux_cred_alloc_blank(struct cred *cred, gfp_t gfp)
3692{
3693 struct task_security_struct *tsec;
3694
3695 tsec = kzalloc(sizeof(struct task_security_struct), gfp);
3696 if (!tsec)
3697 return -ENOMEM;
3698
3699 cred->security = tsec;
3700 return 0;
3701}
3702
3703/*
3704 * detach and free the LSM part of a set of credentials
3705 */
3706static void selinux_cred_free(struct cred *cred)
3707{
3708 struct task_security_struct *tsec = selinux_cred(cred);
3709
3710 kfree(tsec);
3711}
3712
3713/*
3714 * prepare a new set of credentials for modification 3686 * prepare a new set of credentials for modification
3715 */ 3687 */
3716static int selinux_cred_prepare(struct cred *new, const struct cred *old, 3688static int selinux_cred_prepare(struct cred *new, const struct cred *old,
3717 gfp_t gfp) 3689 gfp_t gfp)
3718{ 3690{
3719 const struct task_security_struct *old_tsec; 3691 const struct task_security_struct *old_tsec = selinux_cred(old);
3720 struct task_security_struct *tsec; 3692 struct task_security_struct *tsec = selinux_cred(new);
3721
3722 old_tsec = selinux_cred(old);
3723
3724 tsec = kmemdup(old_tsec, sizeof(struct task_security_struct), gfp);
3725 if (!tsec)
3726 return -ENOMEM;
3727 3693
3728 new->security = tsec; 3694 *tsec = *old_tsec;
3729 return 0; 3695 return 0;
3730} 3696}
3731 3697
@@ -6678,6 +6644,10 @@ static void selinux_bpf_prog_free(struct bpf_prog_aux *aux)
6678} 6644}
6679#endif 6645#endif
6680 6646
6647struct lsm_blob_sizes selinux_blob_sizes __lsm_ro_after_init = {
6648 .lbs_cred = sizeof(struct task_security_struct),
6649};
6650
6681static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = { 6651static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
6682 LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr), 6652 LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr),
6683 LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction), 6653 LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction),
@@ -6761,8 +6731,6 @@ static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
6761 LSM_HOOK_INIT(file_open, selinux_file_open), 6731 LSM_HOOK_INIT(file_open, selinux_file_open),
6762 6732
6763 LSM_HOOK_INIT(task_alloc, selinux_task_alloc), 6733 LSM_HOOK_INIT(task_alloc, selinux_task_alloc),
6764 LSM_HOOK_INIT(cred_alloc_blank, selinux_cred_alloc_blank),
6765 LSM_HOOK_INIT(cred_free, selinux_cred_free),
6766 LSM_HOOK_INIT(cred_prepare, selinux_cred_prepare), 6734 LSM_HOOK_INIT(cred_prepare, selinux_cred_prepare),
6767 LSM_HOOK_INIT(cred_transfer, selinux_cred_transfer), 6735 LSM_HOOK_INIT(cred_transfer, selinux_cred_transfer),
6768 LSM_HOOK_INIT(cred_getsecid, selinux_cred_getsecid), 6736 LSM_HOOK_INIT(cred_getsecid, selinux_cred_getsecid),
@@ -6981,6 +6949,7 @@ DEFINE_LSM(selinux) = {
6981 .name = "selinux", 6949 .name = "selinux",
6982 .flags = LSM_FLAG_LEGACY_MAJOR | LSM_FLAG_EXCLUSIVE, 6950 .flags = LSM_FLAG_LEGACY_MAJOR | LSM_FLAG_EXCLUSIVE,
6983 .enabled = &selinux_enabled, 6951 .enabled = &selinux_enabled,
6952 .blobs = &selinux_blob_sizes,
6984 .init = selinux_init, 6953 .init = selinux_init,
6985}; 6954};
6986 6955