From abfe157838e0228339f960cf4a7c66817cddfbe2 Mon Sep 17 00:00:00 2001 From: Nardi Ivan Date: Tue, 18 Apr 2023 11:36:21 +0200 Subject: [PATCH] Add an heuristic to detect/ignore some anomalous TCP ACK packets In some networks, there are some anomalous TCP flows where the smallest ACK packets have some kind of zero padding. It looks like the IP and TCP headers in those frames wrongly consider the 0x00 Ethernet padding bytes as part of the TCP payload. While this kind of packets is perfectly valid per-se, in some conditions they might be treated by the TCP reassembler logic as (partial) overlaps, deceiving the classification engine. Add an heuristic to detect these packets and to ignore them, allowing correct detection/classification. This heuristic is configurable. Default value: * in the library, it is disabled * in `ndpiReader` and in the fuzzers, it is enabled (to ease testing) Credit to @vel21ripn for the initial patch. Close #1946 --- example/ndpiReader.c | 2 +- fuzz/fuzz_ndpi_reader.c | 2 +- src/include/ndpi_typedefs.h | 13 +++++++ src/lib/ndpi_main.c | 22 ++++++++++- .../pcap/heuristic_tcp_ack_payload.pcap | Bin 0 -> 68688 bytes .../result/heuristic_tcp_ack_payload.pcap.out | 36 ++++++++++++++++++ 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 tests/cfgs/default/pcap/heuristic_tcp_ack_payload.pcap create mode 100644 tests/cfgs/default/result/heuristic_tcp_ack_payload.pcap.out diff --git a/example/ndpiReader.c b/example/ndpiReader.c index 05f362ce909..0b7d5aa5eec 100644 --- a/example/ndpiReader.c +++ b/example/ndpiReader.c @@ -98,7 +98,7 @@ char *_debug_protocols = NULL; char *_disabled_protocols = NULL; int aggressiveness[NDPI_MAX_SUPPORTED_PROTOCOLS]; static u_int8_t stats_flag = 0; -ndpi_init_prefs init_prefs = ndpi_no_prefs; +ndpi_init_prefs init_prefs = ndpi_no_prefs | ndpi_enable_tcp_ack_payload_heuristic; u_int8_t human_readeable_string_len = 5; u_int8_t max_num_udp_dissected_pkts = 24 /* 8 is enough for most protocols, Signal and SnapchatCall require more */, max_num_tcp_dissected_pkts = 80 /* due to telnet */; static u_int32_t pcap_analysis_duration = (u_int32_t)-1; diff --git a/fuzz/fuzz_ndpi_reader.c b/fuzz/fuzz_ndpi_reader.c index 252503d630b..42c72d573b1 100644 --- a/fuzz/fuzz_ndpi_reader.c +++ b/fuzz/fuzz_ndpi_reader.c @@ -18,7 +18,7 @@ u_int8_t enable_protocol_guess = 1, enable_payload_analyzer = 0; u_int8_t enable_flow_stats = 1; u_int8_t human_readeable_string_len = 5; u_int8_t max_num_udp_dissected_pkts = 16 /* 8 is enough for most protocols, Signal requires more */, max_num_tcp_dissected_pkts = 80 /* due to telnet */; -ndpi_init_prefs init_prefs = ndpi_track_flow_payload | ndpi_enable_ja3_plus; +ndpi_init_prefs init_prefs = ndpi_track_flow_payload | ndpi_enable_ja3_plus | ndpi_enable_tcp_ack_payload_heuristic; int enable_malloc_bins = 1; int malloc_size_stats = 0; int max_malloc_bins = 0; diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index d3ccd208cc4..2e8c76d2601 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -1273,6 +1273,8 @@ struct ndpi_detection_module_struct { u_int32_t aggressiveness_ookla; + int tcp_ack_paylod_heuristic; + u_int16_t ndpi_to_user_proto_id[NDPI_MAX_NUM_CUSTOM_PROTOCOLS]; /* custom protocolId mapping */ ndpi_proto_defaults_t proto_defaults[NDPI_MAX_SUPPORTED_PROTOCOLS+NDPI_MAX_NUM_CUSTOM_PROTOCOLS]; @@ -1691,6 +1693,17 @@ typedef enum { ndpi_dont_init_risk_ptree = (1 << 14), ndpi_dont_load_cachefly_list = (1 << 15), ndpi_track_flow_payload = (1 << 16), + /* In some networks, there are some anomalous TCP flows where + the smallest ACK packets have some kind of zero padding. + It looks like the IP and TCP headers in those frames wrongly consider the + 0x00 Ethernet padding bytes as part of the TCP payload. + While this kind of packets is perfectly valid per-se, in some conditions + they might be treated by the TCP reassembler logic as (partial) overlaps, + deceiving the classification engine. + Add an heuristic to detect these packets and to ignore them, allowing + correct detection/classification. + See #1946 for other details */ + ndpi_enable_tcp_ack_payload_heuristic = (1 << 17), } ndpi_prefs; typedef struct { diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c index 763538e9633..9713ebe0c4b 100644 --- a/src/lib/ndpi_main.c +++ b/src/lib/ndpi_main.c @@ -2951,6 +2951,9 @@ struct ndpi_detection_module_struct *ndpi_init_detection_module(ndpi_init_prefs ndpi_str->aggressiveness_ookla = NDPI_AGGRESSIVENESS_OOKLA_TLS; + if(prefs & ndpi_enable_tcp_ack_payload_heuristic) + ndpi_str->tcp_ack_paylod_heuristic = 1; + for(i = 0; i < NUM_CUSTOM_CATEGORIES; i++) ndpi_snprintf(ndpi_str->custom_category_labels[i], CUSTOM_CATEGORY_LABEL_LEN, "User custom category %u", (unsigned int) (i + 1)); @@ -5492,6 +5495,20 @@ static u_int8_t ndpi_is_multi_or_broadcast(struct ndpi_packet_struct *packet) { /* ************************************************ */ +static int tcp_ack_padding(struct ndpi_packet_struct *packet) { + const struct ndpi_tcphdr *tcph = packet->tcp; + if(tcph && tcph->ack && !tcph->psh && + packet->payload_packet_len < 8 && + packet->payload_packet_len > 1 /* To avoid TCP keep-alives */) { + int i; + for(i = 0; i < packet->payload_packet_len; i++) + if(packet->payload[i] != 0) + return 0; + return 1; + } + return 0; +} + void ndpi_connection_tracking(struct ndpi_detection_module_struct *ndpi_str, struct ndpi_flow_struct *flow) { if(!flow) { @@ -5580,7 +5597,10 @@ void ndpi_connection_tracking(struct ndpi_detection_module_struct *ndpi_str, } } - if(flow->next_tcp_seq_nr[0] == 0 || flow->next_tcp_seq_nr[1] == 0 || + if(ndpi_str->tcp_ack_paylod_heuristic && tcp_ack_padding(packet)) { + NDPI_LOG_DBG2(ndpi_str, "TCP ACK with zero padding. Ignoring\n"); + packet->tcp_retransmission = 1; + } else if(flow->next_tcp_seq_nr[0] == 0 || flow->next_tcp_seq_nr[1] == 0 || (tcph->syn && flow->packet_counter == 0)) { /* initialize tcp sequence counters */ /* the ack flag needs to be set to get valid sequence numbers from the other diff --git a/tests/cfgs/default/pcap/heuristic_tcp_ack_payload.pcap b/tests/cfgs/default/pcap/heuristic_tcp_ack_payload.pcap new file mode 100644 index 0000000000000000000000000000000000000000..0aaf81ce534a39f2e27f3ceeb08c11f52fe5a5f7 GIT binary patch literal 68688 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 literal 0 HcmV?d00001 diff --git a/tests/cfgs/default/result/heuristic_tcp_ack_payload.pcap.out b/tests/cfgs/default/result/heuristic_tcp_ack_payload.pcap.out new file mode 100644 index 00000000000..7e8fff675e5 --- /dev/null +++ b/tests/cfgs/default/result/heuristic_tcp_ack_payload.pcap.out @@ -0,0 +1,36 @@ +Guessed flow protos: 0 + +DPI Packets (TCP): 41 (10.25 pkts/flow) +Confidence DPI : 4 (flows) +Num dissector calls: 15 (3.75 diss/flow) +LRU cache ookla: 0/0/0 (insert/search/found) +LRU cache bittorrent: 0/0/0 (insert/search/found) +LRU cache zoom: 0/0/0 (insert/search/found) +LRU cache stun: 0/0/0 (insert/search/found) +LRU cache tls_cert: 0/6/0 (insert/search/found) +LRU cache mining: 0/0/0 (insert/search/found) +LRU cache msteams: 0/0/0 (insert/search/found) +LRU cache stun_zoom: 0/0/0 (insert/search/found) +Automa host: 8/1 (search/found) +Automa domain: 8/0 (search/found) +Automa tls cert: 2/0 (search/found) +Automa risk mask: 0/0 (search/found) +Automa common alpns: 6/6 (search/found) +Patricia risk mask: 8/0 (search/found) +Patricia risk: 8/0 (search/found) +Patricia protocols: 6/2 (search/found) + +TLS 160 63162 3 +WindowsUpdate 19 2638 1 + +JA3 Host Stats: + IP Address # JA3C + 1 194.226.199.103 1 + 2 194.226.199.21 1 + 3 194.226.199.61 1 + + + 1 TCP 194.226.199.61:27453 <-> 35.241.9.150:443 [proto: 91/TLS][IP: 284/GoogleCloud][Encrypted][Confidence: DPI][DPI packets: 8][cat: Web/5][36 pkts/3477 bytes <-> 42 pkts/37330 bytes][Goodput ratio: 44/94][171.42 sec][Hostname/SNI: firefox.settings.services.mozilla.com][(Advertised) ALPNs: h2;http/1.1][(Negotiated) ALPN: h2][bytes ratio: -0.830 (Download)][IAT c2s/s2c min/avg/max/stddev: 0/0 4196/3653 58250/58245 14929/14067][Pkt Len c2s/s2c min/avg/max/stddev: 56/60 97/889 375/2878 73/1070][TLSv1.2][JA3C: fb0aa01abe9d8e4037eb3473ca6e2dca][ServerNames: firefox.settings.services.mozilla.com,main-2-cdn.prod.kinto.prod.cloudops.mozgcp.net][JA3S: 9d9ce860f1b1cbef07b019450cb368d8][Issuer: C=US, O=Let's Encrypt, CN=R3][Subject: CN=main-2-cdn.prod.kinto.prod.cloudops.mozgcp.net][Certificate SHA-1: 30:0D:22:77:6E:DA:4E:99:3E:AF:8A:D0:5C:7D:97:51:8B:E6:22:11][Firefox][Validity: 2023-04-04 08:33:24 - 2023-07-03 08:33:23][Cipher: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256][Plen Bins: 49,16,2,0,3,3,1,0,1,0,2,0,0,1,0,0,0,0,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,0,7,0,0,11] + 2 TCP 194.226.199.21:58155 <-> 52.18.127.189:443 [proto: 91/TLS][IP: 265/AmazonAWS][Encrypted][Confidence: DPI][DPI packets: 13][cat: Web/5][28 pkts/6789 bytes <-> 35 pkts/8995 bytes][Goodput ratio: 78/79][130.64 sec][Hostname/SNI: bitrix.info][(Advertised) ALPNs: h2;http/1.1][(Negotiated) ALPN: h2][TLS Supported Versions: GREASE;TLSv1.3;TLSv1.2][bytes ratio: -0.140 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 0/0 5498/4834 45102/45058 12717/11564][Pkt Len c2s/s2c min/avg/max/stddev: 56/60 242/257 1547/2974 352/535][TLSv1.2][JA3C: ab205d804ecf934209c2a1bb94f817e0][JA3S: bfc90d56141386ee83b56cda231cccfc][Chrome][Cipher: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256][Plen Bins: 46,22,6,6,0,0,0,0,0,0,1,0,6,0,1,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1] + 3 TCP 194.226.199.103:62580 <-> 217.69.139.59:443 [proto: 91/TLS][IP: 0/Unknown][Encrypted][Confidence: DPI][DPI packets: 8][cat: Web/5][11 pkts/1346 bytes <-> 8 pkts/5225 bytes][Goodput ratio: 55/92][7.28 sec][Hostname/SNI: portal.mail.ru][(Advertised) ALPNs: h2;http/1.1][(Negotiated) ALPN: http/1.1][TLS Supported Versions: TLSv1.3;TLSv1.2][bytes ratio: -0.590 (Download)][IAT c2s/s2c min/avg/max/stddev: 0/0 808/58 5455/213 1711/90][Pkt Len c2s/s2c min/avg/max/stddev: 56/60 122/653 623/2897 162/957][TLSv1.2][JA3C: e669667efb41c36f714c309243f41ca7][ServerNames: *.mail.ru,mail.ru][JA3S: 2b33c1374db4ddf06942f92373c0b54b][Issuer: C=BE, O=GlobalSign nv-sa, CN=GlobalSign RSA OV SSL CA 2018][Subject: C=RU, ST=Moscow, L=Moscow, O=VK LLC, CN=*.mail.ru][Certificate SHA-1: 9F:A2:43:EA:AA:62:15:13:44:0D:15:75:17:47:4C:6B:E5:8E:10:1E][Firefox][Validity: 2022-10-20 09:52:31 - 2023-11-21 09:52:30][Cipher: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384][Plen Bins: 68,0,0,5,0,0,0,0,11,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,5] + 4 TCP 194.226.199.226:34101 <-> 8.247.226.126:80 [proto: 7.147/HTTP.WindowsUpdate][IP: 0/Unknown][ClearText][Confidence: DPI][DPI packets: 12][cat: SoftwareUpdate/19][7 pkts/896 bytes <-> 12 pkts/1742 bytes][Goodput ratio: 56/62][0.04 sec][Hostname/SNI: 3.tlu.dl.delivery.mp.microsoft.com][bytes ratio: -0.321 (Download)][IAT c2s/s2c min/avg/max/stddev: 0/0 7/1 12/11 6/3][Pkt Len c2s/s2c min/avg/max/stddev: 56/60 128/145 550/1076 172/281][URL: 3.tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/b4f27514-1618-47a0-bcd4-5fcb469edb63?P1=1681888058&P2=404&P3=2&P4=VJ2Qv%2bUXzBGOULZmyshxlc8XXx4pLl7hoFcLgf1iS33rDGfm0tCVrTPvZN8tn8yWBSrA0idwdtOBFLQMjZCUkw%3d%3d][StatusCode: 0][User-Agent: Microsoft-Delivery-Optimization/10.0][PLAIN TEXT (GET /filestreamingservice/files)][Plen Bins: 89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]