blob: aaef03015dc9d3f9538c5fdf923653c398bc471d [file] [log] [blame] [view]
Philippe Antoinecd6cd812019-06-06 09:22:27 +02001What is it?
Philippe Antoine81496272019-06-04 14:47:58 +02002------
3
4This directory contains fuzz targets.
5Fuzz targets are simple codes using the library.
6They are used with a so-called fuzz driver, which will generate inputs, try to process them with the fuzz target, and alert in case of an unwanted behavior (such as a buffer overflow for instance).
7
8These targets were meant to be used with oss-fuzz but can be used in other contexts.
9
10This code was contributed by Philippe Antoine ( Catena cyber ).
11
Philippe Antoinecd6cd812019-06-06 09:22:27 +020012How to run?
Philippe Antoine81496272019-06-04 14:47:58 +020013------
14
Philippe Antoinecd6cd812019-06-06 09:22:27 +020015To run the fuzz targets like oss-fuzz:
Philippe Antoine81496272019-06-04 14:47:58 +020016```
17git clone https://github.com/google/oss-fuzz
18cd oss-fuzz
19python infra/helper.py build_image mbedtls
20python infra/helper.py build_fuzzers --sanitizer address mbedtls
21python infra/helper.py run_fuzzer mbedtls fuzz_client
22```
Philippe Antoinecd6cd812019-06-06 09:22:27 +020023You can use `undefined` sanitizer as well as `address` sanitizer.
24And you can run any of the fuzz targets like `fuzz_client`.
Philippe Antoine81496272019-06-04 14:47:58 +020025
Philippe Antoinecd6cd812019-06-06 09:22:27 +020026To run the fuzz targets without oss-fuzz, you first need to install one libFuzzingEngine (libFuzzer for instance).
27Then you need to compile the code with the compiler flags of the wished sanitizer.
Philippe Antoine81496272019-06-04 14:47:58 +020028```
Gilles Peskine5d46f6a2019-07-27 23:52:53 +020029perl scripts/config.py set MBEDTLS_PLATFORM_TIME_ALT
Philippe Antoine81496272019-06-04 14:47:58 +020030mkdir build
31cd build
32cmake ..
33make
34```
Philippe Antoinecd6cd812019-06-06 09:22:27 +020035Finally, you can run the targets like `./test/fuzz/fuzz_client`.
Philippe Antoinecf8fdfd2019-06-25 22:06:35 +020036
37
Shaun Case8b0ecbc2021-12-20 21:14:10 -080038Corpus generation for network traffic targets
Philippe Antoinecf8fdfd2019-06-25 22:06:35 +020039------
40
Shaun Case8b0ecbc2021-12-20 21:14:10 -080041These targets use network traffic as inputs :
Philippe Antoinecf8fdfd2019-06-25 22:06:35 +020042* client : simulates a client against (fuzzed) server traffic
43* server : simulates a server against (fuzzed) client traffic
44* dtls_client
45* dtls_server
46
47They also use the last bytes as configuration options.
48
49To generate corpus for these targets, you can do the following, not fully automated steps :
50* Build mbedtls programs ssl_server2 and ssl_client2
Shaun Case8b0ecbc2021-12-20 21:14:10 -080051* Run them one against the other with `reproducible` option turned on while capturing traffic into test.pcap
Philippe Antoinecf8fdfd2019-06-25 22:06:35 +020052* Extract tcp payloads, for instance with tshark : `tshark -Tfields -e tcp.dstport -e tcp.payload -r test.pcap > test.txt`
53* Run a dummy python script to output either client or server corpus file like `python dummy.py test.txt > test.cor`
54* Finally, you can add the options by appending the last bytes to the file test.cor
55
56Here is an example of dummy.py for extracting payload from client to server (if we used `tcp.dstport` in tshark command)
57```
58import sys
59import binascii
60
61f = open(sys.argv[1])
62for l in f.readlines():
63 portAndPl=l.split()
64 if len(portAndPl) == 2:
65 # determine client or server based on port
66 if portAndPl[0] == "4433":
67 print(binascii.unhexlify(portAndPl[1].replace(":","")))
68```