Les deux révisions précédentesRévision précédente | |
prog:fuzzer:afl [2023/10/05 16:09] – [Sanitizers] : ajout des nouvelles variables d'environnement pour les sanitizer root | prog:fuzzer:afl [2023/10/06 09:55] (Version actuelle) – [Sanitizers] : mise à jour avec afl++ root |
---|
* ''AFL_USE_LSAN'' : ''-fsanitize=leak'' | * ''AFL_USE_LSAN'' : ''-fsanitize=leak'' |
* ''AFL_USE_CFISAN'' : ''-fcf-protection=full'' pour gcc, ''-fsanitize=cfi -fvisibility=hidden'' pour clang | * ''AFL_USE_CFISAN'' : ''-fcf-protection=full'' pour gcc, ''-fsanitize=cfi -fvisibility=hidden'' pour clang |
| |
| |
Comme on est dans un environnement multithread, on compile une version de programme pour chaque sanitizer qui serviront lors du fuzzing (voir ci-après). | Comme on est dans un environnement multithread, on compile une version de programme pour chaque sanitizer qui serviront lors du fuzzing (voir ci-après). |
| |
<code bash> | <code bash> |
CC=afl-gcc CXX=afl-g++ AFL_USE_ASAN=1 AFL_INST_RATIO=100 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" ./configure | CC=afl-clang-lto CXX=afl-clang-lto++ RANLIB=llvm-ranlib AR=llvm-ar AS=llvm-as AFL_USE_ASAN=1 AFL_INST_RATIO=100 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" cmake .. |
CC=afl-clang CXX=afl-clang++ AFL_USE_MSAN=1 AFL_INST_RATIO=100 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" LDFLAGS="-lgcc_s" ./configure | CC=afl-clang-lto CXX=afl-clang-lto++ RANLIB=llvm-ranlib AR=llvm-ar AS=llvm-as AFL_USE_MSAN=1 AFL_INST_RATIO=100 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" cmake .. |
CC=afl-gcc CXX=afl-g++ AFL_HARDEN=1 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" ./configure | CC=afl-clang-lto CXX=afl-clang-lto++ RANLIB=llvm-ranlib AR=llvm-ar AS=llvm-as AFL_HARDEN=1 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" cmake .. |
CC=afl-gcc CXX=afl-g++ CFLAGS="-fsanitize=undefined -U_FORTIFY_SOURCE -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=undefined -U_FORTIFY_SOURCE -g -fno-omit-frame-pointer" LDFLAGS="-lgcc_s" ./configure | CC=afl-clang-lto CXX=afl-clang-lto++ RANLIB=llvm-ranlib AR=llvm-ar AS=llvm-as AFL_USE_UBSAN=1 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" cmake .. |
CC=afl-clang CXX=afl-clang++ CFLAGS="-fsanitize=cfi -U_FORTIFY_SOURCE -flto -fvisibility=hidden -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=cfi -U_FORTIFY_SOURCE -flto -fvisibility=hidden -g -fno-omit-frame-pointer" LDFLAGS="-lgcc_s" ./configure | CC=afl-clang-lto CXX=afl-clang-lto++ RANLIB=llvm-ranlib AR=llvm-ar AS=llvm-as AFL_USE_TSAN=1 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" cmake .. |
| CC=afl-clang-lto CXX=afl-clang-lto++ RANLIB=llvm-ranlib AR=llvm-ar AS=llvm-as AFL_USE_LSAN=1 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" cmake .. |
CC=afl-gcc CXX=afl-g++ AFL_USE_ASAN=1 AFL_INST_RATIO=100 cmake . | CC=afl-clang-lto CXX=afl-clang-lto++ RANLIB=llvm-ranlib AR=llvm-ar AS=llvm-as AFL_USE_CFISAN=1 CFLAGS="-g -fno-omit-frame-pointer" CXXFLAGS="-g -fno-omit-frame-pointer" cmake .. |
CC=afl-clang CXX=afl-clang++ AFL_USE_MSAN=1 AFL_INST_RATIO=100 cmake . | |
CC=afl-gcc CXX=afl-g++ AFL_HARDEN=1 cmake . | |
CC=afl-gcc CXX=afl-g++ CFLAGS="-fsanitize=undefined -U_FORTIFY_SOURCE" CXXFLAGS="-fsanitize=undefined -U_FORTIFY_SOURCE" cmake . | |
CC=afl-clang CXX=afl-clang++ CFLAGS="-fsanitize=cfi -U_FORTIFY_SOURCE -flto -fvisibility=hidden" CXXFLAGS="-fsanitize=undefined -U_FORTIFY_SOURCE -flto -fvisibility=hidden" cmake . | |
| |
AFL_USE_ASAN=1 AFL_INST_RATIO=100 afl-g++ -g -fno-omit-frame-pointer -O2 main.cc -o main_asan | |
LDFLAGS="-lgcc_s" AFL_USE_MSAN=1 AFL_INST_RATIO=100 afl-clang++ -g -fno-omit-frame-pointer -O2 main.cc -o main_msan | |
AFL_HARDEN=1 afl-g++ -g -fno-omit-frame-pointer -O2 main.cc -o main_harden | |
afl-g++ -fsanitize=undefined -U_FORTIFY_SOURCE -g -fno-omit-frame-pointer -O2 -lgcc_s main.cc -o main_undefined | |
afl-clang++ -fsanitize=cfi -U_FORTIFY_SOURCE -flto -fvisibility=hidden -g -fno-omit-frame-pointer -O2 -lgcc_s main.cc -o main_cli | |
</code> | </code> |
| |
<WRAP center round important 60%> | |
Si ''AFL_USE_ASAN'' ou ''AFL_USE_MSAN'' est utilisé, automatiquement, afl ne surveille de 33% (aléatoirement) des branches. Il faut mettre ''AFL_INST_RATIO'' à 100 pour surveiller toutes les branches. | Si ''AFL_USE_ASAN'' ou ''AFL_USE_MSAN'' est utilisé, automatiquement, afl ne surveille de 33% (aléatoirement) des branches. Il faut mettre ''AFL_INST_RATIO'' à 100 pour surveiller toutes les branches. |
</WRAP> | |
| |
''AFL_USE_ASAN'' et ''AFL_USE_MSAN'', : nécessite ''-m none''. | |
| |
Dans ces cas, 20 To est nécessaire. Mais cette taille n'est pas l'espace mémoire utile en RAM qui sera nécessaire mais seulement la mémoire virtuelle : | |
| |
PID UTIL. PR NI VIRT RES SHR S %CPU %MEM TEMPS+ COM. | |
14810 name 20 0 20,000t 5916 3392 R 19,5 0,0 0:01.89 main | |
| |
<WRAP center round important 60%> | |
Une chute de performance est à prévoir. | |
</WRAP> | |
| |
Les valeurs ci-dessous sont basées sur l'utilisation du logiciel ''pdftohtml'' de ''poppler''. | |
^ Sanitizer ^ Performance ^ Chute ^ | |
| - | 100% |Vitesse maximale| | |
|address | 40% |Division par 2,5| | |
|undefined | 20% |Division par 5 | | |
|address,undefined| 8% |Division par 12 | | |
| |
Je conseille donc de lancer une version ''AFL_USE_ASAN'', ''AFL_USE_MSAN'', ''AFL_HARDEN'', ''-fsanitizer=undefined'' et ''-fsanitizer=undefined'' (soit 5 au total) et toutes les autres instances en parallèle sans ces optimisations. | Une chute de performance est à prévoir. Je conseille donc de lancer une exécution de afl-fuzz en mode esclave de chaque sanitizer et toutes les autres instances en parallèle sans ces vérifications. |
| |
====Dictionnaire==== | ====Dictionnaire==== |