]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
mqtt: raise event on parse error
authorSascha Steinbiss <satta@debian.org>
Tue, 8 Mar 2022 22:18:36 +0000 (23:18 +0100)
committerVictor Julien <vjulien@oisf.net>
Fri, 8 Apr 2022 20:58:27 +0000 (22:58 +0200)
rules/mqtt-events.rules
rust/src/mqtt/mqtt.rs

index 93d830ae0e0e3d4d80933ff108cd7a8143bb2d6b..57b5821d8b6047591defab50a9c6067353f512d8 100644 (file)
@@ -14,3 +14,4 @@ alert mqtt any any -> any any (msg:"SURICATA MQTT invalid QOS level"; app-layer-
 alert mqtt any any -> any any (msg:"SURICATA MQTT missing message ID"; app-layer-event:mqtt.missing_msg_id; classtype:protocol-command-decode; sid:2229007; rev:1;)
 alert mqtt any any -> any any (msg:"SURICATA MQTT unassigned message type (0 or >15)"; app-layer-event:mqtt.unassigned_msg_type; classtype:protocol-command-decode; sid:2229008; rev:1;)
 alert mqtt any any -> any any (msg:"SURICATA MQTT too many transactions"; app-layer-event:mqtt.too_many_transactions; classtype:protocol-command-decode; sid:2229009; rev:1;)
+alert mqtt any any -> any any (msg:"SURICATA MQTT malformed traffic"; app-layer-event:mqtt.malformed_traffic; classtype:protocol-command-decode; sid:2229010; rev:1;)
index 8ebde8e0410fc95884efdd2b198153d2671dd7c7..c4600979a3379682240c874fa00a707e94b207d6 100644 (file)
@@ -52,6 +52,7 @@ pub enum MQTTEvent {
     MissingMsgId,
     UnassignedMsgType,
     TooManyTransactions,
+    MalformedTraffic,
 }
 
 #[derive(Debug)]
@@ -69,7 +70,13 @@ pub struct MQTTTransaction {
 
 impl MQTTTransaction {
     pub fn new(msg: MQTTMessage) -> MQTTTransaction {
-        let mut m = MQTTTransaction {
+        let mut m = MQTTTransaction::new_empty();
+        m.msg.push(msg);
+        return m;
+    }
+
+    pub fn new_empty() -> MQTTTransaction {
+        return MQTTTransaction {
             tx_id: 0,
             pkt_id: None,
             complete: false,
@@ -79,8 +86,6 @@ impl MQTTTransaction {
             toserver: false,
             tx_data: applayer::AppLayerTxData::new(),
         };
-        m.msg.push(msg);
-        return m;
     }
 }
 
@@ -457,6 +462,7 @@ impl MQTTState {
                         return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
                 }
                 Err(_) => {
+                    self.set_event_notx(MQTTEvent::MalformedTraffic, false);
                     return AppLayerResult::err();
                 }
             }
@@ -514,6 +520,7 @@ impl MQTTState {
                     return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
                 }
                 Err(_) => {
+                    self.set_event_notx(MQTTEvent::MalformedTraffic, true);
                     return AppLayerResult::err();
                 }
             }
@@ -525,6 +532,20 @@ impl MQTTState {
     fn set_event(tx: &mut MQTTTransaction, event: MQTTEvent) {
         tx.tx_data.set_event(event as u8);
     }
+
+    fn set_event_notx(&mut self, event: MQTTEvent, toclient: bool) {
+        let mut tx = MQTTTransaction::new_empty();
+        self.tx_id += 1;
+        tx.tx_id = self.tx_id;
+        if toclient {
+            tx.toclient = true;
+        } else {
+            tx.toserver = true;
+        }
+        tx.complete = true;
+        tx.tx_data.set_event(event as u8);
+        self.transactions.push(tx);
+    }
 }
 
 // C exports.