|
@@ -57,6 +57,7 @@
|
|
|
#include "netlabel.h"
|
|
#include "netlabel.h"
|
|
|
#include "xfrm.h"
|
|
#include "xfrm.h"
|
|
|
#include "ebitmap.h"
|
|
#include "ebitmap.h"
|
|
|
|
|
+#include "audit.h"
|
|
|
|
|
|
|
|
extern void selnl_notify_policyload(u32 seqno);
|
|
extern void selnl_notify_policyload(u32 seqno);
|
|
|
unsigned int policydb_loaded_version;
|
|
unsigned int policydb_loaded_version;
|
|
@@ -2296,21 +2297,23 @@ struct selinux_audit_rule {
|
|
|
struct context au_ctxt;
|
|
struct context au_ctxt;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-void selinux_audit_rule_free(struct selinux_audit_rule *rule)
|
|
|
|
|
|
|
+void selinux_audit_rule_free(void *vrule)
|
|
|
{
|
|
{
|
|
|
|
|
+ struct selinux_audit_rule *rule = vrule;
|
|
|
|
|
+
|
|
|
if (rule) {
|
|
if (rule) {
|
|
|
context_destroy(&rule->au_ctxt);
|
|
context_destroy(&rule->au_ctxt);
|
|
|
kfree(rule);
|
|
kfree(rule);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int selinux_audit_rule_init(u32 field, u32 op, char *rulestr,
|
|
|
|
|
- struct selinux_audit_rule **rule)
|
|
|
|
|
|
|
+int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, void **vrule)
|
|
|
{
|
|
{
|
|
|
struct selinux_audit_rule *tmprule;
|
|
struct selinux_audit_rule *tmprule;
|
|
|
struct role_datum *roledatum;
|
|
struct role_datum *roledatum;
|
|
|
struct type_datum *typedatum;
|
|
struct type_datum *typedatum;
|
|
|
struct user_datum *userdatum;
|
|
struct user_datum *userdatum;
|
|
|
|
|
+ struct selinux_audit_rule **rule = (struct selinux_audit_rule **)vrule;
|
|
|
int rc = 0;
|
|
int rc = 0;
|
|
|
|
|
|
|
|
*rule = NULL;
|
|
*rule = NULL;
|
|
@@ -2397,12 +2400,37 @@ int selinux_audit_rule_init(u32 field, u32 op, char *rulestr,
|
|
|
return rc;
|
|
return rc;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int selinux_audit_rule_match(u32 sid, u32 field, u32 op,
|
|
|
|
|
- struct selinux_audit_rule *rule,
|
|
|
|
|
|
|
+/* Check to see if the rule contains any selinux fields */
|
|
|
|
|
+int selinux_audit_rule_known(struct audit_krule *rule)
|
|
|
|
|
+{
|
|
|
|
|
+ int i;
|
|
|
|
|
+
|
|
|
|
|
+ for (i = 0; i < rule->field_count; i++) {
|
|
|
|
|
+ struct audit_field *f = &rule->fields[i];
|
|
|
|
|
+ switch (f->type) {
|
|
|
|
|
+ case AUDIT_SUBJ_USER:
|
|
|
|
|
+ case AUDIT_SUBJ_ROLE:
|
|
|
|
|
+ case AUDIT_SUBJ_TYPE:
|
|
|
|
|
+ case AUDIT_SUBJ_SEN:
|
|
|
|
|
+ case AUDIT_SUBJ_CLR:
|
|
|
|
|
+ case AUDIT_OBJ_USER:
|
|
|
|
|
+ case AUDIT_OBJ_ROLE:
|
|
|
|
|
+ case AUDIT_OBJ_TYPE:
|
|
|
|
|
+ case AUDIT_OBJ_LEV_LOW:
|
|
|
|
|
+ case AUDIT_OBJ_LEV_HIGH:
|
|
|
|
|
+ return 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+int selinux_audit_rule_match(u32 sid, u32 field, u32 op, void *vrule,
|
|
|
struct audit_context *actx)
|
|
struct audit_context *actx)
|
|
|
{
|
|
{
|
|
|
struct context *ctxt;
|
|
struct context *ctxt;
|
|
|
struct mls_level *level;
|
|
struct mls_level *level;
|
|
|
|
|
+ struct selinux_audit_rule *rule = vrule;
|
|
|
int match = 0;
|
|
int match = 0;
|
|
|
|
|
|
|
|
if (!rule) {
|
|
if (!rule) {
|
|
@@ -2509,7 +2537,7 @@ int selinux_audit_rule_match(u32 sid, u32 field, u32 op,
|
|
|
return match;
|
|
return match;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static int (*aurule_callback)(void) = NULL;
|
|
|
|
|
|
|
+static int (*aurule_callback)(void) = audit_update_lsm_rules;
|
|
|
|
|
|
|
|
static int aurule_avc_callback(u32 event, u32 ssid, u32 tsid,
|
|
static int aurule_avc_callback(u32 event, u32 ssid, u32 tsid,
|
|
|
u16 class, u32 perms, u32 *retained)
|
|
u16 class, u32 perms, u32 *retained)
|
|
@@ -2534,11 +2562,6 @@ static int __init aurule_init(void)
|
|
|
}
|
|
}
|
|
|
__initcall(aurule_init);
|
|
__initcall(aurule_init);
|
|
|
|
|
|
|
|
-void selinux_audit_set_callback(int (*callback)(void))
|
|
|
|
|
-{
|
|
|
|
|
- aurule_callback = callback;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
#ifdef CONFIG_NETLABEL
|
|
#ifdef CONFIG_NETLABEL
|
|
|
/**
|
|
/**
|
|
|
* security_netlbl_cache_add - Add an entry to the NetLabel cache
|
|
* security_netlbl_cache_add - Add an entry to the NetLabel cache
|