From 34fb3e7453515b91f159350cc607508405708629 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Wed, 3 Aug 2022 11:31:19 -0700 Subject: [PATCH 1/6] Rename fuzzers/README to README.rst so github renders it --- src/fuzzers/{README => README.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/fuzzers/{README => README.rst} (100%) diff --git a/src/fuzzers/README b/src/fuzzers/README.rst similarity index 100% rename from src/fuzzers/README rename to src/fuzzers/README.rst From d54103c6fa7a0c709989eeb5ff9480b01d02d1f9 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Wed, 3 Aug 2022 11:41:14 -0700 Subject: [PATCH 2/6] Add section to fuzzer README about generating corpus from pcaps --- src/fuzzers/README.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/fuzzers/README.rst b/src/fuzzers/README.rst index 1d6857ff1b..3628d1b7ac 100644 --- a/src/fuzzers/README.rst +++ b/src/fuzzers/README.rst @@ -23,6 +23,9 @@ First configure and build for fuzzing (with libFuzzer) and code coverage:: variable may be changed to use another flag or direct path to fuzzing engine library to link against. +Text/Dictionary-based Corpus +```````````````````````````` + Now start fuzzing to generate an initial corpus (this uses the POP3 fuzzer as an example):: @@ -54,6 +57,24 @@ commit):: zip -j ../src/fuzzers/pop3-corpus.zip min-corpus/* +pcap-based Corpus +````````````````` + +A corpus can also be generated from representative pcp files using the +``pcap-to-pkt`` application from pcap_simplify_. The fuzzers only handle a +single connection at a time, so pcap files with multiple connections will +need to be split using ``PcapSplitter`` from PcapPlusPlus_ or something +similar. Once the file has been split, the individual connections can be +converted into separate pkt files. The ``http`` fuzzer is a good example +of a fuzzer using such files. The corpus for that fuzzer was initially +generated from a subset of the pcap files located in ``testing/btest/Traces/http``. + +.. _pcap_simplify: https://github.com/JustinAzoff/pcap_simplify +.. _PcapPlusPlus: https://github.com/seladb/PcapPlusPlus + +The converted pkt files can then be zipped as in the text-based section +above. + Example Build: Run Standalone Fuzz Targets ------------------------------------------ From 0b8615942dda2a5e674565d8a8900505db31e099 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Wed, 3 Aug 2022 12:42:34 -0700 Subject: [PATCH 3/6] Add http, ftp, imap, and smtp fuzzers and corpora --- src/fuzzers/CMakeLists.txt | 4 ++ src/fuzzers/ftp-corpus.zip | Bin 0 -> 4069 bytes src/fuzzers/ftp-fuzzer.cc | 78 ++++++++++++++++++++++++++++++++++++ src/fuzzers/http-corpus.zip | Bin 0 -> 93029 bytes src/fuzzers/http-fuzzer.cc | 78 ++++++++++++++++++++++++++++++++++++ src/fuzzers/imap-corpus.zip | Bin 0 -> 4853 bytes src/fuzzers/imap-fuzzer.cc | 78 ++++++++++++++++++++++++++++++++++++ src/fuzzers/smtp-corpus.zip | Bin 0 -> 7975 bytes src/fuzzers/smtp-fuzzer.cc | 78 ++++++++++++++++++++++++++++++++++++ 9 files changed, 316 insertions(+) create mode 100644 src/fuzzers/ftp-corpus.zip create mode 100644 src/fuzzers/ftp-fuzzer.cc create mode 100644 src/fuzzers/http-corpus.zip create mode 100644 src/fuzzers/http-fuzzer.cc create mode 100644 src/fuzzers/imap-corpus.zip create mode 100644 src/fuzzers/imap-fuzzer.cc create mode 100644 src/fuzzers/smtp-corpus.zip create mode 100644 src/fuzzers/smtp-fuzzer.cc diff --git a/src/fuzzers/CMakeLists.txt b/src/fuzzers/CMakeLists.txt index 0b23958b3a..4f23a282be 100644 --- a/src/fuzzers/CMakeLists.txt +++ b/src/fuzzers/CMakeLists.txt @@ -81,3 +81,7 @@ target_link_libraries(zeek_fuzzer_shared add_fuzz_target(dns) add_fuzz_target(pop3) add_fuzz_target(packet) +add_fuzz_target(http) +add_fuzz_target(imap) +add_fuzz_target(smtp) +add_fuzz_target(ftp) diff --git a/src/fuzzers/ftp-corpus.zip b/src/fuzzers/ftp-corpus.zip new file mode 100644 index 0000000000000000000000000000000000000000..21c3271b6147f189958665d25bc7aa71a564a99d GIT binary patch literal 4069 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 literal 0 HcmV?d00001 diff --git a/src/fuzzers/ftp-fuzzer.cc b/src/fuzzers/ftp-fuzzer.cc new file mode 100644 index 0000000000..27bef5dd8a --- /dev/null +++ b/src/fuzzers/ftp-fuzzer.cc @@ -0,0 +1,78 @@ +#include + +#include "zeek/Conn.h" +#include "zeek/RunState.h" +#include "zeek/analyzer/Analyzer.h" +#include "zeek/analyzer/Manager.h" +#include "zeek/analyzer/protocol/pia/PIA.h" +#include "zeek/analyzer/protocol/tcp/TCP.h" +#include "zeek/fuzzers/FuzzBuffer.h" +#include "zeek/fuzzers/fuzzer-setup.h" +#include "zeek/packet_analysis/protocol/tcp/TCPSessionAdapter.h" +#include "zeek/session/Manager.h" + +static constexpr auto ZEEK_FUZZ_ANALYZER = "ftp"; + +static zeek::Connection* add_connection() + { + static constexpr double network_time_start = 1439471031; + zeek::run_state::detail::update_network_time(network_time_start); + + zeek::Packet p; + zeek::ConnTuple conn_id; + conn_id.src_addr = zeek::IPAddr("1.2.3.4"); + conn_id.dst_addr = zeek::IPAddr("5.6.7.8"); + conn_id.src_port = htons(23132); + conn_id.dst_port = htons(80); + conn_id.is_one_way = false; + conn_id.proto = TRANSPORT_TCP; + zeek::detail::ConnKey key(conn_id); + zeek::Connection* conn = new zeek::Connection(key, network_time_start, &conn_id, 1, &p); + conn->SetTransport(TRANSPORT_TCP); + zeek::session_mgr->Insert(conn); + return conn; + } + +static zeek::analyzer::Analyzer* add_analyzer(zeek::Connection* conn) + { + auto* tcp = new zeek::packet_analysis::TCP::TCPSessionAdapter(conn); + auto* pia = new zeek::analyzer::pia::PIA_TCP(conn); + auto a = zeek::analyzer_mgr->InstantiateAnalyzer(ZEEK_FUZZ_ANALYZER, conn); + tcp->AddChildAnalyzer(a); + tcp->AddChildAnalyzer(pia->AsAnalyzer()); + conn->SetSessionAdapter(tcp, pia); + return a; + } + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) + { + zeek::detail::FuzzBuffer fb{data, size}; + + if ( ! fb.Valid() ) + return 0; + + auto conn = add_connection(); + auto a = add_analyzer(conn); + + for ( ;; ) + { + auto chunk = fb.Next(); + + if ( ! chunk ) + break; + + try + { + a->DeliverStream(chunk->size, chunk->data.get(), chunk->is_orig); + } + catch ( const binpac::Exception& e ) + { + } + + chunk = {}; + zeek::event_mgr.Drain(); + } + + zeek::detail::fuzzer_cleanup_one_input(); + return 0; + } diff --git a/src/fuzzers/http-corpus.zip b/src/fuzzers/http-corpus.zip new file mode 100644 index 0000000000000000000000000000000000000000..2b7a50eda35dd086d6f08804b0042a4548b4f633 GIT binary patch literal 93029 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 AS^xk5 literal 0 HcmV?d00001 diff --git a/src/fuzzers/http-fuzzer.cc b/src/fuzzers/http-fuzzer.cc new file mode 100644 index 0000000000..669c3cadf7 --- /dev/null +++ b/src/fuzzers/http-fuzzer.cc @@ -0,0 +1,78 @@ +#include + +#include "zeek/Conn.h" +#include "zeek/RunState.h" +#include "zeek/analyzer/Analyzer.h" +#include "zeek/analyzer/Manager.h" +#include "zeek/analyzer/protocol/pia/PIA.h" +#include "zeek/analyzer/protocol/tcp/TCP.h" +#include "zeek/fuzzers/FuzzBuffer.h" +#include "zeek/fuzzers/fuzzer-setup.h" +#include "zeek/packet_analysis/protocol/tcp/TCPSessionAdapter.h" +#include "zeek/session/Manager.h" + +static constexpr auto ZEEK_FUZZ_ANALYZER = "http"; + +static zeek::Connection* add_connection() + { + static constexpr double network_time_start = 1439471031; + zeek::run_state::detail::update_network_time(network_time_start); + + zeek::Packet p; + zeek::ConnTuple conn_id; + conn_id.src_addr = zeek::IPAddr("1.2.3.4"); + conn_id.dst_addr = zeek::IPAddr("5.6.7.8"); + conn_id.src_port = htons(23132); + conn_id.dst_port = htons(80); + conn_id.is_one_way = false; + conn_id.proto = TRANSPORT_TCP; + zeek::detail::ConnKey key(conn_id); + zeek::Connection* conn = new zeek::Connection(key, network_time_start, &conn_id, 1, &p); + conn->SetTransport(TRANSPORT_TCP); + zeek::session_mgr->Insert(conn); + return conn; + } + +static zeek::analyzer::Analyzer* add_analyzer(zeek::Connection* conn) + { + auto* tcp = new zeek::packet_analysis::TCP::TCPSessionAdapter(conn); + auto* pia = new zeek::analyzer::pia::PIA_TCP(conn); + auto a = zeek::analyzer_mgr->InstantiateAnalyzer(ZEEK_FUZZ_ANALYZER, conn); + tcp->AddChildAnalyzer(a); + tcp->AddChildAnalyzer(pia->AsAnalyzer()); + conn->SetSessionAdapter(tcp, pia); + return a; + } + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) + { + zeek::detail::FuzzBuffer fb{data, size}; + + if ( ! fb.Valid() ) + return 0; + + auto conn = add_connection(); + auto a = add_analyzer(conn); + + for ( ;; ) + { + auto chunk = fb.Next(); + + if ( ! chunk ) + break; + + try + { + a->DeliverStream(chunk->size, chunk->data.get(), chunk->is_orig); + } + catch ( const binpac::Exception& e ) + { + } + + chunk = {}; + zeek::event_mgr.Drain(); + } + + zeek::detail::fuzzer_cleanup_one_input(); + return 0; + } diff --git a/src/fuzzers/imap-corpus.zip b/src/fuzzers/imap-corpus.zip new file mode 100644 index 0000000000000000000000000000000000000000..b55f1fba9b016377bc41120849b70f025456712b GIT binary patch literal 4853 zcmbW5cQ71WzsFZuQ5LI2PxM8!-G~wqMDKR>Zdp?eP`ae=ggVkKj(aAe&vtz{laz0$e95E042cNkIYp4mC}|o zJpkZs3IH$yxB!nHJ9vsip-`BFC(6N7!qe5q)PxE^*08(b_~&`*M*|=sKOzAD{+qFF zz3DrlRjuURQr@?B315^%?NF#2CbGQ*MtFMqUE@h!`nI%m%ZM!Y5J`kO9Bo|&mkPG> z(8O`?LC}Z=GQ5@Ph;2(r#fI7WaL}FOoEFtpalBZ^Pf`!&@Qaaju&-X;K#7lYjvWmc zewlF^8WOhLkn2e;v~o3@Nl@+um(nWu^U5cwT@l!7m!=Z$NDgHJtBL4zuYbWfTcBP> z(zw2HyTc2^g73p5J8Mlk2i*NzHn%1kvh7CE$A8e5>lFCUoV@=&Sb--7*Bg!G?Yr-; zn4o>(@b(FV0$4NujF7YvGojXO|_&m zGP$;BL$iXo*9Mml(ImC+7_!@XJ}(9DlNWRcI5DQ=R>~gUc?1Ziu;?!8|~azWz!Kk8M~U(kVV*;Q2~te*FrMFuQU4|d+^Rili8aW zYCm-6hF-S+p|M@BQ-eSaiS1j>GnLibFx|93M`RBgFU zW<%kGux!YJ^aSOLXKyS^K|X6Er6s~o&O0wRJZIhoEj2b?9Q~BlvfJ@GjG8H%_glz5 zw0jFY_g%%sjpve$+~9FPO{KXzT6_;A)MPty2H)n1IO35#9vk89w5vaXMH`B>WCqFq zf#_6e9s2ri6A{r^yhCegNX|QYRN)<7^r*E|UBuqRse8{qTWOpvrd!lXA;Uuve2gRL zUMebK_?EmH8s)IA_!oP+$BjqW3*V7VE>H9xR|s@Gp1Om50VejPaKq~5)mDlfSL)L$uG=JbdZ zD9PsJo1H=`eiETvAKhIZhNPWs?hVZLUpXbAwa>B$!x@{Zf2MjE-KANz9FqWV5@S*4 z)jfQfOF4_(c$N4oBz42purPqil>1I-^t!z$b!2{_)4F}4^WivAa%b=|DluXBGEN1$ z$2a->q5Kg>o0o`u*Z?Wc?8X>l7Ue98TO6aATwW1@M6n`rrWq-gi@37lmN8OBlgZ>c zHE=ei(0+vNbF&m`b<19xYboLTZeWIyt7>WHEGC|*;K7RggU=0ywzv#HLA7kgaWJ8f)gE?QGnI7Pgc(KlZkrG46S9 zD1H`ZXL78^u$oFi@Iy7mtq>-S+4*kLQgOuSU znong8`$6x(1;W>#beEOSNqe$65z0%Wj)-sxdEee92)l?YzUw=$zZ4}W%k&GrESbDd zpc((-olaLqmaiy<^<1|d2%W~X+`}H~;<+tkR^C8Pu!G1f0u5V$L>5w`L?=hORzZlV zPuJaszOp-$RSBDZzpR#?17fYeipPDw zg}1&+qA668kk@v#3R*hDEJw*;y~2#c-`rcM8|LV|Z;CX}mef)ZS~5i}UpSE)CD&j3 zz~ASqb?oAVmU5}^wD2RRbB?=;cjLNo@}MKnY7C=#JAr1TNVD<%7Vn|z8bjCqx;?yo zmmm^SD}1r45b}|shi4oki>ji5eZ|T3#9viWwy>aKE?~)F^f7mejWUP`fppub36=US z#{-<-*w}s3^{?Qg@<&KSf3JODO;dZcMtQq|g7$rj&A@V_g!V{@r^Jns*bLUIm= z!o^BB`l=)Y%d_og#tNU-dtk%4s6e0P60yb;c-Xo={&uFm5pxiiJXCi$6F zcU^5Lbj7q}w3L+=@w0x_)-yHod7Y-!PXZ9f2YpnEu()WmH{Vsqb&FK>W^aBbd8+X3 z&HSeH&!;~$DZCr%)*A={a1MFw&Wx`8*%tWnMkeo*-hxn0L^3vf+Yk*`F@U^!!NBa+ z^&%=01q@?7F>~{AHJou)Vtc|6LbuA2H73W3LRmm4CNy#%=_t^;;;mRJI80y4{a8-~ zvI?&DDw9cs>_y#Tzd1MI6PfIsXWExX{G`>K%0DW=tDUUC?x~-aO%C$B_@!el|5&5D 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 + +#include "zeek/Conn.h" +#include "zeek/RunState.h" +#include "zeek/analyzer/Analyzer.h" +#include "zeek/analyzer/Manager.h" +#include "zeek/analyzer/protocol/pia/PIA.h" +#include "zeek/analyzer/protocol/tcp/TCP.h" +#include "zeek/fuzzers/FuzzBuffer.h" +#include "zeek/fuzzers/fuzzer-setup.h" +#include "zeek/packet_analysis/protocol/tcp/TCPSessionAdapter.h" +#include "zeek/session/Manager.h" + +static constexpr auto ZEEK_FUZZ_ANALYZER = "imap"; + +static zeek::Connection* add_connection() + { + static constexpr double network_time_start = 1439471031; + zeek::run_state::detail::update_network_time(network_time_start); + + zeek::Packet p; + zeek::ConnTuple conn_id; + conn_id.src_addr = zeek::IPAddr("1.2.3.4"); + conn_id.dst_addr = zeek::IPAddr("5.6.7.8"); + conn_id.src_port = htons(23132); + conn_id.dst_port = htons(80); + conn_id.is_one_way = false; + conn_id.proto = TRANSPORT_TCP; + zeek::detail::ConnKey key(conn_id); + zeek::Connection* conn = new zeek::Connection(key, network_time_start, &conn_id, 1, &p); + conn->SetTransport(TRANSPORT_TCP); + zeek::session_mgr->Insert(conn); + return conn; + } + +static zeek::analyzer::Analyzer* add_analyzer(zeek::Connection* conn) + { + auto* tcp = new zeek::packet_analysis::TCP::TCPSessionAdapter(conn); + auto* pia = new zeek::analyzer::pia::PIA_TCP(conn); + auto a = zeek::analyzer_mgr->InstantiateAnalyzer(ZEEK_FUZZ_ANALYZER, conn); + tcp->AddChildAnalyzer(a); + tcp->AddChildAnalyzer(pia->AsAnalyzer()); + conn->SetSessionAdapter(tcp, pia); + return a; + } + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) + { + zeek::detail::FuzzBuffer fb{data, size}; + + if ( ! fb.Valid() ) + return 0; + + auto conn = add_connection(); + auto a = add_analyzer(conn); + + for ( ;; ) + { + auto chunk = fb.Next(); + + if ( ! chunk ) + break; + + try + { + a->DeliverStream(chunk->size, chunk->data.get(), chunk->is_orig); + } + catch ( const binpac::Exception& e ) + { + } + + chunk = {}; + zeek::event_mgr.Drain(); + } + + zeek::detail::fuzzer_cleanup_one_input(); + return 0; + } diff --git a/src/fuzzers/smtp-corpus.zip b/src/fuzzers/smtp-corpus.zip new file mode 100644 index 0000000000000000000000000000000000000000..1d47fd877d33a4c49c9d060c41161580c22926cc GIT binary patch literal 7975 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 G5&a(ozXcos literal 0 HcmV?d00001 diff --git a/src/fuzzers/smtp-fuzzer.cc b/src/fuzzers/smtp-fuzzer.cc new file mode 100644 index 0000000000..378d27311c --- /dev/null +++ b/src/fuzzers/smtp-fuzzer.cc @@ -0,0 +1,78 @@ +#include + +#include "zeek/Conn.h" +#include "zeek/RunState.h" +#include "zeek/analyzer/Analyzer.h" +#include "zeek/analyzer/Manager.h" +#include "zeek/analyzer/protocol/pia/PIA.h" +#include "zeek/analyzer/protocol/tcp/TCP.h" +#include "zeek/fuzzers/FuzzBuffer.h" +#include "zeek/fuzzers/fuzzer-setup.h" +#include "zeek/packet_analysis/protocol/tcp/TCPSessionAdapter.h" +#include "zeek/session/Manager.h" + +static constexpr auto ZEEK_FUZZ_ANALYZER = "smtp"; + +static zeek::Connection* add_connection() + { + static constexpr double network_time_start = 1439471031; + zeek::run_state::detail::update_network_time(network_time_start); + + zeek::Packet p; + zeek::ConnTuple conn_id; + conn_id.src_addr = zeek::IPAddr("1.2.3.4"); + conn_id.dst_addr = zeek::IPAddr("5.6.7.8"); + conn_id.src_port = htons(23132); + conn_id.dst_port = htons(80); + conn_id.is_one_way = false; + conn_id.proto = TRANSPORT_TCP; + zeek::detail::ConnKey key(conn_id); + zeek::Connection* conn = new zeek::Connection(key, network_time_start, &conn_id, 1, &p); + conn->SetTransport(TRANSPORT_TCP); + zeek::session_mgr->Insert(conn); + return conn; + } + +static zeek::analyzer::Analyzer* add_analyzer(zeek::Connection* conn) + { + auto* tcp = new zeek::packet_analysis::TCP::TCPSessionAdapter(conn); + auto* pia = new zeek::analyzer::pia::PIA_TCP(conn); + auto a = zeek::analyzer_mgr->InstantiateAnalyzer(ZEEK_FUZZ_ANALYZER, conn); + tcp->AddChildAnalyzer(a); + tcp->AddChildAnalyzer(pia->AsAnalyzer()); + conn->SetSessionAdapter(tcp, pia); + return a; + } + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) + { + zeek::detail::FuzzBuffer fb{data, size}; + + if ( ! fb.Valid() ) + return 0; + + auto conn = add_connection(); + auto a = add_analyzer(conn); + + for ( ;; ) + { + auto chunk = fb.Next(); + + if ( ! chunk ) + break; + + try + { + a->DeliverStream(chunk->size, chunk->data.get(), chunk->is_orig); + } + catch ( const binpac::Exception& e ) + { + } + + chunk = {}; + zeek::event_mgr.Drain(); + } + + zeek::detail::fuzzer_cleanup_one_input(); + return 0; + } From 7f47fa24fdc52c0dca8c8202a3155c2ccec9a935 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Wed, 3 Aug 2022 16:40:56 -0700 Subject: [PATCH 4/6] Trick event handlers into returning that they exist during fuzzing --- src/EventRegistry.cc | 10 ++++++++++ src/EventRegistry.h | 11 +++++++++++ src/fuzzers/fuzzer-setup.h | 6 ++++++ src/zeek.bif | 11 +---------- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/EventRegistry.cc b/src/EventRegistry.cc index 1775fc57ab..6140746b54 100644 --- a/src/EventRegistry.cc +++ b/src/EventRegistry.cc @@ -136,4 +136,14 @@ void EventRegistry::SetErrorHandler(std::string_view name) std::string(name).c_str()); } +void EventRegistry::ActivateAllHandlers() + { + auto event_names = AllHandlers(); + for ( const auto& name : event_names ) + { + if ( auto event = Lookup(name) ) + event->SetGenerateAlways(); + } + } + } // namespace zeek diff --git a/src/EventRegistry.h b/src/EventRegistry.h index 70f5e1cf7d..bc19644793 100644 --- a/src/EventRegistry.h +++ b/src/EventRegistry.h @@ -60,6 +60,17 @@ public: void PrintDebug(); + /** + * Marks all event handlers as active. + * + * By default, zeek does not generate (raise) events that have not handled by + * any scripts. This means that these events will be invisible to a lot of other + * event handlers - and will not raise :zeek:id:`new_event`. Calling this + * function will cause all event handlers to be raised. This is likely only + * useful for debugging and fuzzing, and likely causes reduced performance. + */ + void ActivateAllHandlers(); + private: std::map, std::less<>> handlers; // Tracks whether a given event handler was registered in a diff --git a/src/fuzzers/fuzzer-setup.h b/src/fuzzers/fuzzer-setup.h index 4e0b4e79f0..b3fbb62b0d 100644 --- a/src/fuzzers/fuzzer-setup.h +++ b/src/fuzzers/fuzzer-setup.h @@ -4,6 +4,7 @@ #include #include "zeek/Event.h" +#include "zeek/EventRegistry.h" #include "zeek/broker/Manager.h" #include "zeek/file_analysis/Manager.h" #include "zeek/session/Manager.h" @@ -41,6 +42,11 @@ extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) if ( zeek::detail::setup(*argc, *argv, &options).code ) abort(); + // We have to trick the event handlers into returning true that they exist here + // even if they don't, because otherwise we lose a bit of coverage where if + // statements return false that would otherwise not. + zeek::event_registry->ActivateAllHandlers(); + return 0; } diff --git a/src/zeek.bif b/src/zeek.bif index 9b00450766..39e2055a3b 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -5366,16 +5366,7 @@ function match_signatures%(c: connection, pattern_type: int, s: string, ## only useful for debugging and causes reduced performance. function generate_all_events%(%) : bool %{ - auto event_names = event_registry->AllHandlers(); - for ( const auto& name: event_names ) - { - auto event = event_registry->Lookup(name); - if ( event == nullptr ) - continue; - - event->SetGenerateAlways(); - } - + event_registry->ActivateAllHandlers(); return zeek::val_mgr->True(); %} From 8dc641f63f37c7e7ece5f9dc26b78e79106473e6 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Thu, 4 Aug 2022 13:09:19 -0700 Subject: [PATCH 5/6] Add a couple of ICMP files to corpus for packet-fuzzer --- src/fuzzers/packet-corpus.zip | Bin 2611 -> 3183 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/fuzzers/packet-corpus.zip b/src/fuzzers/packet-corpus.zip index 8ffc9d4162f6615378c64137fddf1119e83329b9..60f198e01a4eb2ccc5c68e1cff886cc9471231c3 100644 GIT binary patch delta 846 zcmdli@?L@`z?+#xgn@y9gF(w}B99*9w~f|}jP*Y&@btjsSjuFf$ru+TFz(lTa-;K_j666XuLnJE_(ZU!X9oZ>f`(t1lz70hNgnKBi` zmI6s|n@s5ia!v&x`QfbPWIIMD#&4S&85b}zT25ACc3}KAIhi>a$llKE0+jf}+|2~! zbgTjA993z(Bx~Mk8QkqD43>B*LM= z0y4t^Gf0umUPQDJf~2QS!xAn}bHGEA#k zCZFfffe6W4t`GReruVM`Xz(R&1_pTsWa}JQCmV1YKvXIKRdN@r&)f|3j~ELBgA|HN zK@Nt=GudRJb{*stm3Lhqpnp!_ry5YXE)esfD3{=z{FPH)9-h7fyjj^m;lu%imw`@c H;{@>lR(AR8 delta 273 zcmaDau~~#Cz?+#xgn@y9gF!29B99*9*NxVUj7(<(CtqfAV*I*UjClbgW8mcNEDnrc zC;wmx2C{uvU4Rl3S-Y8l99a%~phPUkF~-=*DxAhZb_Az2W8CB^oEAW~0+$HLs4gxU zCL_klE4YBh!^GYK#l)B=b93t;#QeBrm{v1S&fzwIh$);6Tpz$)tUhxy(1Bts3=C2X z5)0$?D_!xa{@orfU>$k%!i`1nSHV$kG%X>Mg|73Zv(tp*+9my O0ig~P1H(sl5Dx%}okRKn From 95029bd4717a5faa76d387667975b2a76731923e Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Mon, 8 Aug 2022 19:31:48 +0000 Subject: [PATCH 6/6] Fix a crash related to a broken IPv6 chain --- src/IP.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/IP.cc b/src/IP.cc index 330f2b5a85..a7ccada380 100644 --- a/src/IP.cc +++ b/src/IP.cc @@ -39,6 +39,10 @@ static VectorValPtr BuildOptionsVal(const u_char* data, int len) { // PadN or other option uint16_t off = 2 * sizeof(uint8_t); + + if ( len < opt->ip6o_len + off ) + break; + rv->Assign(1, opt->ip6o_len); rv->Assign(2, new String(data + off, opt->ip6o_len, true)); data += opt->ip6o_len + off;