nDPI/fuzz/fuzz_readerutils_workflow.cpp
Ivan Nardi 978ca1ba1a
New API to enable/disable protocols. Removed NDPI_LAST_IMPLEMENTED_PROTOCOL (#2894)
Change the API to enable/disable protocols: you can set that via the
standard `ndpi_set_config()` function, as every configuration
parameters. By default, all protocols are enabled.

Split the (local) context initialization into two phases:
* `ndpi_init_detection_module()`: generic part. It does not depend on the
configuration and on the protocols being enabled or not. It also
calculates the real number of internal protocols
* `ndpi_finalize_initialization()`: apply the configuration. All the
initialization stuff that depend on protocols being enabled or not
must be put here

This is the last step to have the protocols number fully calculated at
runtime

Remove a (now) useless fuzzer.

Important API changes:
* remove `NDPI_LAST_IMPLEMENTED_PROTOCOL` define
* remove `ndpi_get_num_internal_protocols()`. To get the number of
configured protocols (internal and custom) you must use
`ndpi_get_num_protocols()` after having called `ndpi_finalize_initialization()`
2025-06-23 11:24:18 +02:00

94 lines
2.6 KiB
C++

#include "ndpi_api.h"
#include "fuzz_common_code.h"
#include "reader_util.h"
#include <stdint.h>
#include <stdio.h>
#include "fuzzer/FuzzedDataProvider.h"
extern u_int8_t enable_doh_dot_detection;
u_int8_t enable_payload_analyzer = 0;
u_int8_t enable_flow_stats = 0;
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 */;
int malloc_size_stats = 0;
FILE *fingerprint_fp = NULL;
bool do_load_lists = false;
char *addr_dump_path = NULL;
int monitoring_enabled = 0;
char *protocolsDirPath = (char *)"./lists/protocols/";
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
FuzzedDataProvider fuzzed_data(data, size);
ndpi_workflow *w;
struct ndpi_global_context *g_ctx;
struct ndpi_workflow_prefs prefs;
pcap_t *pcap_handle;
ndpi_serialization_format serialization_format;
ndpi_risk flow_risk;
struct ndpi_flow_info *flow = NULL; /* unused */
const u_char *pkt;
struct pcap_pkthdr *header;
int r;
char errbuf[PCAP_ERRBUF_SIZE];
FILE *fd;
/* Data structure: 8 bytes header for random values + pcap file */
if(size < 8)
return 0;
/* To allow memory allocation failures */
fuzz_set_alloc_callbacks_and_seed(size);
prefs.decode_tunnels = fuzzed_data.ConsumeBool();
prefs.quiet_mode = fuzzed_data.ConsumeBool();
prefs.ignore_vlanid = fuzzed_data.ConsumeBool();
prefs.num_roots = fuzzed_data.ConsumeIntegral<u_int8_t>();
if(prefs.num_roots == 0)
prefs.num_roots = 1;
prefs.max_ndpi_flows = fuzzed_data.ConsumeIntegral<u_int8_t>();
serialization_format = static_cast<ndpi_serialization_format>(fuzzed_data.ConsumeIntegralInRange(1, 4));
/* byte8 is still unused */
enable_doh_dot_detection = 1;
fd = buffer_to_file(data + 8, size - 8);
if(fd == NULL) {
return 0;
}
pcap_handle = pcap_fopen_offline(fd, errbuf);
if(pcap_handle == NULL) {
fclose(fd);
return 0;
}
if(ndpi_is_datalink_supported(pcap_datalink(pcap_handle)) == 0) {
pcap_close(pcap_handle);
return 0;
}
g_ctx = ndpi_global_init();
w = ndpi_workflow_init(&prefs, pcap_handle, 1, serialization_format, g_ctx);
if(w) {
ndpi_finalize_initialization(w->ndpi_struct);
header = NULL;
r = pcap_next_ex(pcap_handle, &header, &pkt);
while (r > 0) {
ndpi_workflow_process_packet(w, header, pkt, &flow_risk, &flow);
r = pcap_next_ex(pcap_handle, &header, &pkt);
}
ndpi_workflow_free(w);
}
pcap_close(pcap_handle);
ndpi_global_deinit(g_ctx);
return 0;
}