From: Sascha Steinbiss Date: Mon, 10 May 2021 12:54:47 +0000 (+0200) Subject: detect/mqtt: add topic inspection limit X-Git-Tag: suricata-6.0.3~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07669cd70a1cd699919eeb4c8097898ffe40f5d3;p=thirdparty%2Fsuricata.git detect/mqtt: add topic inspection limit We add a new 'mqtt.(un)subscribe-topic-match-limit' option to allow a user to specify the maximum number of topics in a MQTT SUBSCRIBE or UNSUBSCRIBE message to be evaluated in detection. (cherry picked from commit 4c0ef73bf21f5b07c5c34fd2dc5f6d9c166bc6da) --- diff --git a/src/detect-mqtt-subscribe-topic.c b/src/detect-mqtt-subscribe-topic.c index 25b4188cb0..daedf77a91 100644 --- a/src/detect-mqtt-subscribe-topic.c +++ b/src/detect-mqtt-subscribe-topic.c @@ -58,6 +58,8 @@ static int DetectMQTTSubscribeTopicSetup(DetectEngineCtx *, Signature *, const c static int g_mqtt_subscribe_topic_buffer_id = 0; +static uint32_t subscribe_topic_match_limit = 100; + struct MQTTSubscribeTopicGetDataArgs { uint32_t local_id; void *txv; @@ -101,7 +103,7 @@ static int DetectEngineInspectMQTTSubscribeTopic( transforms = engine->v2.transforms; } - while(1) { + while ((subscribe_topic_match_limit == 0) || local_id < subscribe_topic_match_limit) { struct MQTTSubscribeTopicGetDataArgs cbdata = { local_id, txv, }; InspectionBuffer *buffer = MQTTSubscribeTopicGetData(det_ctx, transforms, f, &cbdata, engine->sm_list, false); @@ -152,7 +154,7 @@ static void PrefilterTxMQTTSubscribeTopic(DetectEngineThreadCtx *det_ctx, const int list_id = ctx->list_id; uint32_t local_id = 0; - while(1) { + while ((subscribe_topic_match_limit == 0) || local_id < subscribe_topic_match_limit) { struct MQTTSubscribeTopicGetDataArgs cbdata = { local_id, txv }; InspectionBuffer *buffer = MQTTSubscribeTopicGetData(det_ctx, ctx->transforms, f, &cbdata, list_id, true); @@ -202,6 +204,16 @@ void DetectMQTTSubscribeTopicRegister (void) sigmatch_table[DETECT_AL_MQTT_SUBSCRIBE_TOPIC].flags |= SIGMATCH_NOOPT; sigmatch_table[DETECT_AL_MQTT_SUBSCRIBE_TOPIC].flags |= SIGMATCH_INFO_STICKY_BUFFER; + intmax_t val = 0; + if (ConfGetInt("mqtt.subscribe-topic-match-limit", &val)) { + subscribe_topic_match_limit = val; + } + if (subscribe_topic_match_limit <= 0) { + SCLogDebug("Using unrestricted MQTT SUBSCRIBE topic matching"); + } else { + SCLogDebug("Using MQTT SUBSCRIBE topic match-limit setting of: %u", + subscribe_topic_match_limit); + } DetectAppLayerMpmRegister2("mqtt.subscribe.topic", SIG_FLAG_TOSERVER, 1, PrefilterMpmMQTTSubscribeTopicRegister, NULL, diff --git a/src/detect-mqtt-unsubscribe-topic.c b/src/detect-mqtt-unsubscribe-topic.c index c4b9806ccf..2c218029be 100644 --- a/src/detect-mqtt-unsubscribe-topic.c +++ b/src/detect-mqtt-unsubscribe-topic.c @@ -58,6 +58,8 @@ static int DetectMQTTUnsubscribeTopicSetup(DetectEngineCtx *, Signature *, const static int g_mqtt_unsubscribe_topic_buffer_id = 0; +static uint32_t unsubscribe_topic_match_limit = 100; + struct MQTTUnsubscribeTopicGetDataArgs { uint32_t local_id; void *txv; @@ -101,7 +103,7 @@ static int DetectEngineInspectMQTTUnsubscribeTopic( transforms = engine->v2.transforms; } - while(1) { + while ((unsubscribe_topic_match_limit == 0) || local_id < unsubscribe_topic_match_limit) { struct MQTTUnsubscribeTopicGetDataArgs cbdata = { local_id, txv, }; InspectionBuffer *buffer = MQTTUnsubscribeTopicGetData(det_ctx, transforms, f, &cbdata, engine->sm_list, false); @@ -152,7 +154,7 @@ static void PrefilterTxMQTTUnsubscribeTopic(DetectEngineThreadCtx *det_ctx, const int list_id = ctx->list_id; uint32_t local_id = 0; - while(1) { + while ((unsubscribe_topic_match_limit == 0) || local_id < unsubscribe_topic_match_limit) { struct MQTTUnsubscribeTopicGetDataArgs cbdata = { local_id, txv }; InspectionBuffer *buffer = MQTTUnsubscribeTopicGetData(det_ctx, ctx->transforms, f, &cbdata, list_id, true); @@ -202,6 +204,16 @@ void DetectMQTTUnsubscribeTopicRegister (void) sigmatch_table[DETECT_AL_MQTT_UNSUBSCRIBE_TOPIC].flags |= SIGMATCH_NOOPT; sigmatch_table[DETECT_AL_MQTT_UNSUBSCRIBE_TOPIC].flags |= SIGMATCH_INFO_STICKY_BUFFER; + intmax_t val = 0; + if (ConfGetInt("mqtt.unsubscribe-topic-match-limit", &val)) { + unsubscribe_topic_match_limit = val; + } + if (unsubscribe_topic_match_limit <= 0) { + SCLogDebug("Using unrestricted MQTT UNSUBSCRIBE topic matching"); + } else { + SCLogDebug("Using MQTT UNSUBSCRIBE topic match-limit setting of: %i", + unsubscribe_topic_match_limit); + } DetectAppLayerMpmRegister2("mqtt.unsubscribe.topic", SIG_FLAG_TOSERVER, 1, PrefilterMpmMQTTUnsubscribeTopicRegister, NULL, diff --git a/suricata.yaml.in b/suricata.yaml.in index 19b24259d1..7aa29b12dc 100644 --- a/suricata.yaml.in +++ b/suricata.yaml.in @@ -1111,6 +1111,11 @@ pcre: match-limit: 3500 match-limit-recursion: 1500 +# MQTT topic detection depth +#mqtt: +# subscribe-topic-match-limit: 100 +# unsubscribe-topic-match-limit: 100 + ## ## Advanced Traffic Tracking and Reconstruction Settings ##