prelude-lml/master: Events reporting improvement

[email protected] Mon, 8 Feb 2010 11:24:48 +0100 (CET)
Newsgroups gmane.comp.security.ids.prelude.cvs
Message-ID <[email protected]>
commit 11a811c203bac1f41900b400a5d7798d7597b40c
Author: Yoann Vandoorselaere <[email protected]>
Date:   Fri Feb 5 18:06:20 2010 +0100

    Events reporting improvement
    
    Add a log message on log truncation/deletion. Don't provide statistics
    for an inexisting new file if this is a deletion.


========================================

 src/file-server.c |   21 +++++++++++++++------
 1 files changed, 15 insertions(+), 6 deletions(-)

========================================

diff --git a/src/file-server.c b/src/file-server.c
index acc7e19..3b88f71 100644
--- a/src/file-server.c
+++ b/src/file-server.c
@@ -99,7 +99,7 @@
 
 #define LOGFILE_RENAME_CLASS   "Log file rename"
 #define LOGFILE_DELETION_CLASS "Log file deletion"
-#define LOGFILE_DELETION_IMPACT "An attacker might have erased the logfile,"               \
+#define LOGFILE_DELETION_IMPACT "An attacker might have erased the logfile, "               \
                                 "or a log rotation program may have rotated the logfile."
 
 #define LOGFILE_MODIFICATION_CLASS "Log file inconsistency"
@@ -232,10 +232,10 @@ static void logfile_alert(monitor_fd_t *fd, ev_statdata *st_old, ev_statdata *st
         if ( ret < 0 )
                 goto err;
 
-        if ( stat_to_file(fd, st_old, target, IDMEF_FILE_CATEGORY_ORIGINAL) < 0 )
+        if ( st_old && stat_to_file(fd, st_old, target, IDMEF_FILE_CATEGORY_ORIGINAL) < 0 )
                 goto err;
 
-        if ( stat_to_file(fd, st_new, target, IDMEF_FILE_CATEGORY_CURRENT) < 0 )
+        if ( st_new && stat_to_file(fd, st_new, target, IDMEF_FILE_CATEGORY_CURRENT) < 0 )
                 goto err;
 
         ret = idmef_alert_new_assessment(alert, &assessment);
@@ -734,10 +734,14 @@ static void monitor_close(monitor_fd_t *monitor)
 static void check_modification_time(monitor_fd_t *monitor, ev_statdata *prev, ev_statdata *st)
 {
         int ret;
+        const char *filename;
 
         if ( st->st_mtime >= prev->st_mtime && st->st_size >= monitor->last_size )
                 return; /* everythings sound okay */
 
+        filename = lml_log_source_get_name(monitor->source);
+
+        prelude_log(PRELUDE_LOG_INFO, "%s: has been %s.\n", filename, (st->st_size >= monitor->last_size) ? "modidifed" : "truncated");
         logfile_modified_alert(monitor, prev, st);
 
         /*
@@ -747,8 +751,7 @@ static void check_modification_time(monitor_fd_t *monitor, ev_statdata *prev, ev
         if ( st->st_size < monitor->last_size ) {
                 ret = fseek(monitor->fd, 0, SEEK_END);
                 if ( ret < 0 ) {
-                        prelude_log(PRELUDE_LOG_ERR, "%s: error seeking to end of file: %s.\n",
-                                    lml_log_source_get_name(monitor->source), strerror(errno));
+                        prelude_log(PRELUDE_LOG_ERR, "%s: error seeking to end of file: %s.\n", filename, strerror(errno));
                         return;
                 }
 
@@ -809,6 +812,7 @@ static int is_file_already_used(monitor_fd_t *monitor, ev_statdata *st_old, ev_s
         idmef_impact_t *impact;
         idmef_classification_t *classification;
         prelude_string_t *str;
+        prelude_bool_t is_deleted;
 
         filename = lml_log_source_get_name(monitor->source);
 
@@ -823,9 +827,11 @@ static int is_file_already_used(monitor_fd_t *monitor, ev_statdata *st_old, ev_s
         if ( st.st_nlink > 0 && st_new->st_nlink == 0 ) {
                 prelude_log(PRELUDE_LOG_INFO, "%s: has been renamed.\n", filename);
                 ctxt = LOGFILE_RENAME_CLASS;
+                is_deleted = FALSE;
         } else {
                 prelude_log(PRELUDE_LOG_INFO, "%s: has been deleted.\n", filename);
                 ctxt = LOGFILE_DELETION_CLASS;
+                is_deleted = TRUE;
         }
 
         monitor_close(monitor);
@@ -869,7 +875,10 @@ static int is_file_already_used(monitor_fd_t *monitor, ev_statdata *st_old, ev_s
                 prelude_string_set_ref(str, buf);
         }
 
-        logfile_alert(monitor, st_old, st_new, classification, impact);
+        if ( is_deleted )
+                logfile_alert(monitor, st_new, NULL, classification, impact);
+        else
+                logfile_alert(monitor, st_old, st_new, classification, impact);
 
         return -1;
 }
_______________________________________________
Prelude-cvslog site list
[email protected]
http://lists.prelude-technologies.com/mailman/listinfo/prelude-cvslog