??????????????????????????????????????????????????μ????????????????????????????檔???????????????????????????????????????????????????У??????????????????????????????????????????????????????????????Щ???????????????????????????bug?????????????????
???????????????????????????????Ч?????????????????????fuzzing??????????????????????????????????????ε???????????????????????????????????????????????????????????????????????????????????е??????????????????????????????????????????????Ч?????????????????????????????????·????????????????????????Ч????????????????????????????????????????????????????????д????????????????????Щ??????????????????????American Fuzzy Lop ??AFL????LLVM libFuzzer??HonggFuzz????????????????????????δ???????????????????μ???????????????????С???д?????????????????????????????????????й???????????????????????£????????ò????????????????е???????????????????????????????????д???д?????????????fuzzer??fuzzer??????????????????????????????????????е????????????????????????
?????????????????????????????????????????????????????????????????????????????????Fuzzer??AFX??LLVM libFuzzer?????????????????XML??????????——libxml2?????????????
??????AFL???????????
??????AFL??????????????????????????Ubuntu 16.04 Linux???????????????xmllint??ó????AFL?????????????????????????libxml2??????????
?????????????????AFL?????libxml2-utils???????
??$ apt-get install -y afl
??$ apt-get source libxml2-utils
?????????????????libxml2??????????????????????????AFL????????????xmllint??ó???
??1.  $ cd libxml2 /
??2.  $ ./configure CC=afl-gcc CXX=afl-g++
??3.  $ make xmllint
???????????AFL???????????“<a> </a>”????????????????????afl-fuzz??
$ echo "" > in/sample
$ LD_LIBRARY_PATH=./.libs/ afl-fuzz -i ./in -o ./out -- ./.libs/lt-xmllint -o /dev/null @@

????AFL??????????????????????д??????????./out/queue/?д????μ?????????./out/crashes/?д?????????????? /out/hangs/????????????й?????е?AFL??????????????????????http://lcamtuf.coredump.cx/afl/status_screen.txt
???????LLVM libFuzzer?????????
???????????????LLVM libFuzzer????libxml2?????????????????????????????????????????????LLVMFuzzerTestOneInput??????libFuzzer?????????????????????????????????????????
??extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data?? size_t Size) {
???? DoSomethingInterestingWithMyAPI(Data?? Size);
???? return 0; // Non-zero      return values are reserved for future use.
????}
???????libxml2??????????Google??fuzzer??????????????????????????????????
???? // Copyright 2016 Google Inc. All      Rights Reserved.
???? // Licensed under the Apache      License?? Version 2.0 (the "License");
???? #include
???? #include
???? #include "libxml/xmlversion.h"
???? #include "libxml/parser.h"
???? #include "libxml/HTMLparser.h"
???? #include "libxml/tree.h"
????
????void ignore (void * ctx?? const char * msg?? ...) {}
????
????extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data?? size_t size) {
???? xmlSetGenericErrorFunc(NULL?? &ignore);
???? if (auto doc =      xmlReadMemory(reinterpret_cast(data)?? size?? "noname.xml"?? NULL?? 0))
???? xmlFreeDoc(doc);
???? return 0;
????}
?????????????????????????????????clang??-fsanitize-coverage = trace-pc-guard?????????????????????????SanitizerCoverage???????? ???????
AddressSanitizer??ASAN????UndefinedBehaviorSanitizer??UBSAN??????????????????????????????????-fsanitize = address???????????????????  ??
????$ git clone https://github.com/GNOME/libxml2 libxml2
????$ cd libxml2
????$ FUZZ_CXXFLAGS = “-O2 -fno-omit-frame-pointer -g -fsanitize = address??undefined -fsanitize-coverage = trace-pc-guard”
????$ ./autogen.sh
????$ CXX="clang++-5.0      $FUZZ_CXXFLAGS" CC="clang-5.0      $FUZZ_CXXFLAGS" CCLD="clang++-5.0      $FUZZ_CXXFLAGS" ./configure
????$ make
????????????????棬libFuzzer??и?????????clang-5.0?????http://apt.llvm.org/???????????????????鰱????libFuzzer.a???ο??????????http://llvm.org/docs/LibFuzzer.html??get-started?????????????????????????????仯??
??????????????????????????????????????????????libFuzzer??????????????????libxml2?????????
$ clang++-5.0 -std=c++11 $FUZZ_CXXFLAGS -lFuzzer ./libxml-test.cc -I ./include ./.libs/libxml2.a -lz -llzma -o libxml-fuzzer
??????????????????????????fuzzer???
$ mkdir ./output
$ ./libxml-fuzzer ./output/

