On Friday, May 10, 2019 12:21:57 PM EDT Richard Guy Briggs wrote: > Records that are triggered by an AUDIT_SIGNAL_INFO message including > AUDIT_DAEMON_CONFIG (HUP), AUDIT_DAEMON_ROTATE (USR1), > AUDIT_DAEMON_RESUME (USR2) and AUDIT_DAEMON_END (TERM) have inconsistent > reporting of signal info and swinging field "state". > > They also assume that an empty security context implies there is no > other useful information in the AUDIT_SIGNAL_INFO message so don't use > the information that is there. > > Normalize AUDIT_DAEMON_CONFIG to use the value "reconfigure" and add the > "state" field where missing. > > Use audit_sig_info values when available, not making assumptions about > their availability when the security context is absent. > > See: https://github.com/linux-audit/audit-userspace/issues/90
This was applied with some fixes. I don't know why ':' was introduced in one event. But we've been trying to get rid of non-meaningful text. Also, there were 2 places where a success result was switched to a fail. These were fixed back. -Steve > Signed-off-by: Richard Guy Briggs <[email protected]> > --- > Changelog: > v2: > - omit subj= if selinux unavailable > - add missing colon to daemon_config > > docs/audit_request_signal_info.3 | 2 +- > lib/libaudit.c | 12 +++++++++ > lib/libaudit.h | 1 + > src/auditd-event.c | 2 +- > src/auditd-reconfig.c | 9 +++---- > src/auditd.c | 56 > ++++++++++++++-------------------------- 6 files changed, 38 > insertions(+), 44 deletions(-) > > diff --git a/docs/audit_request_signal_info.3 > b/docs/audit_request_signal_info.3 index 873deb58bef3..b68d7bbefeed 100644 > --- a/docs/audit_request_signal_info.3 > +++ b/docs/audit_request_signal_info.3 > @@ -8,7 +8,7 @@ int audit_request_signal_info(int fd); > > .SH "DESCRIPTION" > > -audit_request_signal_info requests that the kernel send information about > the sender of a signal to the audit daemon. The sinal info structure is as > follows: +audit_request_signal_info requests that the kernel send > information about the sender of a signal to the audit daemon. The signal > info structure is as follows: > > .nf > struct audit_sig_info { > diff --git a/lib/libaudit.c b/lib/libaudit.c > index 2af017a0e520..e695791f9243 100644 > --- a/lib/libaudit.c > +++ b/lib/libaudit.c > @@ -674,6 +674,18 @@ int audit_request_signal_info(int fd) > return rc; > } > > +char *audit_format_signal_info(char *buf, int len, char *op, struct > audit_reply *rep, char *res) +{ > + if (rep->len == 24) > + snprintf(buf, len, "op=%s auid=%u pid=%d res=%s", op, > + rep->signal_info->uid, rep->signal_info->pid, res); > + else > + snprintf(buf, len, "op=%s auid=%u pid=%d subj=%s res=%s", > + op, rep->signal_info->uid, rep->signal_info->pid, > + rep->signal_info->ctx, res); > + return buf; > +} > + > int audit_update_watch_perms(struct audit_rule_data *rule, int perms) > { > unsigned int i, done=0; > diff --git a/lib/libaudit.h b/lib/libaudit.h > index 77e4142beea2..36ea8bc04e8a 100644 > --- a/lib/libaudit.h > +++ b/lib/libaudit.h > @@ -573,6 +573,7 @@ extern int audit_setloginuid(uid_t uid); > extern uint32_t audit_get_session(void); > extern int audit_detect_machine(void); > extern int audit_determine_machine(const char *arch); > +extern char *audit_format_signal_info(char *buf, int len, char *op, struct > audit_reply *rep, char *res); > > /* Translation functions */ > extern int audit_name_to_field(const char *field); > diff --git a/src/auditd-event.c b/src/auditd-event.c > index ef2828d8df94..2970aba44456 100644 > --- a/src/auditd-event.c > +++ b/src/auditd-event.c > @@ -1572,7 +1572,7 @@ static void reconfigure(struct auditd_event *e) > > e->reply.type = AUDIT_DAEMON_CONFIG; > e->reply.len = snprintf(e->reply.msg.data, MAX_AUDIT_MESSAGE_LENGTH-2, > - "%s op=reconfigure state=changed auid=%u pid=%d subj=%s res=success", > + "%s : op=reconfigure state=changed auid=%u pid=%d subj=%s res=success", > date, uid, pid, ctx ); > e->reply.message = e->reply.msg.data; > free((char *)ctx); > diff --git a/src/auditd-reconfig.c b/src/auditd-reconfig.c > index a03e29aa57ab..f5b00e6d1dc7 100644 > --- a/src/auditd-reconfig.c > +++ b/src/auditd-reconfig.c > @@ -115,12 +115,9 @@ static void *config_thread_main(void *arg) > } else { > // need to send a failed event message > char txt[MAX_AUDIT_MESSAGE_LENGTH]; > - snprintf(txt, sizeof(txt), > - "op=reconfigure state=no-change auid=%u pid=%d subj=%s res=failed", > - e->reply.signal_info->uid, > - e->reply.signal_info->pid, > - (e->reply.len > 24) ? > - e->reply.signal_info->ctx : "?"); > + audit_format_signal_info(txt, sizeof(txt), > + "reconfigure state=no-change", > + &e->reply, "failed"); > // FIXME: need to figure out sending this > //send_audit_event(AUDIT_DAEMON_CONFIG, txt); > free_config(&new_config); > diff --git a/src/auditd.c b/src/auditd.c > index c04a1c9ce93f..63404b25fbc5 100644 > --- a/src/auditd.c > +++ b/src/auditd.c > @@ -131,7 +131,7 @@ static void hup_handler( struct ev_loop *loop, struct > ev_signal *sig, int revent rc = audit_request_signal_info(fd); > if (rc < 0) > send_audit_event(AUDIT_DAEMON_CONFIG, > - "op=hup-info state=request-siginfo auid=-1 pid=-1 subj=? res=failed"); > + "op=reconfigure state=no-change auid=-1 pid=-1 subj=? res=failed"); > else > hup_info_requested = 1; > } > @@ -147,7 +147,7 @@ static void user1_handler(struct ev_loop *loop, struct > ev_signal *sig, rc = audit_request_signal_info(fd); > if (rc < 0) > send_audit_event(AUDIT_DAEMON_ROTATE, > - "op=usr1-info auid=-1 pid=-1 subj=? res=failed"); > + "op=rotate-logs auid=-1 pid=-1 subj=? res=failed"); > else > usr1_info_requested = 1; > } > @@ -163,7 +163,7 @@ static void user2_handler( struct ev_loop *loop, struct > ev_signal *sig, int reve if (rc < 0) { > resume_logging(); > send_audit_event(AUDIT_DAEMON_RESUME, > - "op=resume-logging auid=-1 pid=-1 subj=? res=success"); > + "op=resume-logging auid=-1 pid=-1 subj=? res=failed"); > } else > usr2_info_requested = 1; > } > @@ -515,45 +515,33 @@ static void netlink_handler(struct ev_loop *loop, > struct ev_io *io, break; > case AUDIT_SIGNAL_INFO: > if (hup_info_requested) { > + char hup[MAX_AUDIT_MESSAGE_LENGTH]; > audit_msg(LOG_DEBUG, > "HUP detected, starting config manager"); > reconfig_ev = cur_event; > if (start_config_manager(cur_event)) { > - send_audit_event( > - AUDIT_DAEMON_CONFIG, > - "op=reconfigure state=no-change " > - "auid=-1 pid=-1 subj=? res=failed"); > + audit_format_signal_info(hup, > sizeof(hup), > + "reconfigure state=no-change", > + > &cur_event->reply, > + "failed"); > + send_audit_event(AUDIT_DAEMON_CONFIG, hup); > } > cur_event = NULL; > hup_info_requested = 0; > } else if (usr1_info_requested) { > char usr1[MAX_AUDIT_MESSAGE_LENGTH]; > - if (cur_event->reply.len == 24) { > - snprintf(usr1, sizeof(usr1), > - "op=rotate-logs auid=-1 pid=-1 subj=?"); > - } else { > - snprintf(usr1, sizeof(usr1), > - "op=rotate-logs auid=%u pid=%d subj=%s", > - cur_event->reply.signal_info->uid, > - cur_event->reply.signal_info->pid, > - cur_event->reply.signal_info->ctx); > - } > + audit_format_signal_info(usr1, sizeof(usr1), > + "rotate-logs", > + &cur_event->reply, > + "success"); > send_audit_event(AUDIT_DAEMON_ROTATE, usr1); > usr1_info_requested = 0; > } else if (usr2_info_requested) { > char usr2[MAX_AUDIT_MESSAGE_LENGTH]; > - if (cur_event->reply.len == 24) { > - snprintf(usr2, sizeof(usr2), > - "op=resume-logging auid=-1 " > - "pid=-1 subj=? res=success"); > - } else { > - snprintf(usr2, sizeof(usr2), > - "op=resume-logging " > - "auid=%u pid=%d subj=%s res=success", > - cur_event->reply.signal_info->uid, > - cur_event->reply.signal_info->pid, > - cur_event->reply.signal_info->ctx); > - } > + audit_format_signal_info(usr2, sizeof(usr2), > + "resume-logging", > + &cur_event->reply, > + "success"); > resume_logging(); > libdisp_resume(); > send_audit_event(AUDIT_DAEMON_RESUME, usr2); > @@ -993,18 +981,14 @@ int main(int argc, char *argv[]) > rc = get_reply(fd, &trep, rc); > if (rc > 0) { > char txt[MAX_AUDIT_MESSAGE_LENGTH]; > - snprintf(txt, sizeof(txt), > - "op=terminate auid=%u " > - "pid=%d subj=%s res=success", > - trep.signal_info->uid, > - trep.signal_info->pid, > - trep.signal_info->ctx); > + audit_format_signal_info(txt, sizeof(txt), "terminate", > + &trep, "success"); > send_audit_event(AUDIT_DAEMON_END, txt); > } > } > if (rc <= 0) > send_audit_event(AUDIT_DAEMON_END, > - "op=terminate auid=-1 pid=-1 subj=? res=success"); > + "op=terminate auid=-1 pid=-1 subj=? res=failed"); > free(cur_event); > > // Tear down IO watchers Part 2 -- Linux-audit mailing list [email protected] https://www.redhat.com/mailman/listinfo/linux-audit
