aboutsummaryrefslogtreecommitdiff
path: root/src/lib/ndpi_main.c
diff options
context:
space:
mode:
authorLuca Deri <deri@ntop.org>2024-07-25 12:54:59 +0200
committerLuca Deri <deri@ntop.org>2024-07-25 12:54:59 +0200
commitf3ea8ca6bee3b7a6c7d393c1768f636bdaf7b63d (patch)
tree92e048c2d287caad32161952f577caf69d2c4567 /src/lib/ndpi_main.c
parent85501c9aaabf207b04e3fe961825385f9519f633 (diff)
Improved ICMP malformed packet risk description
Diffstat (limited to 'src/lib/ndpi_main.c')
-rw-r--r--src/lib/ndpi_main.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c
index 4239f3064..c82fdb10b 100644
--- a/src/lib/ndpi_main.c
+++ b/src/lib/ndpi_main.c
@@ -4379,16 +4379,26 @@ static u_int16_t guess_protocol_id(struct ndpi_detection_module_struct *ndpi_str
/* Run some basic consistency tests */
if(packet->payload_packet_len < sizeof(struct ndpi_icmphdr)) {
- ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, NULL);
+ char buf[64];
+
+ snprintf(buf, sizeof(buf), "Packet too short (%d vs %u)",
+ packet->payload_packet_len, (unsigned int)sizeof(struct ndpi_icmphdr));
+ ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, buf);
} else {
u_int8_t icmp_type = (u_int8_t)packet->payload[0];
u_int8_t icmp_code = (u_int8_t)packet->payload[1];
/* https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml */
if(((icmp_type >= 44) && (icmp_type <= 252))
- || (icmp_code > 15))
- ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, NULL);
+ || (icmp_code > 15)) {
+ char buf[64];
+
+ snprintf(buf, sizeof(buf), "Invalid type (%u)/code(%u)",
+ icmp_type, icmp_code);
+ ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, buf);
+ }
+
if(packet->payload_packet_len > sizeof(struct ndpi_icmphdr)) {
if(ndpi_str->cfg.compute_entropy && (flow->skip_entropy_check == 0)) {
flow->entropy = ndpi_entropy(packet->payload + sizeof(struct ndpi_icmphdr),
@@ -4399,7 +4409,7 @@ static u_int16_t guess_protocol_id(struct ndpi_detection_module_struct *ndpi_str
u_int16_t chksm = icmp4_checksum(packet->payload, packet->payload_packet_len);
if(chksm) {
- ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, NULL);
+ ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, "Invalid ICMP checksum");
}
}
}
@@ -4419,16 +4429,27 @@ static u_int16_t guess_protocol_id(struct ndpi_detection_module_struct *ndpi_str
if(flow) {
/* Run some basic consistency tests */
- if(packet->payload_packet_len < sizeof(struct ndpi_icmp6hdr))
- ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, NULL);
- else {
+ if(packet->payload_packet_len < sizeof(struct ndpi_icmp6hdr)) {
+ char buf[64];
+
+ snprintf(buf, sizeof(buf), "Packet too short (%d vs %u)",
+ packet->payload_packet_len, (unsigned int)sizeof(struct ndpi_icmp6hdr));
+
+ ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, buf);
+ } else {
u_int8_t icmp6_type = (u_int8_t)packet->payload[0];
u_int8_t icmp6_code = (u_int8_t)packet->payload[1];
/* https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol_for_IPv6 */
if(((icmp6_type >= 5) && (icmp6_type <= 127))
- || ((icmp6_code >= 156) && (icmp6_type != 255)))
- ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, NULL);
+ || ((icmp6_code >= 156) && (icmp6_type != 255))) {
+ char buf[64];
+
+ snprintf(buf, sizeof(buf), "Invalid type (%u)/code(%u)",
+ icmp6_type, icmp6_code);
+
+ ndpi_set_risk(flow, NDPI_MALFORMED_PACKET, buf);
+ }
}
}
return(NDPI_PROTOCOL_IP_ICMPV6);