diff --git a/example/ndpiReader.c b/example/ndpiReader.c index 452c0f5ae15..6ac9948023d 100644 --- a/example/ndpiReader.c +++ b/example/ndpiReader.c @@ -253,7 +253,7 @@ static int dpdk_port_id = 0, dpdk_run_capture = 1; void test_lib(); /* Forward */ -extern void ndpi_report_payload_stats(); +extern void ndpi_report_payload_stats(int print); extern int parse_proto_name_list(char *str, NDPI_PROTOCOL_BITMASK *bitmask, int inverted_logic); /* ********************************** */ @@ -2746,7 +2746,7 @@ static void printFlowsStats() { FILE *out = results_file ? results_file : stdout; if(enable_payload_analyzer) - ndpi_report_payload_stats(); + ndpi_report_payload_stats(1); for(thread_id = 0; thread_id < num_threads; thread_id++) total_flows += ndpi_thread_info[thread_id].workflow->num_allocated_flows; diff --git a/example/reader_util.c b/example/reader_util.c index 678b454b76b..a39407fa86d 100644 --- a/example/reader_util.c +++ b/example/reader_util.c @@ -266,16 +266,17 @@ void print_payload_stat(struct payload_stats *p) { /* ***************************************************** */ -void ndpi_report_payload_stats() { +void ndpi_report_payload_stats(int print) { struct payload_stats *p, *tmp; u_int num = 0; - printf("\n\nPayload Analysis\n"); + if(print) + printf("\n\nPayload Analysis\n"); HASH_SORT(pstats, payload_stats_sort_asc); HASH_ITER(hh, pstats, p, tmp) { - if(num <= max_num_reported_top_payloads) + if(print && num <= max_num_reported_top_payloads) print_payload_stat(p); ndpi_free(p->pattern); diff --git a/fuzz/Makefile.am b/fuzz/Makefile.am index 08def2ff3e9..9a3e9968dd7 100644 --- a/fuzz/Makefile.am +++ b/fuzz/Makefile.am @@ -1,4 +1,4 @@ -bin_PROGRAMS = fuzz_process_packet fuzz_ndpi_reader fuzz_ndpi_reader_alloc_fail fuzz_quic_get_crypto_data fuzz_config fuzz_community_id fuzz_serialization fuzz_tls_certificate +bin_PROGRAMS = fuzz_process_packet fuzz_ndpi_reader fuzz_ndpi_reader_alloc_fail fuzz_ndpi_reader_payload_analyzer fuzz_quic_get_crypto_data fuzz_config fuzz_community_id fuzz_serialization fuzz_tls_certificate #Alghoritms bin_PROGRAMS += fuzz_alg_bins fuzz_alg_hll fuzz_alg_hw_rsi_outliers_da fuzz_alg_jitter fuzz_alg_ses_des fuzz_alg_crc32_md5 fuzz_alg_bytestream #Data structures @@ -45,6 +45,19 @@ fuzz_ndpi_reader_alloc_fail_LINK=$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAG $(LIBTOOLFLAGS) --mode=link $(CXX) @NDPI_CFLAGS@ $(AM_CXXFLAGS) $(CXXFLAGS) \ $(fuzz_ndpi_reader_alloc_fail_LDFLAGS) @NDPI_LDFLAGS@ $(LDFLAGS) -o $@ +fuzz_ndpi_reader_payload_analyzer_SOURCES = fuzz_ndpi_reader.c ../example/reader_util.c +fuzz_ndpi_reader_payload_analyzer_CFLAGS = -I../example/ @NDPI_CFLAGS@ $(CXXFLAGS) -DENABLE_PAYLOAD_ANALYZER +fuzz_ndpi_reader_payload_analyzer_LDADD = ../src/lib/libndpi.a $(ADDITIONAL_LIBS) +fuzz_ndpi_reader_payload_analyzer_LDFLAGS = $(PCAP_LIB) $(LIBS) +if HAS_FUZZLDFLAGS +fuzz_ndpi_reader_payload_analyzer_CFLAGS += $(LIB_FUZZING_ENGINE) +fuzz_ndpi_reader_payload_analyzer_LDFLAGS += $(LIB_FUZZING_ENGINE) +endif +# force usage of CXX for linker +fuzz_ndpi_reader_payload_analyzer_LINK=$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXX) @NDPI_CFLAGS@ $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(fuzz_ndpi_reader_payload_analyzer_LDFLAGS) @NDPI_LDFLAGS@ $(LDFLAGS) -o $@ + fuzz_quic_get_crypto_data_SOURCES = fuzz_quic_get_crypto_data.c fuzz_common_code.c fuzz_quic_get_crypto_data_CFLAGS = @NDPI_CFLAGS@ $(CXXFLAGS) fuzz_quic_get_crypto_data_LDADD = ../src/lib/libndpi.a $(ADDITIONAL_LIBS) @@ -315,6 +328,9 @@ fuzz_ndpi_reader_seed_corpus.zip: $(testpcaps) fuzz_ndpi_reader_alloc_fail_seed_corpus.zip: $(testpcaps) zip -j fuzz_ndpi_reader_alloc_fail_seed_corpus.zip $(testpcaps) +fuzz_ndpi_reader_payload_analyzer_seed_corpus.zip: $(testpcaps) + zip -j fuzz_ndpi_reader_payload_analyzer_seed_corpus.zip $(testpcaps) + files_corpus_fuzz_quic_get_crypto_data := $(wildcard corpus/fuzz_quic_get_crypto_data/*) fuzz_quic_get_crypto_data_seed_corpus.zip: $(files_corpus_fuzz_quic_get_crypto_data) @@ -405,7 +421,7 @@ files_corpus_fuzz_tls_certificate := $(wildcard corpus/fuzz_tls_certificate/*) fuzz_tls_certificate_seed_corpus.zip: $(files_corpus_fuzz_tls_certificate) zip -j fuzz_tls_certificate_seed_corpus.zip $(files_corpus_fuzz_tls_certificate) -corpus: fuzz_ndpi_reader_seed_corpus.zip fuzz_ndpi_reader_alloc_fail_seed_corpus.zip fuzz_quic_get_crypto_data_seed_corpus.zip fuzz_config_seed_corpus.zip fuzz_ds_patricia_seed_corpus.zip fuzz_ds_ahocorasick_seed_corpus.zip fuzz_alg_ses_des_seed_corpus.zip fuzz_alg_hw_rsi_outliers_da_seed_corpus.zip fuzz_alg_bins_seed_corpus.zip fuzz_alg_hll_seed_corpus.zip fuzz_alg_jitter_seed_corpus.zip fuzz_ds_libcache_seed_corpus.zip fuzz_community_id_seed_corpus.zip fuzz_ds_tree_seed_corpus.zip fuzz_serialization_seed_corpus.zip fuzz_ds_ptree_seed_corpus.zip fuzz_alg_crc32_md5_seed_corpus.zip fuzz_alg_bytestream_seed_corpus.zip fuzz_libinjection_seed_corpus.zip fuzz_tls_certificate_seed_corpus.zip +corpus: fuzz_ndpi_reader_seed_corpus.zip fuzz_ndpi_reader_alloc_fail_seed_corpus.zip fuzz_ndpi_reader_payload_analyzer_seed_corpus.zip fuzz_quic_get_crypto_data_seed_corpus.zip fuzz_config_seed_corpus.zip fuzz_ds_patricia_seed_corpus.zip fuzz_ds_ahocorasick_seed_corpus.zip fuzz_alg_ses_des_seed_corpus.zip fuzz_alg_hw_rsi_outliers_da_seed_corpus.zip fuzz_alg_bins_seed_corpus.zip fuzz_alg_hll_seed_corpus.zip fuzz_alg_jitter_seed_corpus.zip fuzz_ds_libcache_seed_corpus.zip fuzz_community_id_seed_corpus.zip fuzz_ds_tree_seed_corpus.zip fuzz_serialization_seed_corpus.zip fuzz_ds_ptree_seed_corpus.zip fuzz_alg_crc32_md5_seed_corpus.zip fuzz_alg_bytestream_seed_corpus.zip fuzz_libinjection_seed_corpus.zip fuzz_tls_certificate_seed_corpus.zip #Create dictionaries exactly as expected by oss-fuzz. #This way, if we need to change/update/add something, @@ -413,6 +429,7 @@ corpus: fuzz_ndpi_reader_seed_corpus.zip fuzz_ndpi_reader_alloc_fail_seed_corpus dictionaries: cp dictionary.dict fuzz_ndpi_reader.dict cp dictionary.dict fuzz_ndpi_reader_alloc_fail.dict + cp dictionary.dict fuzz_ndpi_reader_payload_analyzer.dict cp dictionary.dict fuzz_process_packet.dict cp dictionary_tls_certificate.dict fuzz_tls_certificate.dict diff --git a/fuzz/fuzz_ndpi_reader.c b/fuzz/fuzz_ndpi_reader.c index 5f08220bcbc..252503d630b 100644 --- a/fuzz/fuzz_ndpi_reader.c +++ b/fuzz/fuzz_ndpi_reader.c @@ -19,11 +19,13 @@ 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; -int enable_malloc_bins = 0; +int enable_malloc_bins = 1; int malloc_size_stats = 0; int max_malloc_bins = 0; struct ndpi_bin malloc_bins; /* unused */ +extern void ndpi_report_payload_stats(int print); + #ifdef CRYPT_FORCE_NO_AESNI extern int force_no_aesni; #endif @@ -91,6 +93,10 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { #ifdef CRYPT_FORCE_NO_AESNI force_no_aesni = 1; #endif + +#ifdef ENABLE_PAYLOAD_ANALYZER + enable_payload_analyzer = 1; +#endif } #ifdef ENABLE_MEM_ALLOC_FAILURES @@ -144,6 +150,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { for(i = 0; i < workflow->prefs.num_roots; i++) ndpi_tdestroy(workflow->ndpi_flows_root[i], ndpi_flow_info_freer); ndpi_free(workflow->ndpi_flows_root); + /* Free payload analyzer data, without printing */ + if(enable_payload_analyzer) + ndpi_report_payload_stats(0); return 0; }