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

Signed-off-by: Richard Guy Briggs <[email protected]>
---
 docs/audit_request_signal_info.3 |  2 +-
 lib/libaudit.c                   | 12 +++++++++
 lib/libaudit.h                   |  1 +
 src/auditd-reconfig.c            |  9 +++----
 src/auditd.c                     | 54 ++++++++++++++--------------------------
 5 files changed, 36 insertions(+), 42 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..e9c4f9cad6df 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)
+{
+       snprintf(buf, len,
+                "op=%s auid=%u pid=%d subj=%s res=%s",
+                op,
+                rep->signal_info->uid, 
+                rep->signal_info->pid,
+                rep->len == 24 ? "?" : 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 ca7aa63e354e..63a5e948d00e 100644
--- a/lib/libaudit.h
+++ b/lib/libaudit.h
@@ -562,6 +562,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-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..5c31583a49c6 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,12 +981,8 @@ 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);
                } 
        } 
-- 
1.8.3.1

--
Linux-audit mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/linux-audit

Reply via email to