decode: make packet_alert_max configurable

The maximum of possible alerts triggered by a unique packet was
hardcoded to 15. With usage of 'noalert' rules, that limit could be
reached somewhat easily. Make that configurable via suricata.yaml.

Conf Bug#4941

Task #4207
pull/7349/head
Juliana Fajardini 5 years ago committed by Victor Julien
parent e319d31c14
commit 3ace577d54

@ -1,4 +1,4 @@
/* Copyright (C) 2007-2019 Open Information Security Foundation /* Copyright (C) 2007-2022 Open Information Security Foundation
* *
* You can copy, redistribute or modify this Program under the terms of * You can copy, redistribute or modify this Program under the terms of
* the GNU General Public License version 2 as published by the Free * the GNU General Public License version 2 as published by the Free
@ -74,6 +74,26 @@ extern bool stats_decoder_events;
extern const char *stats_decoder_events_prefix; extern const char *stats_decoder_events_prefix;
extern bool stats_stream_events; extern bool stats_stream_events;
uint8_t decoder_max_layers = PKT_DEFAULT_MAX_DECODED_LAYERS; uint8_t decoder_max_layers = PKT_DEFAULT_MAX_DECODED_LAYERS;
uint16_t packet_alert_max = PACKET_ALERT_MAX;
/**
* \brief Initialize PacketAlerts with dynamic alerts array size
*
*/
PacketAlert *PacketAlertCreate(void)
{
PacketAlert *pa_array = SCCalloc(packet_alert_max, sizeof(PacketAlert));
BUG_ON(pa_array == NULL);
return pa_array;
}
void PacketAlertFree(PacketAlert *pa)
{
if (pa != NULL) {
SCFree(pa);
}
}
static int DecodeTunnel(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, static int DecodeTunnel(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t,
enum DecodeTunnelProto) WARN_UNUSED; enum DecodeTunnelProto) WARN_UNUSED;
@ -781,6 +801,21 @@ void DecodeGlobalConfig(void)
decoder_max_layers = value; decoder_max_layers = value;
} }
} }
PacketAlertGetMaxConfig();
}
void PacketAlertGetMaxConfig(void)
{
intmax_t max = 0;
if (ConfGetInt("packet-alert-max", &max) == 1) {
if (max <= 0 || max > UINT8_MAX) {
SCLogWarning(SC_ERR_INVALID_VALUE,
"Invalid value for packet-alert-max, default value set instead");
} else {
packet_alert_max = max;
}
}
SCLogDebug("detect->packet_alert_max set to %d", packet_alert_max);
} }
/** /**

@ -1,4 +1,4 @@
/* Copyright (C) 2007-2020 Open Information Security Foundation /* Copyright (C) 2007-2022 Open Information Security Foundation
* *
* You can copy, redistribute or modify this Program under the terms of * You can copy, redistribute or modify this Program under the terms of
* the GNU General Public License version 2 as published by the Free * the GNU General Public License version 2 as published by the Free
@ -299,16 +299,21 @@ typedef struct PacketAlert_ {
/** alert is in a frame, frame_id set */ /** alert is in a frame, frame_id set */
#define PACKET_ALERT_FLAG_FRAME 0x20 #define PACKET_ALERT_FLAG_FRAME 0x20
extern uint16_t packet_alert_max;
#define PACKET_ALERT_MAX 15 #define PACKET_ALERT_MAX 15
typedef struct PacketAlerts_ { typedef struct PacketAlerts_ {
uint16_t cnt; uint16_t cnt;
PacketAlert alerts[PACKET_ALERT_MAX]; PacketAlert *alerts;
/* single pa used when we're dropping, /* single pa used when we're dropping,
* so we can log it out in the drop log. */ * so we can log it out in the drop log. */
PacketAlert drop; PacketAlert drop;
} PacketAlerts; } PacketAlerts;
PacketAlert *PacketAlertCreate(void);
void PacketAlertFree(PacketAlert *pa);
/** number of decoder events we support per packet. Power of 2 minus 1 /** number of decoder events we support per packet. Power of 2 minus 1
* for memory layout */ * for memory layout */
#define PACKET_ENGINE_EVENT_MAX 15 #define PACKET_ENGINE_EVENT_MAX 15
@ -760,11 +765,13 @@ void CaptureStatsSetup(ThreadVars *tv, CaptureStats *s);
/** /**
* \brief Initialize a packet structure for use. * \brief Initialize a packet structure for use.
*/ */
#define PACKET_INITIALIZE(p) { \ #define PACKET_INITIALIZE(p) \
SCMutexInit(&(p)->tunnel_mutex, NULL); \ { \
PACKET_RESET_CHECKSUMS((p)); \ SCMutexInit(&(p)->tunnel_mutex, NULL); \
(p)->livedev = NULL; \ (p)->alerts.alerts = PacketAlertCreate(); \
} PACKET_RESET_CHECKSUMS((p)); \
(p)->livedev = NULL; \
}
#define PACKET_RELEASE_REFS(p) do { \ #define PACKET_RELEASE_REFS(p) do { \
FlowDeReference(&((p)->flow)); \ FlowDeReference(&((p)->flow)); \
@ -862,6 +869,7 @@ void CaptureStatsSetup(ThreadVars *tv, CaptureStats *s);
if ((p)->pktvar != NULL) { \ if ((p)->pktvar != NULL) { \
PktVarFree((p)->pktvar); \ PktVarFree((p)->pktvar); \
} \ } \
PacketAlertFree((p)->alerts.alerts); \
PACKET_FREE_EXTDATA((p)); \ PACKET_FREE_EXTDATA((p)); \
SCMutexDestroy(&(p)->tunnel_mutex); \ SCMutexDestroy(&(p)->tunnel_mutex); \
AppLayerDecoderEventsFreeEvents(&(p)->app_layer_events); \ AppLayerDecoderEventsFreeEvents(&(p)->app_layer_events); \
@ -1017,6 +1025,7 @@ void AddressDebugPrint(Address *);
typedef int (*DecoderFunc)(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, typedef int (*DecoderFunc)(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p,
const uint8_t *pkt, uint32_t len); const uint8_t *pkt, uint32_t len);
void DecodeGlobalConfig(void); void DecodeGlobalConfig(void);
void PacketAlertGetMaxConfig(void);
void DecodeUnregisterCounters(void); void DecodeUnregisterCounters(void);
/** \brief Set the No payload inspection Flag for the packet. /** \brief Set the No payload inspection Flag for the packet.

@ -1,4 +1,4 @@
/* Copyright (C) 2007-2021 Open Information Security Foundation /* Copyright (C) 2007-2022 Open Information Security Foundation
* *
* You can copy, redistribute or modify this Program under the terms of * You can copy, redistribute or modify this Program under the terms of
* the GNU General Public License version 2 as published by the Free * the GNU General Public License version 2 as published by the Free

@ -1180,6 +1180,10 @@ legacy:
# - reject # - reject
# - alert # - alert
# Define maximum number of possible alerts that can be triggered for the same
# packet. Default is 15
#packet-alert-max: 15
# IP Reputation # IP Reputation
#reputation-categories-file: @e_sysconfdir@iprep/categories.txt #reputation-categories-file: @e_sysconfdir@iprep/categories.txt
#default-reputation-path: @e_sysconfdir@iprep #default-reputation-path: @e_sysconfdir@iprep

Loading…
Cancel
Save