]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
detect: implement 'alert' keyword as a companion to 'noalert'
authorVictor Julien <vjulien@oisf.net>
Fri, 12 Jan 2024 13:00:37 +0000 (14:00 +0100)
committerVictor Julien <victor@inliniac.net>
Tue, 2 Jul 2024 19:25:29 +0000 (21:25 +0200)
This can be used to implement alert then pass logic.

Add support for alert-then-pass to alert handling routines.

Ticket: #5466.
(cherry picked from commit d5fb8204b6b30b9617ebd95dd12c87a812b2cb5a)

src/detect-engine-alert.c
src/detect-engine-register.h
src/detect-noalert.c

index 29c6ece7781c673e001f870708945b050b340d31..466ca45703767319e0f1f6aa2c3566613556dcc1 100644 (file)
@@ -418,12 +418,18 @@ void PacketAlertFinalize(DetectEngineCtx *de_ctx, DetectEngineThreadCtx *det_ctx
             p->alerts.alerts[p->alerts.cnt] = *pa;
             SCLogDebug("Appending sid %" PRIu32 " alert to Packet::alerts at pos %u", s->id, i);
 
-            /* pass "alert" found, we're done */
-            if (pa->action & ACTION_PASS) {
+            /* pass w/o alert found, we're done. Alert is not logged. */
+            if ((pa->action & (ACTION_PASS | ACTION_ALERT)) == ACTION_PASS) {
                 SCLogDebug("sid:%u: is a pass rule, so break out of loop", s->id);
                 break;
             }
             p->alerts.cnt++;
+
+            /* pass with alert, we're done. Alert is logged. */
+            if (pa->action & ACTION_PASS) {
+                SCLogDebug("sid:%u: is a pass rule, so break out of loop", s->id);
+                break;
+            }
         } else {
             p->alerts.discarded++;
         }
index f7d959151d5d8ff2143d7ad8966c3880b550c1c8..800d85b59d3cc8f0285b79d8b00de687d8c18acb 100644 (file)
@@ -87,6 +87,7 @@ enum DetectKeywordId {
     DETECT_FLOWINT,
     DETECT_PKTVAR,
     DETECT_NOALERT,
+    DETECT_ALERT,
     DETECT_FLOWBITS,
     DETECT_HOSTBITS,
     DETECT_IPV4_CSUM,
index c0d90eca2fe39717662f2cb6160f91755c643d88..4cb522cf029765bfd015b89905c60c2911b80315 100644 (file)
@@ -20,7 +20,7 @@
  *
  * \author Victor Julien <victor@inliniac.net>
  *
- * Implements the noalert keyword
+ * Implements the noalert and alert keywords.
  */
 
 #include "suricata-common.h"
@@ -38,6 +38,14 @@ static int DetectNoalertSetup(DetectEngineCtx *de_ctx, Signature *s, const char
     return 0;
 }
 
+static int DetectAlertSetup(DetectEngineCtx *de_ctx, Signature *s, const char *nullstr)
+{
+    DEBUG_VALIDATE_BUG_ON(nullstr != NULL);
+
+    s->action |= ACTION_ALERT;
+    return 0;
+}
+
 void DetectNoalertRegister(void)
 {
     sigmatch_table[DETECT_NOALERT].name = "noalert";
@@ -45,4 +53,10 @@ void DetectNoalertRegister(void)
     sigmatch_table[DETECT_NOALERT].url = "/rules/flow-keywords.html";
     sigmatch_table[DETECT_NOALERT].Setup = DetectNoalertSetup;
     sigmatch_table[DETECT_NOALERT].flags |= SIGMATCH_NOOPT;
+
+    sigmatch_table[DETECT_ALERT].name = "alert";
+    sigmatch_table[DETECT_ALERT].desc = "alert will be generated by the rule";
+    sigmatch_table[DETECT_ALERT].url = "/rules/flow-keywords.html";
+    sigmatch_table[DETECT_ALERT].Setup = DetectAlertSetup;
+    sigmatch_table[DETECT_ALERT].flags |= SIGMATCH_NOOPT;
 }