[PATCH v30 06/28] LSM: Use lsmblob in security_audit_rule_match

Casey Schaufler
2021-11-24T01:50:31Z

Change the secid parameter of security_audit_rule_match
to a lsmblob structure pointer. Pass the entry from the
lsmblob structure for the approprite slot to the LSM hook.

Change the users of security_audit_rule_match to use the
lsmblob instead of a u32. The scaffolding function lsmblob_init()
fills the blob with the value of the old secid, ensuring that
it is available to the appropriate module hook. The sources of
the secid, security_task_getsecid() and security_inode_getsecid(),
will be converted to use the blob structure later in the series.
At the point the use of lsmblob_init() is dropped.

Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
Cc: linux-audit@redhat.com
---
include/linux/security.h | 5 +++--
kernel/auditfilter.c | 6 ++++--
kernel/auditsc.c | 16 +++++++++++-----
security/security.c | 5 +++--
4 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/include/linux/security.h b/include/linux/security.h
index ddd4cf48413c..d846d90f5624 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -1954,7 +1954,7 @@ static inline int security_key_getsecurity(struct key *key, char **_buffer)
int security_audit_rule_init(u32 field, u32 op, char *rulestr,
struct audit_rules *lsmrules);
int security_audit_rule_known(struct audit_krule *krule);
-int security_audit_rule_match(u32 secid, u32 field, u32 op,
+int security_audit_rule_match(struct lsmblob *blob, u32 field, u32 op,
struct audit_rules *lsmrules);
void security_audit_rule_free(struct audit_rules *lsmrules);

@@ -1971,7 +1971,8 @@ static inline int security_audit_rule_known(struct audit_krule *krule)
return 0;
}

-static inline int security_audit_rule_match(u32 secid, u32 field, u32 op,
+static inline int security_audit_rule_match(struct lsmblob *blob secid,
+ u32 field, u32 op,
struct audit_rules *lsmrules)
{
return 0;
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c
index db427e136368..ffbd8396bdc9 100644
--- a/kernel/auditfilter.c
+++ b/kernel/auditfilter.c
@@ -1338,6 +1338,7 @@ int audit_filter(int msgtype, unsigned int listtype)

for (i = 0; i < e->rule.field_count; i++) {
struct audit_field *f = &e->rule.fields[i];
+ struct lsmblob blob;
pid_t pid;
u32 sid;

@@ -1371,8 +1372,9 @@ int audit_filter(int msgtype, unsigned int listtype)
if (f->lsm_isset) {
security_task_getsecid_subj(current,
&sid);
- result = security_audit_rule_match(sid,
- f->type, f->op,
+ lsmblob_init(&blob, sid);
+ result = security_audit_rule_match(
+ &blob, f->type, f->op,
&f->lsm_rules);
}
break;
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index 1aa8ffdae0ad..de22e852373a 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -468,6 +468,7 @@ static int audit_filter_rules(struct task_struct *tsk,
const struct cred *cred;
int i, need_sid = 1;
u32 sid;
+ struct lsmblob blob;
unsigned int sessionid;

if (ctx && rule->prio <= ctx->prio)
@@ -669,8 +670,10 @@ static int audit_filter_rules(struct task_struct *tsk,
security_task_getsecid_subj(tsk, &sid);
need_sid = 0;
}
- result = security_audit_rule_match(sid, f->type,
- f->op, &f->lsm_rules);
+ lsmblob_init(&blob, sid);
+ result = security_audit_rule_match(&blob,
+ f->type, f->op,
+ &f->lsm_rules);
}
break;
case AUDIT_OBJ_USER:
@@ -683,15 +686,17 @@ static int audit_filter_rules(struct task_struct *tsk,
if (f->lsm_isset) {
/* Find files that match */
if (name) {
+ lsmblob_init(&blob, name->osid);
result = security_audit_rule_match(
- name->osid,
+ &blob,
f->type,
f->op,
&f->lsm_rules);
} else if (ctx) {
list_for_each_entry(n, &ctx->names_list, list) {
+ lsmblob_init(&blob, n->osid);
if (security_audit_rule_match(
- n->osid, f->type, f->op,
+ &blob, f->type, f->op,
&f->lsm_rules)) {
++result;
break;
@@ -701,7 +706,8 @@ static int audit_filter_rules(struct task_struct *tsk,
/* Find ipc objects that match */
if (!ctx || ctx->type != AUDIT_IPC)
break;
- if (security_audit_rule_match(ctx->ipc.osid,
+ lsmblob_init(&blob, ctx->ipc.osid);
+ if (security_audit_rule_match(&blob,
f->type, f->op,
&f->lsm_rules))
++result;
diff --git a/security/security.c b/security/security.c
index c472cac72641..238541218ca5 100644
--- a/security/security.c
+++ b/security/security.c
@@ -2680,7 +2680,7 @@ void security_audit_rule_free(struct audit_rules *lsmrules)
}
}

-int security_audit_rule_match(u32 secid, u32 field, u32 op,
+int security_audit_rule_match(struct lsmblob *blob, u32 field, u32 op,
struct audit_rules *lsmrules)
{
struct security_hook_list *hp;
@@ -2691,7 +2691,8 @@ int security_audit_rule_match(u32 secid, u32 field, u32 op,
continue;
if (lsmrules->rule[hp->lsmid->slot] == NULL)
continue;
- rc = hp->hook.audit_rule_match(secid, field, op,
+ rc = hp->hook.audit_rule_match(blob->secid[hp->lsmid->slot],
+ field, op,
&lsmrules->rule[hp->lsmid->slot]);
if (rc)
return rc;