From: Giuseppe Longo Date: Wed, 20 Mar 2024 17:31:42 +0000 (+0100) Subject: output/json: check 5-tuple values prior to logging X-Git-Tag: suricata-7.0.9~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1551888f6e313a6a988d4b0d5bae279d89589bd7;p=thirdparty%2Fsuricata.git output/json: check 5-tuple values prior to logging This commit enhances the JSON output by introducing a feature for conditional port logging. Now, port logging is dependent on the underlying protocol (such as TCP, UDP, or SCTP), where port information is pertinent, while it avoids unnecessary logging for protocols where a port is not utilized (e.g. ARP). Furthermore, this update ensures that IP addresses and the protocol have meaningful values set, rather than being logged as empty strings. These changes will make each log entry more precise, eliminating cases where 5-tuple fields are empty or set to zero, indicating the absence of a field. Backported to address ticket: https://redmine.openinfosecfoundation.org/issues/7460 Ticket: #7460 (cherry picked from commit a1c6328156ffa1e3d690fa180b0395f9dcd9f52e) --- diff --git a/src/output-json.c b/src/output-json.c index 00d99fc697..e25ee516fb 100644 --- a/src/output-json.c +++ b/src/output-json.c @@ -581,8 +581,10 @@ void JsonAddrInfoInit(const Packet *p, enum OutputJsonLogDirection dir, JsonAddr case IPPROTO_SCTP: addr->sp = sp; addr->dp = dp; + addr->log_port = true; break; default: + addr->log_port = false; break; } @@ -880,11 +882,21 @@ JsonBuilder *CreateEveHeader(const Packet *p, enum OutputJsonLogDirection dir, JsonAddrInfoInit(p, dir, &addr_info); addr = &addr_info; } - jb_set_string(js, "src_ip", addr->src_ip); - jb_set_uint(js, "src_port", addr->sp); - jb_set_string(js, "dest_ip", addr->dst_ip); - jb_set_uint(js, "dest_port", addr->dp); - jb_set_string(js, "proto", addr->proto); + if (addr->src_ip[0] != '\0') { + jb_set_string(js, "src_ip", addr->src_ip); + } + if (addr->log_port) { + jb_set_uint(js, "src_port", addr->sp); + } + if (addr->dst_ip[0] != '\0') { + jb_set_string(js, "dest_ip", addr->dst_ip); + } + if (addr->log_port) { + jb_set_uint(js, "dest_port", addr->dp); + } + if (addr->proto[0] != '\0') { + jb_set_string(js, "proto", addr->proto); + } /* icmp */ switch (p->proto) { diff --git a/src/output-json.h b/src/output-json.h index dca6e88e70..9bc448cbe6 100644 --- a/src/output-json.h +++ b/src/output-json.h @@ -52,6 +52,8 @@ typedef struct JsonAddrInfo_ { Port sp; Port dp; char proto[JSON_PROTO_LEN]; + // Ports are logged only when provided by the transport protocol. + bool log_port; } JsonAddrInfo; extern const JsonAddrInfo json_addr_info_zero;