diff options
Diffstat (limited to 'kernel/auditfilter.c')
| -rw-r--r-- | kernel/auditfilter.c | 58 |
1 files changed, 24 insertions, 34 deletions
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 19c0a0a2ced..e7466dd145c 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c | |||
| @@ -977,6 +977,27 @@ static struct audit_entry *audit_dupe_rule(struct audit_krule *old, | |||
| 977 | return entry; | 977 | return entry; |
| 978 | } | 978 | } |
| 979 | 979 | ||
| 980 | static void audit_watch_log_rule_change(struct audit_krule *r, struct audit_watch *w, char *op) | ||
| 981 | { | ||
| 982 | if (audit_enabled) { | ||
| 983 | struct audit_buffer *ab; | ||
| 984 | ab = audit_log_start(NULL, GFP_NOFS, AUDIT_CONFIG_CHANGE); | ||
| 985 | audit_log_format(ab, "auid=%u ses=%u op=", | ||
| 986 | audit_get_loginuid(current), | ||
| 987 | audit_get_sessionid(current)); | ||
| 988 | audit_log_string(ab, op); | ||
| 989 | audit_log_format(ab, " path="); | ||
| 990 | audit_log_untrustedstring(ab, w->path); | ||
| 991 | if (r->filterkey) { | ||
| 992 | audit_log_format(ab, " key="); | ||
| 993 | audit_log_untrustedstring(ab, r->filterkey); | ||
| 994 | } else | ||
| 995 | audit_log_format(ab, " key=(null)"); | ||
| 996 | audit_log_format(ab, " list=%d res=1", r->listnr); | ||
| 997 | audit_log_end(ab); | ||
| 998 | } | ||
| 999 | } | ||
| 1000 | |||
| 980 | /* Update inode info in audit rules based on filesystem event. */ | 1001 | /* Update inode info in audit rules based on filesystem event. */ |
| 981 | static void audit_update_watch(struct audit_parent *parent, | 1002 | static void audit_update_watch(struct audit_parent *parent, |
| 982 | const char *dname, dev_t dev, | 1003 | const char *dname, dev_t dev, |
| @@ -1023,24 +1044,11 @@ static void audit_update_watch(struct audit_parent *parent, | |||
| 1023 | &nentry->rule.list); | 1044 | &nentry->rule.list); |
| 1024 | } | 1045 | } |
| 1025 | 1046 | ||
| 1047 | audit_watch_log_rule_change(r, owatch, "updated rules"); | ||
| 1048 | |||
| 1026 | call_rcu(&oentry->rcu, audit_free_rule_rcu); | 1049 | call_rcu(&oentry->rcu, audit_free_rule_rcu); |
| 1027 | } | 1050 | } |
| 1028 | 1051 | ||
| 1029 | if (audit_enabled) { | ||
| 1030 | struct audit_buffer *ab; | ||
| 1031 | ab = audit_log_start(NULL, GFP_NOFS, | ||
| 1032 | AUDIT_CONFIG_CHANGE); | ||
| 1033 | audit_log_format(ab, "auid=%u ses=%u", | ||
| 1034 | audit_get_loginuid(current), | ||
| 1035 | audit_get_sessionid(current)); | ||
| 1036 | audit_log_format(ab, | ||
| 1037 | " op=updated rules specifying path="); | ||
| 1038 | audit_log_untrustedstring(ab, owatch->path); | ||
| 1039 | audit_log_format(ab, " with dev=%u ino=%lu\n", | ||
| 1040 | dev, ino); | ||
| 1041 | audit_log_format(ab, " list=%d res=1", r->listnr); | ||
| 1042 | audit_log_end(ab); | ||
| 1043 | } | ||
| 1044 | audit_remove_watch(owatch); | 1052 | audit_remove_watch(owatch); |
| 1045 | goto add_watch_to_parent; /* event applies to a single watch */ | 1053 | goto add_watch_to_parent; /* event applies to a single watch */ |
| 1046 | } | 1054 | } |
| @@ -1065,25 +1073,7 @@ static void audit_remove_parent_watches(struct audit_parent *parent) | |||
| 1065 | list_for_each_entry_safe(w, nextw, &parent->watches, wlist) { | 1073 | list_for_each_entry_safe(w, nextw, &parent->watches, wlist) { |
| 1066 | list_for_each_entry_safe(r, nextr, &w->rules, rlist) { | 1074 | list_for_each_entry_safe(r, nextr, &w->rules, rlist) { |
| 1067 | e = container_of(r, struct audit_entry, rule); | 1075 | e = container_of(r, struct audit_entry, rule); |
| 1068 | if (audit_enabled) { | 1076 | audit_watch_log_rule_change(r, w, "remove rule"); |
| 1069 | struct audit_buffer *ab; | ||
| 1070 | ab = audit_log_start(NULL, GFP_NOFS, | ||
| 1071 | AUDIT_CONFIG_CHANGE); | ||
| 1072 | audit_log_format(ab, "auid=%u ses=%u", | ||
| 1073 | audit_get_loginuid(current), | ||
| 1074 | audit_get_sessionid(current)); | ||
| 1075 | audit_log_format(ab, " op=remove rule path="); | ||
| 1076 | audit_log_untrustedstring(ab, w->path); | ||
| 1077 | if (r->filterkey) { | ||
| 1078 | audit_log_format(ab, " key="); | ||
| 1079 | audit_log_untrustedstring(ab, | ||
| 1080 | r->filterkey); | ||
| 1081 | } else | ||
| 1082 | audit_log_format(ab, " key=(null)"); | ||
| 1083 | audit_log_format(ab, " list=%d res=1", | ||
| 1084 | r->listnr); | ||
| 1085 | audit_log_end(ab); | ||
| 1086 | } | ||
| 1087 | list_del(&r->rlist); | 1077 | list_del(&r->rlist); |
| 1088 | list_del(&r->list); | 1078 | list_del(&r->list); |
| 1089 | list_del_rcu(&e->list); | 1079 | list_del_rcu(&e->list); |
