From d7657dd1d41a5f8ec5ce0fc53a9a91b48472dfce Mon Sep 17 00:00:00 2001 From: Toni Uhlig Date: Tue, 1 Mar 2022 13:28:28 +0100 Subject: [PATCH] Add ICMP checksum check and set risk if mismatch detected. Signed-off-by: Toni Uhlig --- src/include/ndpi_main.h | 1 + src/lib/ndpi_main.c | 6 ++++++ src/lib/ndpi_utils.c | 27 +++++++++++++++++++++++++++ tests/pcap/icmp-tunnel.pcap | Bin 0 -> 211208 bytes tests/result/icmp-tunnel.pcap.out | 8 ++++++++ 5 files changed, 42 insertions(+) create mode 100644 tests/pcap/icmp-tunnel.pcap create mode 100644 tests/result/icmp-tunnel.pcap.out diff --git a/src/include/ndpi_main.h b/src/include/ndpi_main.h index 9029265bb84..fe8a3816cce 100644 --- a/src/include/ndpi_main.h +++ b/src/include/ndpi_main.h @@ -151,6 +151,7 @@ extern "C" { int ndpi_is_printable_string(char * const str, size_t len); #define NDPI_ENTROPY_ENCRYPTED_OR_RANDOM(entropy) (entropy > 7.0f) float ndpi_entropy(u_int8_t const * const buf, size_t len); + u_int16_t ndpi_calculate_icmp4_checksum(u_int8_t const * const buf, size_t len); void load_common_alpns(struct ndpi_detection_module_struct *ndpi_str); u_int8_t is_a_common_alpn(struct ndpi_detection_module_struct *ndpi_str, const char *alpn_to_check, u_int alpn_to_check_len); diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c index 335cccba236..8b654e2de30 100644 --- a/src/lib/ndpi_main.c +++ b/src/lib/ndpi_main.c @@ -3030,6 +3030,12 @@ u_int16_t ndpi_guess_protocol_id(struct ndpi_detection_module_struct *ndpi_str, if (NDPI_ENTROPY_ENCRYPTED_OR_RANDOM(flow->entropy) != 0) { ndpi_set_risk(ndpi_str, flow, NDPI_SUSPICIOUS_ENTROPY); } + + struct ndpi_icmphdr * const icmphdr = (struct ndpi_icmphdr *)packet->payload; + u_int16_t chksm = ndpi_calculate_icmp4_checksum(packet->payload, packet->payload_packet_len); + if (icmphdr->checksum != chksm) { + ndpi_set_risk(ndpi_str, flow, NDPI_MALFORMED_PACKET); + } } } } diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c index 8cbc2e2df95..26bd348cb78 100644 --- a/src/lib/ndpi_utils.c +++ b/src/lib/ndpi_utils.c @@ -2295,6 +2295,33 @@ float ndpi_entropy(u_int8_t const * const buf, size_t len) { return entropy; } +/* ******************************************************************** */ + +u_int16_t ndpi_calculate_icmp4_checksum(u_int8_t const * const buf, size_t len) { + u_int16_t const * sbuf = (u_int16_t *)buf; + u_int32_t checksum = 0; + + /* + * The first two bytes of the icmp header are required. + * The next two bytes is the checksum, which we want to ignore. + */ + checksum += *sbuf++; len -= 2; /* icmp->type, icmp->code */ + sbuf++; len -= 2; /* icmp->checksum */ + + for (; len > 1; len -= 2) { + checksum += *sbuf++; + } + + if (len == 1) { + checksum += *(u_int8_t *)sbuf; + } + + checksum = (checksum >> 16) + (checksum & 0xFFFF); + checksum += (checksum >> 16); + + return ~checksum; +} + /* ******************************************* */ char* ndpi_get_flow_name(struct ndpi_flow_struct *flow) { diff --git a/tests/pcap/icmp-tunnel.pcap b/tests/pcap/icmp-tunnel.pcap new file mode 100644 index 0000000000000000000000000000000000000000..1d2338e93dd4c3c065741c4e486f88983bf65c5c GIT binary patch literal 211208 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 O$5GM)dteVw?C}p8`i~_5 literal 0 HcmV?d00001 diff --git a/tests/result/icmp-tunnel.pcap.out b/tests/result/icmp-tunnel.pcap.out new file mode 100644 index 00000000000..d879183bb39 --- /dev/null +++ b/tests/result/icmp-tunnel.pcap.out @@ -0,0 +1,8 @@ +Guessed flow protos: 0 + +DPI Packets (other): 1 (1.00 pkts/flow) +Confidence DPI : 1 (flows) + +ICMP 863 190810 1 + + 1 ICMP 192.168.154.131:0 <-> 192.168.154.132:0 [proto: 81/ICMP][ClearText][Confidence: DPI][cat: Network/14][448 pkts/98566 bytes <-> 415 pkts/92244 bytes][Goodput ratio: 81/81][1122.51 sec][bytes ratio: 0.033 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 0/0 2578/2731 145505/145505 9091/9494][Pkt Len c2s/s2c min/avg/max/stddev: 74/74 220/222 1075/1070 245/245][Risk: ** Malformed Packet **][Risk Score: 10][PLAIN TEXT (OpenSSH5)][Plen Bins: 0,32,24,24,7,3,3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]