A biztonságos kódolás nagyon nehéz gyakorlat. Általában, amikor a programozók szoftvert fejlesztenek, az a céljuk, hogy a szoftver működjön, és ne törjön össze. Ebben a folyamatban sebezhetőségek alakulhatnak ki olyan esetekben, amikor egy régebbi funkciót használtak egy biztonságosabb helyett. Következésképpen az örökölt szoftverek különösen sebezhetőek.
A C egyike azoknak a nyelveknek, amelyek eleve nagyon sokoldalúak és erősek, de van egy kritikus hátránya – a C-alapú szoftverek biztonsága a programozó tudásától függ. Ez azt jelenti, hogy ha a programozó tisztában van a biztonságos kódolással, akkor a szoftvere is biztonságos lesz. Másrészt, és ez képezi a fő darabot, ha a programozó nem elég kifinomult, akkor a szoftverükben lesznek kiskapuk, amelyek végül kihasználáshoz vezetnek.
A hozzám hasonló, a programozásban jártas, de a biztonsági iparágban új embereknek nagyon fontos a sebezhető kód tanulmányozása és a lehetséges következmények megértése. Ez segít a kódolási készségek finomításában és a támadói attitűd kialakításában a kódolási fázis alatt, nem pedig a teljes szoftver kódolása UTÁN.
Őszintén szólva elég nehézkes egy alkalmazás teljes forráskódját tanulmányozni, amikor olyan sebezhetőségeket keresünk, mint a puffer túlcsordulás. Bár ennek a módszernek megvannak a maga érdemei, nem a legegyszerűbb módszer az egyszerű sebezhetőségek megtalálására, amelyek kritikusak lehetnek. Az ilyen sebezhetőségeket azonnal orvosolni kell, és ezek megtalálásának legegyszerűbb módja a Fuzzing nevű technika.
A Fuzzing egy olyan technika, amellyel “egyszerű” sebezhetőségeket találhatunk a kódban úgy, hogy “véletlenszerűen” generált adatokat küldünk egy futtatható programnak. Általában háromféle fuzzertípus létezik:
Mutáció: A “buta” fuzzing egy olyan típusa, ahol rosszul formált bemeneti mintákat generálnak és adnak a futtatható programnak. Ez a bemenet vagy megfelel, vagy nem felel meg az alkalmazás által elvárt bemenet típusának, így a valódi hibák megtalálásának valószínűsége nem nagy.
Generálás: Az “intelligens” fuzzing egy olyan típusa, amelyhez szükség van bizonyos kezdeti tesztadatokra, amelyekből a fuzzer algoritmus a semmiből rossz formájú bemenetet generálhat. Ez a fajta fuzzing sok esetben jobb, mint a dumb fuzzing, mert a program azt a bemenetet kapja, amire számít.
Evolúciós: Az ilyen típusú fuzzerek az egyes “fuzzok” visszajelzéseit használják arra, hogy idővel megtanulják a bemenet formátumát.
Ebben a bejegyzésben az American Fuzzy Lop (AFL) fuzzingot fogjuk megvizsgálni. Ez egyfajta evolúciós fuzzer, amely olyan programok fuzzolására alkalmas, amelyek STDIN-ből vagy egy fájlból veszik a bemenetet.