Kako koristiti AFL i AFL++ za efikasno fuzziranje binarnih datoteka

Posljednje ažuriranje: 28/02/2026
Autor: Isaac
  • Fuzz testiranje automatizira slanje neispravnih ulaza kako bi se otkrili sigurnosni propusti u softveru i sistemima.
  • AFL i AFL++ su inteligentni fuzzeri koji koriste instrumentirane kompajlere kako bi se vodili pokrivenošću i pronašli nove puteve izvršavanja.
  • Analiza rušenja sistema pomoću alata poput AFLTriage i GDB omogućava vam procjenu iskoristivosti ranjivosti poput Integer Underflow-a.
  • Integracija fuzzinga u razvojni ciklus poboljšava robusnost, pomaže u ispunjavanju sigurnosnih standarda i smanjuje rizik od kritičnih incidenata.

Fuzzing sa AFL-om u binarnom formatu

Ako vas zanima Binarno orijentisana sajber sigurnost i eksploatacijaPrije ili kasnije naići ćete na fuzzing, a posebno na AFL i AFL++. Ne govorimo o teorijskom laboratorijskom alatu, već o nečemu što se svakodnevno koristi za pronalaženje vrlo stvarnih nedostataka u poznatim programima, baš kao što se dogodilo s ranjivostima u... popularne aplikacije poput 7-Zip-a.

U narednim redovima ćemo detaljno i prijateljskim tonom vidjeti, Kako koristiti AFL i AFL++ za fuzziranje binarnih datotekaObjasnit ćemo tačno šta je fuzz testiranje, zašto je toliko moćno u smislu sigurnosti i kako ga integrirati u moderni razvojni tok rada. Također ćemo ispitati slučaj ranjivosti iz stvarnog svijeta (Integer Underflow koji omogućava udaljeno izvršavanje koda) i pregledati komplementarne alate kao što su GDB sa ekstenzijama, AFLTriage i operativnim modulima.

Šta su AFL/AFL++ i zašto se smatraju pametnim fuzzerima?

AFL alat za fuzz testiranje

AFL (američki Fuzzy Lop) i njegova evolucija AFL++ Ovo su alati otvorenog koda za fuzzing, dizajnirani za automatsko testiranje binarnih datoteka, tražeći greške poput prelijevanja, memorijskih grešaka ili neočekivanih ponašanja koja dovode do rušenja sistema ili čak ranjivosti koje se mogu iskoristiti.

Ljepota AFL-a nije samo slanje nasumičnih podataka, već... inteligentni fuzzer ili fuzzer vođen pokrivanjemPočevši od jednog ili više validnih primjera unosa (tzv. test cases), AFL stalno generira varijacije i, zahvaljujući instrumentaciji programa, detektira kada nova mutacija uzrokuje da binarni fajl krene drugačijim putem izvršavanja.

Da bi se postigla ova instrumentacija, AFL ima vlastite kompajlere, kao što su afl-gcc i afl-g++Oni ubacuju male "kuke" u kod tokom kompajliranja. Ove kuke obavještavaju AFL da je otkriven određeni ulaz. nove rute u toku programaOvo vam omogućava da se fokusirate na mutacije koje zapravo pružaju dodatnu pokrivenost i da ne gubite vrijeme s podacima koji ništa ne mijenjaju.

Ovaj pristup čini AFL nečim poput "dirb-a binarnih datoteka": dobro poznatim alatom, jednostavnim za korištenje kada shvatite osnovni tok i dovoljno moćnim da otkrijete ozbiljni nedostaci u proizvodnim programimačak i ako postoje napredniji ili specijalizirani fuzzeri.

Uvod u fuzz testiranje i njegovu ulogu u sajber sigurnosti

Fuzz testiranje, ili jednostavno fuzzing, je tehnika kojom se automatizirano testiranje sigurnosti i robusnostiIdeja je poslati aplikaciji poplavu deformisanih, nasumičnih ili neobičnih podataka, s ciljem da se vidi da li se program pokvari, ruši ili se ponaša neočekivano.

