A C library for asynchronous DNS requests (grpc依赖)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Martin Holeš 9ac7efc382
Add support for URI(Uniform Resource Identifier) records. (#411)
3 years ago
..
fuzzinput Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
fuzznames Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
gmock-1.8.0 Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
.gitignore Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
CMakeLists.txt Loosen requirements for static c-ares library when building tests 4 years ago
Makefile.am Distribute fuzzinput/fuzznames for fuzz tests 4 years ago
Makefile.inc Add support for URI(Uniform Resource Identifier) records. (#411) 3 years ago
Makefile.m32 Reorganize source tree (#349) 4 years ago
Makefile.msvc Reorganize source tree (#349) 4 years ago
README.md Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
ares-fuzz.c Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
ares-test-ai.h Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
ares-test-fuzz-name.c fuzzing: HAVE_CONFIG_H may not be defined so cannot include ares_setup.h. Its not needed even though we include ares_nameser.h 4 years ago
ares-test-fuzz.c Add support for URI(Uniform Resource Identifier) records. (#411) 3 years ago
ares-test-init.cc Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
ares-test-internal.cc Test case should honor flag HAVE_WRITEV rather than WIN32 (#344) 4 years ago
ares-test-live.cc more portability updates 4 years ago
ares-test-main.cc Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
ares-test-misc.cc more portability updates 4 years ago
ares-test-mock-ai.cc portability updates for test cases 4 years ago
ares-test-mock.cc more portability updates 4 years ago
ares-test-ns.cc Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
ares-test-parse-a.cc more portability updates 4 years ago
ares-test-parse-aaaa.cc portability updates for test cases 4 years ago
ares-test-parse-caa.cc Allow parsing of CAA Resource Record (#360) 4 years ago
ares-test-parse-mx.cc portability updates for test cases 4 years ago
ares-test-parse-naptr.cc portability updates for test cases 4 years ago
ares-test-parse-ns.cc portability updates for test cases 4 years ago
ares-test-parse-ptr.cc portability updates for test cases 4 years ago
ares-test-parse-soa-any.cc portability updates for test cases 4 years ago
ares-test-parse-soa.cc portability updates for test cases 4 years ago
ares-test-parse-srv.cc portability updates for test cases 4 years ago
ares-test-parse-txt.cc portability updates for test cases 4 years ago
ares-test-parse-uri.cc Add support for URI(Uniform Resource Identifier) records. (#411) 3 years ago
ares-test-parse.cc Validate hostnames in DNS responses and discard from malicious servers (#406) 3 years ago
ares-test.cc more portability updates 4 years ago
ares-test.h Portability Updates for arpa/nameser.h (#388) 4 years ago
buildconf Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
configure.ac Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
dns-dump.cc Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago
dns-proto-test.cc more portability updates 4 years ago
dns-proto.cc Add support for URI(Uniform Resource Identifier) records. (#411) 3 years ago
dns-proto.h Add support for URI(Uniform Resource Identifier) records. (#411) 3 years ago
fuzzcheck.sh Avoid buffer overflow in RC4 loop comparison (#336) 4 years ago

README.md

c-ares Unit Test Suite

This directory holds unit tests for the c-ares library. To build the tests:

  • Build the main c-ares library first, in the directory above this. To enable tests of internal functions, configure the library build to expose hidden symbols with ./configure --disable-symbol-hiding.
  • Generate a configure file by running autoreconf -iv (which requires a local installation of autotools).
  • ./configure
  • make
  • Run the tests with ./arestest, or ./arestest -v for extra debug info.

Points to note:

  • The tests are written in C++11, and so need a C++ compiler that supports this. To avoid adding this as a requirement for the library, the configuration and build of the tests is independent from the library.
  • The tests include some live queries, which will fail when run on a machine without internet connectivity. To skip live tests, run with ./arestest --gtest_filter=-*.Live*.
  • The tests include queries of a mock DNS server. This server listens on port 5300 by default, but the port can be changed with the -p 5300 option to arestest.

Test Types

The test suite includes various different types of test.

  • There are live tests (ares-test-live.cc), which assume that the current machine has a valid DNS setup and connection to the internet; these tests issue queries for real domains but don't particularly check what gets returned. The tests will fail on an offline machine.
  • There are some mock tests (ares-test-mock.cc) that set up a fake DNS server and inject its port into the c-ares library configuration. These tests allow specific response messages to be crafted and injected, and so are likely to be used for many more tests in future.
    • To make this generation/injection easier, the dns-proto.h file includes C++ helper classes for building DNS packets.
  • Other library entrypoints that don't require network activity (e.g. ares_parse_*_reply) are tested directly.
  • A couple of the tests use a helper method of the test fixture to inject memory allocation failures, using a recent change to the c-ares library that allows override of malloc/free.
  • There are some tests of the internal entrypoints of the library (ares-test-internal.c), but these are only enabled if the library was configured with --disable-symbol-hiding and/or --enable-expose-statics.
  • There is also an entrypoint to allow Clang's libfuzzer to drive the packet parsing code in ares_parse_*_reply, together with a standalone wrapper for it (./aresfuzz) to allow use of command line fuzzers (such as afl-fuzz) for further fuzz testing.

Code Coverage Information

To generate code coverage information:

  • Configure both the library and the tests with ./configure --enable-code-coverage before building. This requires the relevant code coverage tools (gcov, lcov) to be installed locally.
  • Run the tests with test/arestest.
  • Generate code coverage output with make code-coverage-capture in the library directory (i.e. not in test/).

Fuzzing

libFuzzer

To fuzz the packet parsing code with libFuzzer, follow the main libFuzzer instructions:

  • Configure the c-ares library and test suite with a recent Clang and a sanitizer, for example:

    % export CFLAGS="-fsanitize=fuzzer-no-link,address"
    % export CC=clang
    % ./configure --disable-shared && make
    
  • Link each of the fuzzer entrypoints in with ares-fuzz.cc:

    % clang -I.. -c ares-test-fuzz.c
    % clang -I.. -c ares-test-fuzz-name.c
    % clang++ -fsanitize=fuzzer,address ares-test-fuzz.o ../.libs/libcares.a -o ares-libfuzzer
    % clang++ -fsanitize=fuzzer,address ares-test-fuzz-name.o ../.libs/libcares.a -o ares-libfuzzer-name
    
  • Run the fuzzer using the starting corpus with:

    % ./ares-libfuzzer fuzzinput/  # OR
    % ./ares-libfuzzer-name fuzznames/
    

AFL

To fuzz using AFL, follow the AFL quick start guide:

  • Download and build AFL.

  • Configure the c-ares library and test tool to use AFL's compiler wrappers:

    % export CC=$AFLDIR/afl-gcc
    % ./configure --disable-shared && make
    % cd test && ./configure && make aresfuzz aresfuzzname
    
  • Run the AFL fuzzer against the starting corpus:

    % mkdir fuzzoutput
    % $AFLDIR/afl-fuzz -i fuzzinput -o fuzzoutput -- ./aresfuzz  # OR
    % $AFLDIR/afl-fuzz -i fuzznames -o fuzzoutput -- ./aresfuzzname
    

AFL Persistent Mode

If a recent version of Clang is available, AFL can use its built-in compiler instrumentation; this configuration also allows the use of a (much) faster persistent mode, where multiple fuzz inputs are run for each process invocation.

  • Download and build a recent AFL, and run make in the llvm_mode subdirectory to ensure that afl-clang-fast gets built.

  • Configure the c-ares library and test tool to use AFL's clang wrappers that use compiler instrumentation:

    % export CC=$AFLDIR/afl-clang-fast
    % ./configure --disable-shared && make
    % cd test && ./configure && make aresfuzz
    
  • Run the AFL fuzzer (in persistent mode) against the starting corpus:

    % mkdir fuzzoutput
    % $AFLDIR/afl-fuzz -i fuzzinput -o fuzzoutput -- ./aresfuzz