Erik Hendriks

Python Web Development

hacker emblem

AFL Fuzzer Introductie



Gepubliceerd op 20 April, 2017

Fuzzing is een techniek om software te testen, er wordt willekeurige of non valide data als input aan een programma gegeven. Het programma wordt gemonitord voor crashes of voor eventuele memory leaks. Fuzzen bestaat als sinds de jaren 50 toen er nog steeds met ponskaarten werd gewerkt. Programmeurs gebruikt oude ponskaarten als input om bugs te onthullen.

Animated Chip Abstract

Hoe afl te gebruiken

Met de afl fuzzer kun je applicaties fuzzen waarvan je de source code hebt en die met gcc of clang wordt gecompiled. De applicatie leest files of stdin, of er is een command line utility beschikbaar die files leest, of je schrijft een wrapper die dit doet. Je kunt 32 bit en 64 bit software fuzzen en ook experimenteren met ARM. Je kunt ook de experimentele QEMU instrumentatie gebruiken als je niet beschikt over de source code

Eerst compileer je de source code met de afl compiler, eg. Afl-gcc, afl-g++ of afl-clang. In dit voorbeeld wordt libtiff (github) gebruikt, unzip en cd in de libtiff folder en voer de volgende commando's uit. Zo compileer je de source code met de afl, --disable-shared compileert zoveel mogelijk statisch om LD_PRELOAD calls te vermijden. Door AFL_HARDEN=1 make te gebruiken maakt de CC wrapper automatische code hardening opties aan, deze maken het gemakkelijker om simpele memory bugs te detecteren.

NOTE: --disable-shared en AFL_HARDEN=1 zijn niet noodzakelijk.

CC=afl-gcc CXX=afl-g++ ./configure --disable-shared
AFL_HARDEN=1 make
make install
mkdir input_all;mkdir input;mkdir output


Afl testcases

Alright, nu de testcases. In de afl folder is een testcases folder met voorbeelden, je kunt er nog meer downloaden van de afl website. Kopieer de testcases die je hebt geselecteerd in de input_all folder en voer het volgende command uit.

afl-cmin -i input_all -o input bmp2tiff -c none @@ bmp.out

Afl-cmin checkt of het zin heeft de input te gebruiken en minimaliseert het, cmin staat voor corpus minimization tool. Het kopieert de geschikte input naar de input folder. Nu is alles klaar om het werkelijke fuzzen te beginnen, het kan dagen tot weken duren tot alle mogelijkheden zijn uitgeput dus misschien wil je screen gebruiken.

screen -S fuzzing

Het volgende command start de fuzzer. Je kunt elke optie die, in dit geval van bmp2tiff, beschikbaar is gebruiken.

afl-fuzz -i input -o output bmp2tiff -c none @@ bmp.out

Je zult waarschijnlijk deze waarschuwing krijgen:

Hmm, your system is configured to send core dump notifications to an external utility. This will cause issues due to an extended delay between the fuzzed binary malfunctioning and this information being eventually relayed to the fuzzer via the standard waitpid() API. To avoid having crashes misinterpreted as hangs, please log in as root and temporarily modify /proc/sys/kernel/core_pattern, like so: echo core >/proc/sys/kernel/core_pattern

En daarna deze:

Whoops, your system uses on-demand CPU frequency scaling, adjusted between 781 and 3222 MHz. Unfortunately, the scaling algorithm in the kernel is imperfect and can miss the short-lived processes spawned by afl-fuzz. To keep things moving, run these commands as root: cd /sys/devices/system/cpu echo performance | tee cpu*/cpufreq/scaling_governor You can later go back to the original state by replacing 'performance' with 'ondemand'. If you don't want to change the settings, set AFL_SKIP_CPUFREQ to make afl-fuzz skip this check - but expect some performance drop.

Als je de core dump notifications en CPU frequency scaling hebt aangepast zal je een soort gelijk scherm gepresenteerd krijgen, het status screen:

afl status screen output

Normaal gezien krijg je al snel new paths, dit zijn executie patronen die door de testcase wordt getriggerd. Alle bevindingen worden in de output folder opgeslagen, je kunt deze hangs, queue en crashes ook als nieuwe testcases proberen. Dus wanneer ben je klaar? Op je status screen is rechts bovenin een cycle teller die van kleur verandert. Zodra het groen kleurt is er een langere tijd niets nieuws meer gevonden en kun je stoppen. Maar eerst wordt hij geel zolang er nog nieuwe paths gevonden worden en blauw als dat stopt. Zie dit document voor gedetailleerde status screen informatie.


Contact

I'd Love To Hear From You.

Sending...
Sending...
Where am i

Hazelbos 3
2650 Edegem
Belgium