Kada je softver izložen fuzzingu, cilj je locirati greške kao što su prelijevanje bafera, greške u validaciji ulaza, problemi s upravljanjem memorijom ili uslovi utrkeMnogi od ovih nedostataka mogu dovesti do proizvoljnog izvršavanja koda, curenja informacija ili uskraćivanja usluge.

U tipičnom radnom procesu, fuzz testiranje slijedi tri jasne faze: prvo, generira se skup podataka za testiranje (bilo da je potpuno slučajan, generiran prema određenom formatu ili mutiranjem valjanih ulaza); zatim... izvršava binarni fajl koji se testira dok se nadgleda Njegovo ponašanje se prati; i konačno, padovi ili neobična ponašanja se bilježe i analiziraju kako bi programeri mogli istražiti izvor problema.

Postoje različite strategije fuzzinga. Neki alati se fokusiraju na generacijski neredkreiranje unosa koji poštuju dobro definirani format (na primjer, strukturu datoteke ili mrežni protokol); drugi su zasnovani na mutacija validnih ulazaUpravo je ovo pristup u kojem AFL i AFL++ prednjače. Postoje i nasumičniji pristupi, kao i oni koji se oslanjaju na specifično znanje o testiranom sistemu kako bi se ciljalo na njegove najslabije tačke.

U modernoj sajber sigurnosti, fuzz testiranje je osnovni saveznik: pomaže u pronalaženju ranjivosti u proaktivno, prije nego što softver krene u produkcijui doprinosi usklađenosti s propisima i standardima kao što je ISO 27001 ili zahtjevima za zaštitu podataka. Nadalje, smanjuje reputacijski rizik koji bi nastao ako bi kritična ranjivost koju je moguće iskoristiti pala u ruke napadača.

Slučaj iz stvarnog svijeta: Ranjivost dekompresora usljed nedovoljno velikog broja i RCE-a

Da bismo razumjeli pravu vrijednost AFL-a i fuzzing-a, vrlo je korisno pogledati specifičnu ranjivost na osnovu Integer Underflow unutar vrlo popularnog dekompresora datotekaOvo je greška udaljenog izvršavanja koda (RCE) koja se aktivira prilikom obrade komprimiranih datoteka Zstandardnim algoritmom, s visokim, iako ne maksimalnim, CVSS rezultatom, upravo zato što zahtijeva nešto specifičniji kontekst (na primjer, da se obrađuju određene datoteke).

Do prekoračenja cjelobrojnog broja dolazi kada cjelobrojna varijabla ima dobro definirane donje granice. Koristi se u operacijama oduzimanja sve dok se ne dostigne njegova minimalna vrijednost.Budući da mnogi cjelobrojni tipovi ne dozvoljavaju negativne vrijednosti, prilikom "padanja ispod nule", umjesto dobijanja broja ispod nule, dolazi do skoka na maksimalnu moguću vrijednost raspona, zbog načina na koji su ti brojevi interno predstavljeni.

  Potpišite skripte i osigurajte ExecutionPolicy pomoću AppLockera i WDAC-a

Zamislite cjelobrojnu varijablu koja, teoretski, nikada ne bi trebala biti negativna. Ako nastavite oduzimati konstantu dok ne dođete do 0 i nastavite oduzimati, Nećete dobiti -1, -2, itd.Umjesto toga, vrijednost će se invertirati i postati gigantski broj na gornjoj granici dozvoljenog raspona. Ova apsurdna brojka, ako se koristi kao indeks ili veličina u memorijskim operacijama, može uzrokovati čitanje ili pisanje izvan predviđenih granica.

Problem postaje kritičan kada se ta cjelobrojna varijabla koja može imati nedostatke u odnosu na prethodnu vrijednost koristi za za upravljanje baferom ili za izračunavanje pomakaTipičan pseudo-primjer bi bio korištenje korisnički kontrolirane varijable indirektno kao pomaka u funkciji tipa memcpy, u petlji koja smanjuje konstantu u svakoj iteraciji dok navodno ne dostigne nulu ili nepozitivan broj.