???????????????κ?????????????libFuzzer??????????????????????????libxml2??????д????′???·??????????????????????????????????????洢??./output?С?????libFuzzer??????????У????????????????????????????????????????????????????????libFuzzer??????????????????5000????У?????????????и??????Χ????????????????????2000??????й??????????????????????μ???http://llvm.org/docs/LibFuzzer.html#output
?????????????
????????????????????????????????????????????????????Σ??????????????????????????????????????????????AFL????Micha?Zalewski??JPEG????????????????????????????????????????????????????????????????t?????С????ó????????????????С????????????
??????????????????AFL??и????κβ?????????????????С??????????????“<a> </a>”???XML????????????????????AFL??
???????libFuzzer?????и??????????????顣???磬????XML?????????????????“ -only_ascii = 1 ”?????????????????????????????ж???????????У????????????Fuzzer????????????????????????н?????γ???????????
??$ for foo in 4 8 16 32 64 128 256 512; do
????./libxml-fuzzer -max_len=$foo -runs=500000 ./temp-corpus-dir;
????done
????$ ./libxml-fuzzer -merge=1 ./corpus ./temp-corpus-dir
???????????????????????????????????4??????????????????????з???4??????????????????8?????????????????????????????С????????????“??”??????Χ????????????????????????????????????????????á?
???????????????????Щ??????????????????????????????С?

????????????????????????????????????????????????18?????LibFuzzer??????????????????????μ?coverage??????-max_len????8?????????????????Щ????????libFuzzer???????????????
?????????????????????libFuzzer?????????????????????Σ????????18?????
$ ./libxml-fuzzer -max_total_time=1080 ./temp-corpus-dir
$ ./libxml-fuzzer -merge=1 ./corpus ./temp-corpus-dir;

