From: Juliana Fajardini Date: Mon, 27 Nov 2023 20:22:19 +0000 (-0300) Subject: pgsql: add unknonwn frontend message type X-Git-Tag: suricata-8.0.0-beta1~1979 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ac5d97259994f73e64533366d74e40f9fe22694;p=thirdparty%2Fsuricata.git pgsql: add unknonwn frontend message type We had unkonwn message type for the backend, but not the frontend messages. It's important to better identify those to improve pgsql probing functions. Related to Bug #6080 --- diff --git a/rust/src/pgsql/logger.rs b/rust/src/pgsql/logger.rs index 03b1ad0f46..57a3e52670 100644 --- a/rust/src/pgsql/logger.rs +++ b/rust/src/pgsql/logger.rs @@ -102,6 +102,13 @@ fn log_request(req: &PgsqlFEMessage, flags: u32) -> Result { js.set_string("message", req.to_str())?; } + PgsqlFEMessage::UnknownMessageType(RegularPacket { + identifier: _, + length: _, + payload: _, + }) => { + // We don't want to log these, for now. Cf redmine: #6576 + } } js.close()?; Ok(js) diff --git a/rust/src/pgsql/parser.rs b/rust/src/pgsql/parser.rs index ae07d5d5a0..27ea3217e8 100644 --- a/rust/src/pgsql/parser.rs +++ b/rust/src/pgsql/parser.rs @@ -320,6 +320,7 @@ pub enum PgsqlFEMessage { SASLResponse(RegularPacket), SimpleQuery(RegularPacket), Terminate(TerminationMessage), + UnknownMessageType(RegularPacket), } impl PgsqlFEMessage { @@ -332,6 +333,7 @@ impl PgsqlFEMessage { PgsqlFEMessage::SASLResponse(_) => "sasl_response", PgsqlFEMessage::SimpleQuery(_) => "simple_query", PgsqlFEMessage::Terminate(_) => "termination_message", + PgsqlFEMessage::UnknownMessageType(_) => "unknown_message_type", } } } @@ -673,7 +675,17 @@ pub fn parse_request(i: &[u8]) -> IResult<&[u8], PgsqlFEMessage> { b'\0' => pgsql_parse_startup_packet(i)?, b'Q' => parse_simple_query(i)?, b'X' => parse_terminate_message(i)?, - _ => return Err(Err::Error(make_error(i, ErrorKind::Switch))), + _ => { + let (i, identifier) = be_u8(i)?; + let (i, length) = verify(be_u32, |&x| x > PGSQL_LENGTH_FIELD)(i)?; + let (i, payload) = take(length - PGSQL_LENGTH_FIELD)(i)?; + let unknown = PgsqlFEMessage::UnknownMessageType (RegularPacket{ + identifier, + length, + payload: payload.to_vec(), + }); + (i, unknown) + } }; Ok((i, message)) } diff --git a/rust/src/pgsql/pgsql.rs b/rust/src/pgsql/pgsql.rs index f5fbebc8f9..fa19785ff9 100644 --- a/rust/src/pgsql/pgsql.rs +++ b/rust/src/pgsql/pgsql.rs @@ -284,6 +284,11 @@ impl PgsqlState { SCLogDebug!("Match: Terminate message"); Some(PgsqlStateProgress::ConnectionTerminated) } + PgsqlFEMessage::UnknownMessageType(_) => { + SCLogDebug!("Match: Unknown message type"); + // Not changing state when we don't know the message + None + } } }