U takvom scenariju, ako početna vrijednost nikada ne uspije "čisto" zadovoljiti izlazni uvjet, nedostak će na kraju učiniti broj ogromnim, petlja će nastaviti s izvršavanjem i... masovno oštećenje pamćenjaTo se prevodi u padove sistema i, uz dovoljno eksploatacije, mogućnost izvršavanja proizvoljnog koda.

Kako AFL pomaže u lociranju ovih vrsta ranjivosti

Kada se shvati koncept cjelobrojnog nedovoljnog protoka (Integer Underflow), postaje jasno zašto su AFL i AFL++ toliko korisni: počevši od jedna ili nekoliko savršeno validnih ulaznih datotekaFuzzer može generirati desetine hiljada varijacija, sve dok ne naiđe na onu koja aktivira specifičnu grešku u pogođenoj putanji dekompresije.

Tokom fuzzinga, AFL prati instrumentalni binarni fajl kako bi utvrdio kada ulaz uzrokuje izvršavanje drugačije putanje kontrole toka. Svaki put kada detektuje novu putanju, Označi taj unos kao zanimljiv i čuva ga kao osnovu za buduće mutacije. Na ovaj način se ne istražuju samo uobičajeni putevi izvršavanja, već i one kombinacije podataka koje aktiviraju neobične rute koda, kao što je proces dekompresije sa čudnim parametrima.

U slučaju podlijevanja cijelog broja, AFL može pronaći uzorak koji uzrokuje da uključena varijabla nikada ne dostigne očekivanu izlaznu vrijednost u petlji. Rezultat je detektabilni pad sistema, koji će biti pohranjen u odgovarajućoj mapi AFL rezultata, spreman za daljnju analizu.

Nakon nekoliko minuta ili sati izvršavanja, uobičajeno je da AFL ukazuje na prvi relevantni sudarNisu sve greške koje pronađete iskoristive, ali su jasan pokazatelj da nešto u upravljanju memorijom, validaciji ulaza ili internoj logici binarnog fajla ne funkcioniše kako bi trebalo.

Tada na scenu stupaju alati za podršku poput AFLTriage-a ili debuggera poput GDB-a, koji vam omogućavaju da dublje istražite pad sistema, posmatrate stanje registara i memorije i procijenite da li se kvar može pouzdano iskoristiti ili je to jednostavno problem od male koristi sa stanovišta napadača.

Osnovna instalacija AFL / AFL++ i analitičkog okruženja

Postavljanje minimalnog okruženja za fuzzing sa AFL-om na standardnom Linux sistemu je prilično jednostavno. U mnogim distribucijama dovoljno je instalirati paket koji odgovara instrumentiranim kompajlerima, na primjer, korištenjem naredbe poput Instalirajte afl-g++ ili ekvivalentni AFL++ paket dovedite cijeli apartman.

Na taj način se instaliraju i alati za fuzzing (kao što su afl-fuzz) kao što su specijalizirani kompajleri (afl-gcc, afl-g++ i njihove moderne varijante u AFL++). Ove kompajlere ćete koristiti kada želite ponovo kompajlirati svoj cilj s instrumentacijom, što je ključno za maksimalno iskorištavanje fuzzinga vođenog pokrićem.

Pored samog fuzzera, dobro okruženje za debugging je praktično obavezno. Prošireni GDB sa dodaci poput PEDA ili GEF Olakšava život zahvaljujući dodatnim naredbama, praktičnom formatiranju memorije, vizualizacijama steka i prečicama za provjeru registara i mapa memorije.

Ako već nemate GDB, možete ga instalirati pomoću upravitelja paketa vaše distribucije. Zatim jednostavno integrirajte odabrani dodatak (na primjer, preuzimanjem GEF-a ili PEDA-e iz njihovih repozitorija i dodavanjem u vašu GDB konfiguracijsku datoteku ili korištenjem naredbe `source` unutar samog programa za otklanjanje grešaka).

Posjedovanje ovog „GDB-a na steroidima“ omogućit će vam analizu instrumentiranih binarnih datoteka koje se urušavaju pod fuzzingom, preuzimanje unosi koji uzrokuju pad sistema i pratite korak po korak šta se dešava u izvršenju tačno u trenutku kvara.

