Thanks, Ondrej, for the pointers and detailed information. I read through bin/named/fuzz.c, and it seems like the AFL fuzzing works only in the persistent mode due to this check in fuzz.c <https://gitlab.isc.org/isc-projects/bind9/-/blob/main/bin/named/fuzz.c#L752>. That means it has to be compiled using `afl-clang-fast` (I installed it using 'apt install afl++') instead of `afl-clang.`
I configured the code using "CXX=afl-clang-fast++ CC=afl-clang-fast ./configure --enable-fuzzing=afl --disable-linux-caps --disable-shared --enable-static --enable-developer --without-cmocka --without-zlib" and then I tried "make -j" but that results in the following error. Is there any specific version combination of Bind and afl++ that works without this error, or am I missing some configure flag? No worries if you are not immediately aware of it; I wanted to give the AFL persistent mode a final try before giving up fuzzing the named binary. fuzz.c:585:2: error: cast from 'const char *' to 'char *' drops const > qualifier [-Werror,-Wcast-qual] > __AFL_LOOP(0); > ^ > <command line>:11:88: note: expanded from here > #define __AFL_LOOP(_A) ({ static volatile char *_B __attribute__((used)); > _B = (char*)"##SIG_AFL_PERSISTENT##"; __attribute__((visibility(... > > ^ > afl-llvm-pass 2.52b by <lszeke...@google.com> On Thu, Aug 5, 2021 at 10:48 PM Ondřej Surý <ond...@isc.org> wrote: > You can use dnspython to generate wire format. > > Generally, I think that writing more specific fuzzers on top of APIs that > consumes user input would be more useful than just fuzzing `named`. > > F.e. it should be possible to write a fuzzer that takes multiple DNS > messages as input (starting with query + all DNS messages needed to resolve > the query) would be more useful that just fuzzing “stuff”. > > Also I think that for more complex stuff it would be better to write a > protocol specific input generator than just generic one found in existing > fuzzers. > > Ondřej > -- > Ondřej Surý — ISC (He/Him) > > My working hours and your working hours may be different. Please do not > feel obligated to reply outside your normal working hours. > > On 5. 8. 2021, at 18:51, Siva Kakarla <sivakesa...@gmail.com> wrote: > > > Thanks, Ondrej, for the reply. > > Fuzzing responses is the second part, I would say. For now, I am only > fuzzing the authoritative server, so fuzzing named with queries would be a > good starting point. I will check the GitHub repository you pointed out. > > The instructions for running AFL work great, thanks! > > I came across the '-A' option from the report you filed a year ago > <https://gitlab.isc.org/isc-projects/bind9/-/issues/1649>, but was under > the impression that the "client" would be the default but I just saw that > it is none in the code so, I guess, named has to be passed with "named -A > client:IP:port" to fuzz the authoritative server with queries. I will check > the files you pointed more carefully. > > When the AFL code was first added to Bind 4-5 years ago, what seed input > was given to it? > > I understand that they are raw packets, but how did you get them in the > raw format? I guess the fuzzer would have generated some of them but what > were the starting raw packets? So, there is also no way to convert them > from raw format to readable DNS messages as most of them are invalid but is > there a way for valid ones? > > I will try to be more specific - say I want to seed with a query <foo.com, > A>, how do I get the DNS packet that has this query in the raw format? > (capturing it using Wireshark?) > > *Thanks a lot again for taking the time to answer my questions.* > > On Thu, Aug 5, 2021 at 9:40 PM Ondřej Surý <ond...@isc.org> wrote: > >> If you want to get your hands dirty, I would recommend looking at >> https://github.com/dobin/ffw, but for useful fuzzing, this would also >> need a more complicated client fuzzing support because you don’t only want >> to fuzz the queries, but also responses given by “fake” authoritative >> servers and you want to do that on various levels of DNS tree and for >> various query types. It’s a state machine and by doing fuzzing on single >> level, you might never hit all the states. >> >> Ondrej >> -- >> Ondřej Surý (He/Him) >> ond...@isc.org >> >> > On 5. 8. 2021, at 18:01, Ondřej Surý <ond...@isc.org> wrote: >> > >> > >> > -- >> > Ondřej Surý (He/Him) >> > ond...@isc.org >> > >> >> On 5. 8. 2021, at 14:37, Siva Kakarla <sivakesa...@gmail.com> wrote: >> >> >> >> Hello Everyone, >> >> >> >> I am trying to understand and set up a fuzzer for the Bind DNS >> implementation. My current goal is to fuzz the authoritative server with >> queries. >> >> >> >> I have looked around and came across different fuzzing engines, but I >> have some trouble and some questions getting it to work. If anyone has >> anything to comment on, please reply, and that would be really helpful. >> >> • I configured with CC=/path/to/afl/afl-clang./configure >> --enable-fuzzing=afl or afl-clang-fast to enable fuzzing. Then, I did make >> and make install. I then tried fuzzing the named binary with afl-fuzz -i >> fuzz/dns_message_parse.in/ -o findings /usr/local/sbin/named -gbut then >> it stops immediately, sayingthe program crashed with one of the test cases >> provided. >> >> • How to fuzz the named binary with queries? >> > >> > Read bin/named/fuzz.c and associated code in bin/named/main.c — it’s >> more complicated to set it up (you need to pass -A extra option to `named`). >> > >> >> • How to get the seed input in raw format? >> >> • Honggfuzz seems to fuzz the named binary, but it >> produced too many files as crash reports within a minute. I have asked >> about it on their GitHub. Anyone that worked with Honggfuzz, please reply. >> > >> > I see, you got response from hongfuzz author directly. >> > >> >> • A separate fuzz folder contains functions to fuzz small >> sections of the code. >> >> • Was this created to improve coverage and modularity? >> (In the sense, can't named be fuzzed directly using the above setup?) >> > >> > Fuzzing a daemon that depends on various internal state (state of the >> cache, authoritative zones present or not, various configuration options >> enabled or not) is difficult and also sometimes it’s also useless to fuzz >> the big blob and you want to fuzz just specific parts (zone parser, DNS >> message parsers, etc…) >> > >> >> • I could get them running with oss-fuzz but how to run >> them with afl-fuzz? The README mentions linking the files; can you please >> tell me how to do that? >> > >> > with AFL++ do >> > >> > CC=afl-clang-fast ./configure --enable-fuzzing=afl >> > make -j >> > cd fuzz >> > >> > and then for each test: >> > >> > make dns_message_parse >> > LD_LIBRARY_PATH=../lib/isc/.libs:../lib/dns/.libs afl-fuzz -i >> dns_message_parse.in/ -o xxx ./.libs/dns_message_parse >> > >> >> • How to decode the packets given in >> https://gitlab.isc.org/isc-projects/bind9/-/tree/main/fuzz/dns_message_parse.in? >> How to add a new packet to the corpus? (How to convert into a raw packet?) >> > >> > These are raw DNS messages. There’s bigger corpus f.e. here: >> https://github.com/CZ-NIC/dns-fuzzing >> > >> >> Thank you >> >> Siva >> >> >> >> -- >> >> Siva Kakarla >> >> (sivak.dev) >> >> _______________________________________________ >> >> Please visit https://lists.isc.org/mailman/listinfo/bind-users to >> unsubscribe from this list >> >> >> >> ISC funds the development of this software with paid support >> subscriptions. Contact us at https://www.isc.org/contact/ for more >> information. >> >> >> >> >> >> bind-users mailing list >> >> bind-users@lists.isc.org >> >> https://lists.isc.org/mailman/listinfo/bind-users >> >>
_______________________________________________ Please visit https://lists.isc.org/mailman/listinfo/bind-users to unsubscribe from this list ISC funds the development of this software with paid support subscriptions. Contact us at https://www.isc.org/contact/ for more information. bind-users mailing list bind-users@lists.isc.org https://lists.isc.org/mailman/listinfo/bind-users