????????Щ???????????????????е?????????????????????????????????????????????????????????????????????????????????????????????libFuzzer?????????????????????????С???μ???????libFuzzer??????64????????-max_len?????????дlibFuzzer??????????????????-max_len?4096????????????У????????????????????????Ч?????????????????????????????????У??????????????Ч??????????????????????
???????????????????????????????????????????????Щ?????W3C XML?????????????Χ???б??????????????????????????????????????????????????????????????ū??????????????????????
??$ wget https://www.w3.org/XML/Test/xmlts20130923.tar.gz      -O - | tar -xz
????$ ./libxml-fuzzer -merge=1 ./samples ./xmlconf
????$ ./libxml-fuzzer -runs=0 ./samples
????#950        DONE   cov: 18067 ft: 74369 corp: 934/2283Kb      exec/s: 950 rss: 215Mb
????????????????????????W3C????????н?????鴝?????????18727????????????????????????????????83972??????????????????Щ??????????????????????????????п?????????С??????????W3C???????δ??????????????
????“???”????????
????????????????????????????????????????????????Щ????е?????????????????????“???”???С????????????????????????????????????????????????????????????С???????
????AFL????????????С????????afl-cmin shell??????????????????????С????./out?????????????????????????С?????????????./output_corpus???С?
$afl-cmin -i ./out/queue -o ./output_corpus -- ./.libs/lt-xmllint -o /dev/null @@
????AFL???????????????afl-tmin????????С??????????????????????濴???????????????????????????????????afl-tmin?????????????????????afl-tmin????????????afl-cmin???м??ε?????
????LibFuzzer???????“???”???? – ?????????????merge???????С???????
??$./libxml-fuzzer -merge=1 <output directory> <input directory 1> <input directory 2> ... <input directory n>
????LibFuzzer ??merge??????????????????????????????????????????????libFuzzer merge?е????????????????  -max_len????????-max_len = X?? libFuzzer????????????????????X??????????????????????????????????????С?????max_len?????libFuzzer????к??????????????1048576????
?????libFuzzer merge???????????????????????????????
????$      for      foo in 4 8 16 32 64 128 256 512 1024; do
????mkdir      ./corpus_max_len-$foo;
????./libxml-fuzzer -merge=1 -max_len=$foo ./corpus-max_len-$foo ./corpus-max_len-* <input-directories>;
????done
????$      mkdir output_corpus;
????$      ./libxml-fuzzer -merge=1 ./output_corpus ./corpus-max_len-*;
???????????“???”?????libFuzzer?????????????????????д???2??????????????????Щ????????4??????飬???????????????в?????????ж?????????????
???????? merge ??????????????????????????????????fuzzer???????????????????·??????????????????????????????????????????????????????????????????????????????????????libFuzzer???????????????????????????????libFuzzer??????б??????????????????????????????????????????????????????????????????
??$      ./libxml-fuzzer /*
????INFO: Seed: 3825257193
????INFO: Loaded 1 modules (237370 guards): [0x13b3460?? 0x149b148)??
????./libxml2/libxml-fuzzer: Running 1098 inputs 1 time(s) each.
????Running: ./corpus-dir/002ade626996b33f24cb808f9a948919799a45da
????Executed ./corpus-dir/002ade626996b33f24cb808f9a948919799a45da in 1      ms
????Running: ./corpus-dir/0068e3beeeaecd7917793a4de2251ffb978ef133
????Executed ./corpus-dir/0068e3beeeaecd7917793a4de2251ffb978ef133 in 0      ms
???????awk???????Σ??????????????????????????е????????????????????????100???????????????????Щ?????
????$./libxml-fuzzer /* 2>&1 | awk '$1 == "Executed" && $4 > 100 {print $2}' | xargs -r -I '{}' rm '{}'
????????????????fuzzer
??????????????????????????????????????????????????????Щ?????????????????????????????????????????fuzzer??????????????fuzzer??????????????????????????????????????????????????ж??fuzzer???????????????????fuzzer??????????fuzzer????????????????????????????
?????????????????????????????????????fuzzer?????С????????fuzzer??????????????
??$mkdir libfuzzer-output; echo "" > .libfuzzer-output/1
????$while true; do
????afl-fuzz -d -i ./libfuzzer-output/ -o ./afl-output/ -- ./libxml/afl-output/bin/xmllint -o /dev/null @@ 1>/dev/null &
????./libxml/libxml-fuzzer -max_total_time=3600 ./libfuzzer-output/;
????pkill -15 afl-fuzz;
????sleep 1;
????mkdir ./libfuzzer-merge;
????./libxml/libxml-fuzzer -merge=1 ./libfuzzer-merge ./libfuzzer-output/ ./afl-output/;
????rm -rf ./afl-output ./libfuzzer-output;
????mv ./libfuzzer-merge ./libfuzzer-output;
????done
???????????????ε???????????С??????AFL???“?????????”?????????????????衣??????????????????AFL??????????????????С???????????????????????????е??????AFL????????????????????????У????????????????????“ ./libfuzzer_output ”??????????????????С?
???????
???????????????????????????????????????????????????????????????
????AFL??libFuzzer?????????????????Щ???????????????????????????????????fuzzer?????????????й??Щ?????????????Google libFuzzer??  XML???????AFL??????? ?????????
??????????Щ?????????????????????????????????Щ????????????磬Google???????????https://chromium.googlesource.com/chromium/src/+/master/testing/libfuzzer/fuzzers/dicts??????AFL?????????????????????????????????????github??afl????https://github.com/rc0r/afl-fuzz/tree/master/dictionaries
????AFL??libFuzzer????????????????????????????????????????AFL????????libFuzzer?????????в????
??????????libFuzzer????????????????????libFuzzer???????????????????????????????????????????????????????????????????????????????????顣libFuzzer????????μ?????Χ???????Щ?????????????Щ?????????????????????
??1.  “ISO-”
????2.  “ISO-1”
????3.  “ISO-10”
????4.  “ISO-1064”
????5.  “ISO-10646-”
????6.  “ISO-10646-UCS-2”
????7.  “ISO-10646-UCS-4”
?????????????????????????10??????????????????????е????????Google??libFuzzer XML??????????????????????±??п?????

?????????????????????????н???????????е????????????????????????????????“???”????????????????????????????仯??
???????????????????????Ч?????????????????????????????????????????Shortcuts????libFuzzer???????????а?????????????????????????????????????е??????