diff -urp audit-3.0.orig/src/auditd.c audit-3.0/src/auditd.c --- audit-3.0.orig/src/auditd.c 2018-12-06 20:01:06.923443360 -0500 +++ audit-3.0/src/auditd.c 2018-12-06 20:17:19.030339043 -0500 @@ -214,24 +214,35 @@ static void cont_handler(struct ev_loop static int extract_type(const char *str) { - const char *tptr, *ptr2, *ptr = str; + char tmp, *ptr2, *ptr = str; + int type; if (*str == 'n') { ptr = strchr(str+1, ' '); if (ptr == NULL) return -1; // Malformed - bomb out ptr++; } + // ptr should be at 't' ptr2 = strchr(ptr, ' '); - // get type=xxx in a buffer - tptr = strndupa(ptr, ptr2 - ptr); + // find = - str = strchr(tptr, '='); - if (str == NULL) + str = strchr(ptr, '='); + if (str == NULL || str >= ptr2) return -1; // Malformed - bomb out + // name is 1 past str++; - return audit_name_to_msg_type(str); + + // Save character & terminate string + tmp = *ptr2; + *ptr2 = 0; + + type = audit_name_to_msg_type(str); + + *ptr2 = tmp; // Restore character + + return type; } void distribute_event(struct auditd_event *e) @@ -250,18 +261,22 @@ void distribute_event(struct auditd_even route = 0; else { // We only need the original type if its being routed e->reply.type = extract_type(e->reply.message); - char *p = strchr(e->reply.message, - AUDIT_INTERP_SEPARATOR); - if (p) - proto = AUDISP_PROTOCOL_VER2; - else - proto = AUDISP_PROTOCOL_VER; + // Treat everything from the network as VER2 + // because they are already formatted. This is + // important when it gets to the dispatcher which + // can strip node= when its VER1. + proto = AUDISP_PROTOCOL_VER2; } - } else if (e->reply.type != AUDIT_DAEMON_RECONFIG) - // All other events need formatting + } else if (e->reply.type != AUDIT_DAEMON_RECONFIG) { + // All other local events need formatting format_event(e); - else + + // If the event has been formatted with node, upgrade + // to VER2 so that the dispatcher honors the formatting + if (config.node_name_format != N_NONE) + proto = AUDISP_PROTOCOL_VER2; + } else route = 0; // Don't DAEMON_RECONFIG events until after enqueue /* End of Event is for realtime interface - skip local logging of it */ @@ -748,6 +763,17 @@ int main(int argc, char *argv[]) return 1; } + /* Startup libev and dispatcher */ + loop = ev_default_loop(EVFLAG_NOENV); + if (init_dispatcher(&config)) { + if (pidfile) + unlink(pidfile); + tell_parent(FAILURE); + free_config(&config); + ev_default_destroy(); + return 1; + } + /* Get machine name ready for use */ if (resolve_node(&config)) { if (pidfile) @@ -755,6 +781,7 @@ int main(int argc, char *argv[]) shutdown_dispatcher(); tell_parent(FAILURE); free_config(&config); + ev_default_destroy(); return 1; } @@ -766,6 +793,7 @@ int main(int argc, char *argv[]) shutdown_dispatcher(); tell_parent(FAILURE); free_config(&config); + ev_default_destroy(); return 1; } fcntl(pipefds[0], F_SETFD, FD_CLOEXEC); @@ -785,6 +813,7 @@ int main(int argc, char *argv[]) tell_parent(FAILURE); close_pipes(); free_config(&config); + ev_default_destroy(); return 1; } if (getsubj(subj)) @@ -811,6 +840,7 @@ int main(int argc, char *argv[]) tell_parent(FAILURE); close_pipes(); free_config(&config); + ev_default_destroy(); return 1; } } @@ -821,6 +851,7 @@ int main(int argc, char *argv[]) /* let config manager init */ init_config_manager(); + /* Depending on value of opt_startup (-s) set initial audit state */ if (opt_startup != startup_nochange && !opt_aggregate_only && (audit_is_enabled(fd) < 2) && audit_set_enabled(fd, (int)opt_startup) < 0) { @@ -849,6 +880,7 @@ int main(int argc, char *argv[]) tell_parent(FAILURE); close_pipes(); free_config(&config); + ev_default_destroy(); return 1; } @@ -877,20 +909,11 @@ int main(int argc, char *argv[]) tell_parent(FAILURE); close_pipes(); free_config(&config); + ev_default_destroy(); return 1; } - /* Depending on value of opt_startup (-s) set initial audit state */ - loop = ev_default_loop (EVFLAG_NOENV); - - if (init_dispatcher(&config)) { - if (pidfile) - unlink(pidfile); - tell_parent(FAILURE); - free_config(&config); - return 1; - } - + /* Start up all the handlers */ if (!opt_aggregate_only) { ev_io_init (&netlink_watcher, netlink_handler, fd, EV_READ); ev_io_start (loop, &netlink_watcher); diff -urp audit-3.0.orig/src/auditd-dispatch.c audit-3.0/src/auditd-dispatch.c --- audit-3.0.orig/src/auditd-dispatch.c 2018-08-31 17:05:48.000000000 -0400 +++ audit-3.0/src/auditd-dispatch.c 2018-12-06 20:17:09.769340037 -0500 @@ -70,6 +70,7 @@ int dispatch_event(const struct audit_re if (!libdisp_active()) return 0; + // Translate event into dispatcher format e = malloc(sizeof(event_t)); if (e == NULL) return -1; @@ -78,6 +79,7 @@ int dispatch_event(const struct audit_re e->hdr.hlen = sizeof(struct audit_dispatcher_header); e->hdr.type = rep->type; + // Network originating events have data at rep->message if (protocol_ver == AUDISP_PROTOCOL_VER) { e->hdr.size = rep->msg.nlh.nlmsg_len; memcpy(e->data, (void*)rep->msg.data, e->hdr.size); diff -urp audit-3.0.orig/src/auditd-event.c audit-3.0/src/auditd-event.c --- audit-3.0.orig/src/auditd-event.c 2018-08-31 17:05:48.000000000 -0400 +++ audit-3.0/src/auditd-event.c 2018-12-06 20:17:09.769340037 -0500 @@ -225,8 +225,10 @@ static void replace_event_msg(struct aud e->reply.message = strndup(buf, MAX_AUDIT_MESSAGE_LENGTH-1); len = MAX_AUDIT_MESSAGE_LENGTH; } - e->reply.msg.nlh.nlmsg_len = e->reply.len; - e->reply.len = len; + // For network originating events, len should be used + if (!from_network(e)) // V1 protocol msg size + e->reply.msg.nlh.nlmsg_len = e->reply.len; + e->reply.len = len; // V2 protocol msg size } } @@ -500,7 +502,7 @@ struct auditd_event *create_event(char * e->sequence_id = sequence_id; /* Network originating events need things adjusted to mimic netlink. */ - if (e->ack_func) + if (from_network(e)) replace_event_msg(e, msg); return e; @@ -570,7 +572,7 @@ void handle_event(struct auditd_event *e static void send_ack(const struct auditd_event *e, int ack_type, const char *msg) { - if (e->ack_func) { + if (from_network(e)) { unsigned char header[AUDIT_RMW_HEADER_SIZE]; AUDIT_RMW_PACK_HEADER(header, 0, ack_type, strlen(msg), diff -urp audit-3.0.orig/src/auditd-event.h audit-3.0/src/auditd-event.h --- audit-3.0.orig/src/auditd-event.h 2018-08-31 17:05:48.000000000 -0400 +++ audit-3.0/src/auditd-event.h 2018-12-06 20:17:09.769340037 -0500 @@ -36,6 +36,9 @@ struct auditd_event { unsigned long sequence_id; }; +static inline int from_network(const struct auditd_event *e) +{ if (e && e->ack_func) return 1; return 0; }; + #include "auditd-config.h" int dispatch_network_events(void);