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;)
MissingMsgId,
UnassignedMsgType,
TooManyTransactions,
+ MalformedTraffic,
}
#[derive(Debug)]
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,
toserver: false,
tx_data: applayer::AppLayerTxData::new(),
};
- m.msg.push(msg);
- return m;
}
}
return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
+ self.set_event_notx(MQTTEvent::MalformedTraffic, false);
return AppLayerResult::err();
}
}
return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
+ self.set_event_notx(MQTTEvent::MalformedTraffic, true);
return AppLayerResult::err();
}
}
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.