UBUNTU: SAUCE: apparmor4.0.0 [13/90]: LSM stacking v39: LSM: Create new security_cred_getlsmblob LSM hook
BugLink: http://bugs.launchpad.net/bugs/2028253 Create a new LSM hook security_cred_getlsmblob() which, like security_cred_getsecid(), fetches LSM specific attributes from the cred structure. The associated data elements in the audit sub-system are changed from a secid to a lsmblob to accommodate multiple possible LSM audit users. 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> Cc: linux-integrity@vger.kernel.org Cc: audit@vger.kernel.org Cc: Todd Kjos <tkjos@google.com> (cherry picked from commit 337cca8d8de8e42b04bd3fa1290eb8a59ecbecf8 https://git.launchpad.net/~apparmor-dev/ubuntu-kernel-next) Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
This commit is contained in:
committed by
Paolo Pisati
parent
0f13719fe3
commit
99f073f4a9
@@ -198,6 +198,8 @@ LSM_HOOK(int, 0, cred_prepare, struct cred *new, const struct cred *old,
|
||||
LSM_HOOK(void, LSM_RET_VOID, cred_transfer, struct cred *new,
|
||||
const struct cred *old)
|
||||
LSM_HOOK(void, LSM_RET_VOID, cred_getsecid, const struct cred *c, u32 *secid)
|
||||
LSM_HOOK(void, LSM_RET_VOID, cred_getlsmblob, const struct cred *c,
|
||||
struct lsmblob *blob)
|
||||
LSM_HOOK(int, 0, kernel_act_as, struct cred *new, u32 secid)
|
||||
LSM_HOOK(int, 0, kernel_create_files_as, struct cred *new, struct inode *inode)
|
||||
LSM_HOOK(int, 0, kernel_module_request, char *kmod_name)
|
||||
|
||||
@@ -462,6 +462,7 @@ void security_cred_free(struct cred *cred);
|
||||
int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp);
|
||||
void security_transfer_creds(struct cred *new, const struct cred *old);
|
||||
void security_cred_getsecid(const struct cred *c, u32 *secid);
|
||||
void security_cred_getlsmblob(const struct cred *c, struct lsmblob *blob);
|
||||
int security_kernel_act_as(struct cred *new, u32 secid);
|
||||
int security_kernel_create_files_as(struct cred *new, struct inode *inode);
|
||||
int security_kernel_module_request(char *kmod_name);
|
||||
@@ -1161,6 +1162,12 @@ static inline void security_cred_getsecid(const struct cred *c, u32 *secid)
|
||||
*secid = 0;
|
||||
}
|
||||
|
||||
static inline void security_cred_getlsmblob(const struct cred *c,
|
||||
struct lsmblob *blob)
|
||||
{
|
||||
*secid = 0;
|
||||
}
|
||||
|
||||
static inline int security_kernel_act_as(struct cred *cred, u32 secid)
|
||||
{
|
||||
return 0;
|
||||
|
||||
@@ -526,8 +526,7 @@ int ima_file_mprotect(struct vm_area_struct *vma, unsigned long prot)
|
||||
int ima_bprm_check(struct linux_binprm *bprm)
|
||||
{
|
||||
int ret;
|
||||
u32 secid;
|
||||
struct lsmblob blob = { };
|
||||
struct lsmblob blob;
|
||||
|
||||
security_current_getlsmblob_subj(&blob);
|
||||
ret = process_measurement(bprm->file, current_cred(),
|
||||
@@ -535,9 +534,7 @@ int ima_bprm_check(struct linux_binprm *bprm)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
security_cred_getsecid(bprm->cred, &secid);
|
||||
/* stacking scaffolding */
|
||||
blob.scaffold.secid = secid;
|
||||
security_cred_getlsmblob(bprm->cred, &blob);
|
||||
return process_measurement(bprm->file, bprm->cred, &blob, NULL, 0,
|
||||
MAY_EXEC, CREDS_CHECK);
|
||||
}
|
||||
|
||||
@@ -3128,6 +3128,21 @@ void security_cred_getsecid(const struct cred *c, u32 *secid)
|
||||
}
|
||||
EXPORT_SYMBOL(security_cred_getsecid);
|
||||
|
||||
/**
|
||||
* security_cred_getlsmblob() - Get the LSM data from a set of credentials
|
||||
* @c: credentials
|
||||
* @blob: destination for the LSM data
|
||||
*
|
||||
* Retrieve the security data of the cred structure @c. In case of
|
||||
* failure, @blob will be cleared.
|
||||
*/
|
||||
void security_cred_getlsmblob(const struct cred *c, struct lsmblob *blob)
|
||||
{
|
||||
lsmblob_init(blob);
|
||||
call_void_hook(cred_getlsmblob, c, blob);
|
||||
}
|
||||
EXPORT_SYMBOL(security_cred_getlsmblob);
|
||||
|
||||
/**
|
||||
* security_kernel_act_as() - Set the kernel credentials to act as secid
|
||||
* @new: credentials
|
||||
|
||||
@@ -4027,6 +4027,13 @@ static void selinux_cred_getsecid(const struct cred *c, u32 *secid)
|
||||
*secid = cred_sid(c);
|
||||
}
|
||||
|
||||
static void selinux_cred_getlsmblob(const struct cred *c, struct lsmblob *blob)
|
||||
{
|
||||
blob->selinux.secid = cred_sid(c);
|
||||
/* stacking scaffolding */
|
||||
blob->scaffold.secid = blob->selinux.secid;
|
||||
}
|
||||
|
||||
/*
|
||||
* set the security data for a kernel service
|
||||
* - all the creation contexts are set to unlabelled
|
||||
@@ -7210,6 +7217,7 @@ static struct security_hook_list selinux_hooks[] __ro_after_init = {
|
||||
LSM_HOOK_INIT(cred_prepare, selinux_cred_prepare),
|
||||
LSM_HOOK_INIT(cred_transfer, selinux_cred_transfer),
|
||||
LSM_HOOK_INIT(cred_getsecid, selinux_cred_getsecid),
|
||||
LSM_HOOK_INIT(cred_getlsmblob, selinux_cred_getlsmblob),
|
||||
LSM_HOOK_INIT(kernel_act_as, selinux_kernel_act_as),
|
||||
LSM_HOOK_INIT(kernel_create_files_as, selinux_kernel_create_files_as),
|
||||
LSM_HOOK_INIT(kernel_module_request, selinux_kernel_module_request),
|
||||
|
||||
@@ -2122,6 +2122,23 @@ static void smack_cred_getsecid(const struct cred *cred, u32 *secid)
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* smack_cred_getlsmblob - get the Smack label for a creds structure
|
||||
* @cred: the object creds
|
||||
* @blob: where to put the data
|
||||
*
|
||||
* Sets the Smack part of the blob
|
||||
*/
|
||||
static void smack_cred_getlsmblob(const struct cred *cred,
|
||||
struct lsmblob *blob)
|
||||
{
|
||||
rcu_read_lock();
|
||||
blob->smack.skp = smk_of_task(smack_cred(cred));
|
||||
/* stacking scaffolding */
|
||||
blob->scaffold.secid = blob->smack.skp->smk_secid;
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* smack_kernel_act_as - Set the subjective context in a set of credentials
|
||||
* @new: points to the set of credentials to be modified.
|
||||
@@ -5104,6 +5121,7 @@ static struct security_hook_list smack_hooks[] __ro_after_init = {
|
||||
LSM_HOOK_INIT(cred_prepare, smack_cred_prepare),
|
||||
LSM_HOOK_INIT(cred_transfer, smack_cred_transfer),
|
||||
LSM_HOOK_INIT(cred_getsecid, smack_cred_getsecid),
|
||||
LSM_HOOK_INIT(cred_getlsmblob, smack_cred_getlsmblob),
|
||||
LSM_HOOK_INIT(kernel_act_as, smack_kernel_act_as),
|
||||
LSM_HOOK_INIT(kernel_create_files_as, smack_kernel_create_files_as),
|
||||
LSM_HOOK_INIT(task_setpgid, smack_task_setpgid),
|
||||
|
||||
Reference in New Issue
Block a user