Kompajlirajte ciljni binarni fajl sa AFL-om za fuzzing

Kada imate AFL ili AFL++ spreman, sljedeći korak za ozbiljno fuzzing je kompajlirati cilj pomoću AFL kompajlerai da to učine s odgovarajućim opcijama kako bi se olakšala i analiza i potencijalna eksploatacija, u slučaju da je cilj vježbe ofanzivno istraživanje.

  SmartScreen blokira legitimne aplikacije: šta se dešava i šta treba učiniti

U velikim projektima, kao što su dekompresor ili paket uslužnih programa za arhiviranje, dobra je ideja omogućiti simbole za otklanjanje grešaka (opcija DEBUG ili zastavice poput -gi minimizirati optimizacije (na primjer, korištenjem -O0 umjesto -O2). Ovo uveliko pomaže u razumijevanju šta se dešava u izvornom kodu u vezi sa uočenim padom sistema.

Obično ćete morati pronaći odgovarajući makefile ili build fajl i modificirajte linije gdje su definirane zastavice kompajliranjaOvo može uključivati ​​aktiviranje DEBUG varijable, forsiranje određenog nivoa optimizacije i, što je najvažnije, zamjenu CC i CXX sa afl-gcc i afl-g++ (ili ekvivalentnim AFL++ alatima).

Na primjer, možete pokrenuti izgradnju s nečim poput CC=afl-gcc i CXX=afl-g++ zajedno s odgovarajućim makefileom. Rezultat će biti instrumentalizirana binarna datoteka koja uključuje potrebne hooks-ove tako da AFL može mjeriti pokrivenost tokom izvršavanja.

Kada je kompajliranje završeno, dobra je ideja provjeriti da li rezultirajuća binarna datoteka zaista ima simbole za otklanjanje grešaka i ispravnu arhitekturu, koristeći naredbu poput datoteka preko izvršne datotekeOvo osigurava da ne koristite fuzz na slijepo i da možete lako otkloniti greške u svim padovima koji se pojave.

Priprema testnih slučajeva i izvršavanje AFL-a

Prije pokretanja AFL-a na vašem binarnom fajlu, potrebno je da pripremite set minimalni broj važećih unosaAko testirate dekompresor koji ne uspijeva s datotekama komprimiranim pomoću određenog algoritma, morat ćete kreirati barem jednu dobro oblikovanu datoteku koja koristi tu metodu kompresije.

Uobičajena praksa je kreiranje direktorija, na primjer pod nazivom testcases, i pohranjivanje jednog ili više radnih primjera u njemu. Oni će poslužiti kao početna tačka za AFL. generira sve agresivnije mutacijepokušavajući otkriti nove putanje izvršavanja i, na kraju, dolazi do rušenja sistema.

Tipična naredba za pokretanje AFL-a izgleda otprilike ovako: navedite naziv sesije ili sinhronizacije, ulaznu mapu sa testnim slučajevima, izlaznu putanju gdje će se rezultati pohraniti i neke dodatne parametre poput vremenskog ograničenja kako biste izbjegli zaglavljivanje u beskonačnim petljama.

Komandna linija također određuje kako se ciljni program izvršava pomoću semafor @@koji će AFL automatski zamijeniti putanjom svakog testnog slučaja koji generira. Dakle, možete odrediti nešto poput ./binarni argumenti @@ a AFL će biti odgovoran za pokretanje izvršne datoteke hiljadama puta s različitim datotekama.

Važno je znati da se AFL u početku može žaliti na konfiguraciju sistema (zbog ograničenja resursa, core dumpova itd.). U tom slučaju, obično postoji pomoćni skript ili alat koji prilagođava parametre kernela i sesije kako bi se optimiziralo fuzzing okruženje, a koji treba pokrenuti s odgovarajućim dozvolama prije ponavljanja testa.

Analiza sudara pomoću AFLTriage i GDB

Nakon perioda prilagođavanja, AFL će postepeno popunjavati izlaznu mapu zanimljivim novim unosima i, prije svega, sa datoteke koje su uzrokovale pad sistemaObično se pohranjuju u određeni poddirektorij (na primjer, rušenja unutar mape sesije).

Kako biste izbjegli pretjerano pregledavanje svakog unosa pojedinačno, postoje alati poput AFLTriage-a koji vam omogućavaju da Automatski pokreni binarnu datoteku za svaku datoteku o padu sistema i generirati strukturirane izvještaje s detaljima o tome gdje i kako je došlo do kvara.

Prilikom pokretanja AFLTriage-a, navodite ulazni direktorij (fasciklu za pad sistema), izlazni direktorij za spremanje izvještaja i naredbu za pokretanje binarne datoteke pomoću @@. Alat će analizirati svaki slučaj i Generirat će tekstualne datoteke sa informacijama od interesa. za analitičara.

Tipičan sadržaj ovih izvještaja uključuje vrstu signala koji je uzrokovao pad sistema, smjer u kojem je došlo do greške, osnovni trag steka i, u mnogim slučajevima, funkciju ili makro gdje je došlo do greške koda (na primjer, specifična operacija kopiranja, petlja kompresije ili makro COPY_CHUNKS koji oduzima veličine u svakoj iteraciji).

Nakon što se locira zanimljiv pad sistema, sljedeći korak je njegova reprodukcija u GDB-u. Da bi se to uradilo, debugger se pokreće s binarnom datotekom i ulaznom datotekom krivca kao argumentima, a program se izvršava unutar GDB-a. Kada se pad sistema reprodukuje, stanje Ključni zapisi kao što su RAX, RDX itd., provjerite tačnu instrukciju koja se izvršava i konsultujte mape memorije (vmmap) da vidite koja regija se čita ili u koju se upisuje.

Od pada sistema do potencijalne eksploatacije: moduli za analizu u GDB-u

Pad binarnog fajla ne znači uvijek da se ranjivost može iskoristiti. Tu do izražaja dolaze GDB ekstenzije poput modula. iskoristiti, dizajniran da analizira kontekst pada sistema i ponudi grubu klasifikaciju da li se kvar može iskoristiti ili ne.

Ove vrste ekstenzija proučavaju aspekte kao što su validnost pokazivača instrukcije, stanje pokazivača steka, memorijske dozvole adrese na kojoj se vrši pokušaj čitanja ili pisanja i priroda signala koji je uzrokovao pad sistema. Sa svim ovim informacijama, one pružaju... indikativna presuda o potencijalu eksploatacije (na primjer, kategorizacijom greške kao vjerovatno iskoristive, moguće iskoristive ili od malog interesa).

  Kako spriječiti zlonamjerne linkove u Microsoft Teamsu

U slučaju Integer Underflow-a koji na kraju upisuje u memoriju samo za čitanje, dodatak može predložiti da je ovo potencijalno iskorištavajući slučaj jer se operacija pisanja izvodi izvan očekivanih ograničenja u području gdje se ništa ne bi trebalo dirati.

Neće svi scenariji biti tako jednostavni, ali ova kombinacija AFL-a za otkrivanje pada sistema, AFLTriage-a za grupiranje i opisivanje slučajeva i GDB-a s proširenjima za procjenu iskoristivosti, formira Vrlo robustan binarni revizijski cjevovodOd tog trenutka, preostali posao se svodi isključivo na istraživanje i razvoj exploita, nešto što može enormno varirati u složenosti ovisno o binarnoj i aktivnoj zaštiti.

Još jedan ključni dio analize, posebno kada se objave CVE i povezana zakrpa, jeste pregled kako je ranjivost ispravljena u izvornom kodu. To obično uključuje promjene u vrsti korištenih podataka (na primjer, prelazak sa potpisanog bajta na nepotpisani bajt, proširenje raspona) i uključivanje dodatnih provjera (if-ova koji vraćaju kodove grešaka ako su prekoračena određena ograničenja) kako bi se spriječilo prelijevanje ili oštećenje memorije.

Ostali relevantni fuzzeri i alati u ekosistemu

Iako su AFL i AFL++ među najpoznatijim opcijama za fuzziranje izvornih binarnih datoteka, ekosistem fuzz testiranja je mnogo širi i vrijedi ga pratiti ako redovno radite s... sigurnost softvera.

Među najčešće korištenim opcijama je LibFuzzer, biblioteka koju je prvobitno razvio Google, a koja se direktno integriše sa C/C++ kodom i izvršava fuzzing na nivou specifičnih funkcija, idealno za testiranje pojedinačnih komponenti sa visoko kontrolisanim ulazima.

Tu je i Peach Fuzzer, platforma opće namjene i s više mogućnosti konfiguracije koja vam omogućava definiranje tačni modeli protokola, formata datoteka i složenih strukturaVeoma je popularan u sektorima gdje je pouzdanost kritična, kao što su industrijski sistemi ili IoT okruženja.

U web domenu, alati poput OWASP ZAP-a uključuju fuzzing module usmjerene na web aplikacije, sposobne za slanje manipulisani zahtjevi, deformisana učitavanja i testovi injekcije HTTP krajnje tačke za otkrivanje ranjivosti kao što su SQL injekcije, problemi s validacijom unosa ili greške u obradi obrazaca.

Sve ovo dopunjuje AFL/AFL++ binarno fuzzing, jer omogućava pokrivanje od niskonivojskog izvornog koda do slojeva aplikacije koji su najizloženiji krajnjem korisniku. Zajednički cilj u svim slučajevima je isti: automatizirati potragu za ranjivostima prije nego što to učine napadači.

Kako integrirati fuzz testiranje u razvojni ciklus

Da bi fuzzing dosljedno pružao stvarnu vrijednost, nije dovoljno samo povremeno pokrenuti AFL ili AFL++ i zaboraviti na to. Mnogo je efikasniji. Integracija fuzz testiranja u životni ciklus razvoja softvera, na sličan način kao što se to radi s jediničnim ili integracijskim testovima.

Prvi korak je definiranje koji su dijelovi sistema najkritičnijiParseri datoteka, mrežni moduli, komponente koje obrađuju korisničke podatke ili eksterno izložene usluge. Specifične fuzzing kampanje mogu se dizajnirati oko ovih ciljeva, koristeći pažljivo odabrane testne slučajeve.

Zatim, potrebno je odabrati pravi alat za svaki slučaj. Za složene izvorne binarne datoteke, AFL++ ili LibFuzzer su obično prirodni kandidati, dok će za web API-je ili HTTP aplikacije, web-orijentisani alat imati više smisla. Važno je da se fuzzing izvršava ispravno. ponovljivo i automatizirano.

Integracija sa CI/CD sistemima je veoma korisna: cjevovod se može konfigurisati tako da se, u određenim granama ili prije određenih implementacija, pokreće fuzzing baterija sa ograničenim vremenom, čuvajući sve pronađene nove padove i neuspjevajući izgradnju ako se pojave potencijalno ozbiljne ranjivosti.

Konačno, važno je shvatiti da je fuzzing iterativni proces. Svaki put kada se greška ispravi, pogođena komponenta treba ponovo fuzzirati kako bi se provjerilo da li zakrpa radi i da nisu uvedene nove greške. nema novih regresija ili ranjivostiNa ovaj način, fuzz testiranje postaje dodatni sloj kontinuirane zaštite, a ne izolirana revizija.

Uzevši sve gore navedeno u obzir, pokazuje kako nam AFL, AFL++ i fuzz testiranje općenito omogućavaju prelazak sa sigurnosnog pristupa zasnovanog isključivo na ručnim pregledima na sveobuhvatniji pristup. mnogo automatizovanije i temeljitijeSposoban je otkriti greške koje bi inače ostale skrivene. Rad sa slučajevima iz stvarnog svijeta, kao što su ranjivosti usljed nedovoljnog protoka (underflow) u široko korištenim dekompresorima, također pomaže u razumijevanju da ovo nije samo teorija, već problemi koji se već iskorištavaju. Stoga, ažuriranje softvera i njegovo redovno izlaganje fuzzingu može napraviti razliku između kompromitovanog i otpornog sistema.