Vodič za testiranje fuzza (Fuzzing).

⚡ Pametni sažetak

Fuzz testiranje unosi nevažeće, neočekivane ili nasumične podatke u program i prati padove, zastoje i memorijske pogreške, otkrivajući sigurnosne nedostatke do kojih skriptirani funkcionalni testovi gotovo nikada ne dopiru sami.

  • 🔘 Podrijetlo: Barton Miller skovao je taj termin na Sveučilištu Wisconsin-Madison, a prva fuzz izvršavanja 1989. godine srušila su otprilike trećinu testiranih UNIX uslužnih programa.
  • ☑️ Petlja od šest koraka: Identificirajte cilj, identificirajte ulaze, generirajte fuzzed podatke, izvršite, pratite ponašanje, a zatim zabilježite svaki nedostatak koji se pojavi.
  • ✅ Tri strategije generacije: Mutacijski fuzzeri mijenjaju valjane uzorke, generacijski fuzzeri grade ulaze iz modela, a protokolarni fuzzeri rade prema specifikaciji.
  • 🧪 Povratne informacije o pokrivenosti promijenile su polje: Moderni engine-i čuvaju sve ulazne podatke koji dođu do novog koda, koji pronalazi daleko dublje greške od čisto nasumičnih podataka.
  • 🛠️ Alatarstvo je napredovalo: Peach Fuzzer i WebScarab su arhivirani, dok su AFL++, libFuzzer, OSS-Fuzz, boofuzz ​​i OWASP ZAP održavane opcije.
  • ️ Poznate granice: Fuzzing pronalazi padove, a ne logičke nedostatke, pa nadopunjuje, a ne zamjenjuje pregled koda i testiranje penetracije.

Vodič za testiranje fuzza (Fuzzing).

Što je Fuzz testiranje?

Fuzz testiranje ili fuzzing je tehnika testiranja softvera unošenjem nevažećih ili nasumičnih podataka nazvanih FUZZ u softverski sustav kako bi se otkrile pogreške u kodiranju i sigurnosne rupe. Svrha fuzz testiranja je umetanje podataka pomoću automatiziranih ili poluautomatiziranih tehnika i testiranje sustava na razne iznimke poput rušenja sustava ili kvara ugrađenog koda.

Fuzz testiranje izvorno je razvio Barton Miller na Sveučilištu Wisconsin-Madison, koji je skovao termin nakon što je šum u liniji na modemskoj vezi srušio programe koje je koristio. Njegovi studenti su pokrenuli prve fuzzere 1989. godine i otkrili da se otprilike trećina UNIX uslužnih programa koje su ciljali srušila ili zamrznula. Fuzz testiranje je... testiranje softvera tehnika, i to je vrsta Ispitivanje sigurnosti.

Donji dijagram prikazuje osnovnu fuzzing petlju, gdje se generirani podaci šalju testiranoj aplikaciji i promatra se odgovor.

Tijek rada fuzz testiranja: fuzzer generira neispravan ulaz i šalje ga testiranoj aplikaciji.

Zašto raditi Fuzz testiranje?

Fuzzing zaslužuje svoje mjesto u planu testiranja jer istražuje ulazne podatke za koje nitko nije pomislio napisati testni slučaj. Glavni razlozi zašto ga timovi usvajaju navedeni su u nastavku.

  • Fuzz testiranje obično pronalazi najozbiljnije sigurnosne greške i nedostatke, jer je pad sustava izravan dokaz neobrađenog ulaznog puta.
  • Fuzz testiranje daje učinkovitiji rezultat kada se koristi s Crna Box Ispitivanje, beta testiranje i druge metode otklanjanja pogrešaka.
  • Fuzz testiranje se koristi za provjeru ranjivosti softvera i vrlo je isplativa tehnika testiranja jer se ulazi generiraju, a ne pišu rukom.
  • Fuzz testiranje je jedna od tehnika testiranja crne kutije. Fuzzing je također jedna od najčešćih metoda koje hakeri koriste za pronalaženje ranjivosti u sustavu, pa njegovo prvo pokretanje uklanja napadaču najlakši put ulaska.

Vrste fuzz testiranja

Fuzzeri se obično grupiraju prema tome koliko znaju o programu koji napadaju. Što više fuzzer zna, to dublje u kod može ući.

Tip Što zna fuzzer Tipična upotreba
Zamagljivanje crne kutije Ništa o unutarnjim dijelovima; vidi samo ulaze i izlaze. Quick smoke se pokreće protiv binarne datoteke ili aktivne krajnje točke.
Bijela kutija zamućenja Potpuni izvorni kod, često kombiniran sa simboličkim izvršavanjem za rješavanje teško dostupnih grana. Dubinska analiza komponente čiji je izvor dostupan.
Siva kutija s paperjem Nema pregleda izvornog koda, već povratne informacije tijekom izvođenja, poput toga koje su grane koda do kojih je ulaz došao. Zadana vrijednost za moderne programere poput AFL++ i libFuzzer.

Drugi, stariji razdor razdvaja glupo mutanje iz pametno fuziranjeGlupi fuzzer okreće bitove bez ikakve ideje o ulaznom formatu, pa većinu njegovih podataka odbacuje prvi parser na koji naiđe. Pametni fuzzer razumije kontrolne zbrojeve, polja duljine i strukturu poruke, pa njegovi ulazi preživljavaju validaciju i dosežu logiku ispod. Fuzzing vođen pokrivanjem je poboljšanje sive kutije koje je učinilo fuzzing mainstreamom: engine instrumentira binarni kod, zadržava svaki ulaz koji dosegne novu granu i mutira preživjele, tako da se korpus stalno razvija prema neistraženom kodu umjesto da se ponovno pokreće od slučajne buke.

Kako napraviti Fuzz testiranje

Koraci za fuzz testiranje uključuju osnovne korake testiranja:

Korak 1) Identificirajte ciljni sustav — odaberite binarnu, bibliotečnu, servisnu ili protokolarnu krajnju točku koja će biti napadnuta i potvrdite da vam je dopušteno testiranje.

Korak 2) Identificirajte ulaze — navedite svaku ulaznu točku s koje cilj čita: datoteke, argumente naredbenog retka, varijable okruženja, mrežne pakete, polja obrasca i API korisne sadržaje.

Korak 3) Generirajte Fuzzed podatke — proizvode deformirane ulaze mutiranjem valjanih uzoraka, generiranjem iz modela formata ili kombiniranjem oboje.

Korak 4) Izvršite test koristeći fuzzy podatke — pokrenuti cilj u odnosu na generirane ulaze, idealno u petlji koja automatski ponovno pokreće proces nakon svakog kvara.

Korak 5) Pratite ponašanje sustava — pazite na padove, zamrzavanja, neuspjehe assertacija, prekomjerno korištenje memorije i izvješća o sanitizatoru umjesto da samo provjeravate ispisani izlaz.

Korak 6) Zabilježite nedostatke — spremi točan ulaz koji je izazvao svaki kvar, smanji ga na najmanji reproducirajući slučaj i pohrani ga sa stogom tracu prilogu.

Primjeri Fuzzera

Fuzzeri se također klasificiraju prema načinu na koji grade svoj unos, a tri pristupa u nastavku su ona s kojima ćete se najčešće susresti.

  • Fuzzeri temeljeni na mutaciji mijenjati postojeće uzorke podataka kako bi se stvorili novi testni podaci. Ovo je vrlo jednostavan i izravan pristup: počinje s valjanim uzorcima protokola i nastavlja mijenjati svaki bajt ili datoteku.
  • Fuzzeri temeljeni na generaciji definiraju nove podatke na temelju ulaznih podataka modela. Počinju generirati ulazne podatke od nule na temelju specifikacije.
  • Fazzer-i temeljeni na protokolu ovise o detaljnom poznavanju formata protokola koji se testira, a to razumijevanje dolazi iz specifikacije. To uključuje upisivanje niza specifikacije u alat, a zatim korištenje tehnike generiranja testova temeljene na modelu za prolazak kroz specifikaciju i dodavanje nepravilnosti u sadržaju podataka, redoslijedu i tako dalje. To je također poznato kao testiranje sintakse, testiranje gramatike ili testiranje robusnosti. Fuzzer može generirati testne slučajeve iz postojećeg ili može koristiti valjane ili nevaljane ulaze.

Postoje dva ograničenja fuzzinga temeljenog na protokolu:

  1. Testiranje se ne može nastaviti dok specifikacija ne bude zrela.
  2. Mnogi korisni protokoli su proširenje objavljenih protokola. Ako se fuzz testiranje temelji na objavljenim specifikacijama, Pokrivenost testom za nove protokole bit će ograničeni.

Najjednostavniji oblik fuzzing tehnike je slanje slučajnog ulaza softveru bilo kao protokol paketa ili kao događaja. Ova tehnika prosljeđivanja slučajnog ulaza vrlo je moćna za pronalaženje grešaka u mnogim aplikacijama i uslugama. Dostupne su i druge tehnike koje je vrlo lako implementirati. Za implementaciju ovih tehnika samo trebamo promijeniti postojeće ulaze, a ulaz možemo promijeniti jednostavnom zamjenom njegovih bitova.

Vrste grešaka koje je otkrilo Fuzz testiranje

Budući da fuzzing ocjenjuje izvršavanje na temelju ponašanja programa, a ne na temelju očekivane vrijednosti, nedostaci koje otkriva grupiraju se u tri obitelji.

  • Neuspjesi asercija i curenje memorije: Ova metodologija se široko koristi za velike aplikacije gdje greške utječu na sigurnost memorije, što je ozbiljna ranjivost. Buffer Ovdje se pojavljuju prelijevanja, čitanja nakon oslobađanja i čitanja izvan granica.
  • Nevažeći unos: U fuzz testiranju, fuzzeri se koriste za generiranje nevažećih ulaznih podataka koji se koriste za testiranje rutina za rukovanje greškama, a to je važno za softver koji ne kontrolira svoj ulaz. Jednostavno fuzziranje može se smatrati načinom automatizacije negativno testiranje.
  • Greške u ispravnosti: Fuzzing se također može koristiti za otkrivanje nekih vrsta grešaka u "ispravnosti", poput oštećene baze podataka ili loših rezultata pretraživanja. Diferencijalni fuzzing, koji daje isti ulaz dvjema implementacijama i uspoređuje odgovore, uobičajeni je način za njihovo otkrivanje.

Alati za testiranje fuzza

Alati koji se koriste u web sigurnosti mogu se široko koristiti u fuzz testiranju, kao što su Burp Suite i Peach Fuzzer. Nekoliko klasičnih imena u nastavku sada je arhivirano, pa je njihov trenutni status naveden uz svaki unos.

  • Peach FuzzerPeach Fuzzer pruža robusniju sigurnosnu pokrivenost od skenera. Drugi alati za testiranje mogu pretraživati ​​samo poznate prijetnje, dok Peach Fuzzer omogućuje korisnicima pronalaženje poznatih i nepoznatih prijetnji. Peach Tech je preuzeo GitLab, a Community Edition v3 se više ne održava; održavani nasljednik je GitLab Protocol Fuzzer Community Edition.
  • Spike Proxy: profesionalni alat koji traži ranjivosti na razini aplikacije u web aplikacijama. SPIKE Proxy pokriva osnove, kao što su SQL Injektiranje i cross-site scripting, na potpuno otvorenom Python infrastrukturu, i bila je dostupna za Linux i WindowsNije održavan dugi niz godina i ovdje je uključen zbog povijesnog konteksta.
  • WebScarabWebScarab je napisan u Java i stoga je prenosiv na mnoge platforme. WebScarab okvir komunicira putem HTTP i HTTPS protokola i radi kao presretanje: omogućuje operateru pregled i izmjenu zahtjeva koje je kreirao preglednik prije nego što ih poslužitelj primi te pregled i ažuriranje odgovora koje je generirao poslužitelj prije nego što ih preglednik primi. Svaka rupa u zakonu koju WebScarab pronađe dodaje se na popis prijavljenih problema. Repozitorij je arhiviran u travnju 2024. i sada je samo za čitanje.
  • OWASP WSFuzzerWSFuzzer je program napisan pod GPL licencom Python koji je ciljao web servise, a u svojoj posljednjoj verziji temeljen na HTTP-u SOAP usluge bili su glavna meta. Isporučivao se kao dio WebScaraba i umirovljen je s njim; OWASP ZAP i njegov dodatak Fuzzer su preporučena zamjena.
  • Održane alternative: AFL++ i libFuzzer su standardni mehanizmi vođeni pokrivanjem za izvorni kod, OSS-Fuzz provodi ih kontinuirano i besplatno za projekte otvorenog koda i glupan pokriva fuzzing mrežnog protokola u PythonŠiri popis sastavljen je u vodiču za alati za testiranje sigurnosti.

Najbolje prakse fuzz testiranja

Fuzzer koji je usmjeren prema meti i ostavljen na miru rijetko pronalazi mnogo. Praksa u nastavku razlikuje kampanju koja proizvodi dokumentirane nedostatke od one koja samo troši CPU vrijeme.

  • Počnite s dobrim sjemenskim korpusom. Prikupljajte stvarne, valjane ulaze koje aplikacija već prihvaća. Mutiranjem stvarne datoteke postiže se parsirajući kod puno brže od mutacije nasumičnih bajtova.
  • Napišite mali, brzi pojas. Ulazna točka trebala bi raditi jednu stvar po pokretanju, izbjegavati mrežne pozive i pisanje na disk te se brzo vraćati jer se propusnost mjeri u izvršavanjima u sekundi.
  • Uključite sredstva za dezinfekciju. Tiha korupcija memorije često ne uzrokuje pad sustava. AddressSanitizer i UndefinedBehaviorSanitizer pretvaraju je u trenutni, dijagnosticirani kvar.
  • Trči dugo i trči neprekidno. Jednosatno ili dvosatno izvođenje otkriva plitke greške; duboke putanje obično zahtijevaju mnogo sati, zbog čega fuzzing pripada noćnom CI zadatku, a ne ručnoj sesiji.
  • Minimizirajte i uklonite duplikate svakog rušenja. Sažmi neuspjeli ulaz na najmanji oblik i grupiraj rušenja po stogu trace, inače jedna buba stiže kao stotine ulaznica.
  • Vodite regresijski korpus. Dodajte svaki reproducirajući ulaz trajnom skupu koji se pokreće na svakoj izgradnji, tako da se ispravljeni nedostatak ne može tiho vratiti.
  • Pravno odredite cilj. Fazziranje aktivne usluge treće strane bez pismenog dopuštenja ne razlikuje se od napada.

Prednosti Fuzz testiranja

Korišteno s realnim očekivanjima, fuzzing dodaje vrijednost koju druge tehnike teško mogu dostići.

  • Fuzz testiranje poboljšava sigurnosno testiranje softvera.
  • Greške pronađene u fuzzingu ponekad su ozbiljne i često su iste one koje koriste napadači, uključujući rušenja, curenje memorije i neobrađene iznimke.
  • Ako testeri ne uoče neke greške zbog ograničenja vremena i resursa, te se greške također pronalaze u fuzz testiranju.
  • Ulazne podatke generira stroj, tako da pokrivenost raste preko noći bez dodatnog ručnog napora.

Nedostaci fuzz testiranja

Ista svojstva koja čine fuzzing jeftinim također ograničavaju ono što on može dokazati.

  • Samo fuzz testiranje ne može pružiti potpunu sliku ukupne sigurnosne prijetnje ili skupa grešaka.
  • Fuzz testiranje je manje učinkovito u suočavanju sa sigurnosnim prijetnjama koje ne uzrokuju pad programa, kao što su neki virusi, crvi i trojanci.
  • Fuzz testiranje može otkriti samo relativno jednostavne greške ili prijetnje i neće razmatrati poslovnu logiku.
  • Za učinkovit rad potrebno je značajno strojno vrijeme.
  • Postavljanje uvjeta granične vrijednosti sa slučajnim ulazima vrlo je problematično, iako testeri sada velik dio toga rješavaju determinističkim algoritmima vođenim korisničkim unosi.

Fuzz testiranje u odnosu na penetracijsko testiranje

Obje aktivnosti traže sigurnosne nedostatke, ali odgovaraju na različita pitanja i rijetko su zamjenjive.

Kriteriji Fuzz testiranje Ispitivanje penetracije
Vođen od strane Automatizirani mehanizam generira neispravan unos Vješt tester razmišlja o sustavu
Traži Rušenja, zamrzavanja i greške u sigurnosti memorije Iskoristive slabosti, uključujući logičke i konfiguracijske nedostatke
Dubina Vrlo širok obuhvat ulaznih podataka, plitko razmišljanje Uska pokrivenost, duboko razmišljanje
Izlaz Reprodukcija ulaza i stoga traces Izvješće o nalazima s putovima iskorištavanja i ocjenama rizika
Najbolji trenutak Kontinuirano, u procesu izgradnje Povremeno, protiv kandidata za oslobađanje

U praksi se to dvoje međusobno nadopunjuje: fuzzing uklanja jeftine, automatizirane rušenja tako da ograničeni sati testera idu na nedostatke koje će uočiti samo čovjek.

Pitanja i odgovori

Početni skup valjanih ulaza koje fuzzer mutira je početni skup. Male, raznolike, stvarne datoteke najbolje funkcioniraju jer svaka od njih već prolazi parser i omogućuje engineu da potroši svoj budžet na dublji kod umjesto na prvu provjeru valjanosti.

Fuzz harness je mala funkcija koja predaje jedan međuspremnik fuzziranih bajtova kodu koji se testira. Trebala bi izbjegavati globalno stanje, pisanje u datoteke i mrežne pozive, tako da ga engine može pokrenuti tisuće puta u sekundi.

Sat ili dva otkrivaju površne greške. Ozbiljne kampanje traju satima ili danima, jer nova pokrivenost stiže u naletima. Plato u krivulji pokrivenosti, a ne očitavanje sata, iskren je signal da se kampanja prestala isplatiti.

AddressSanitizer hvata prelijevanje međuspremnika i korištenje nakon oslobađanja, UndefinedBehaviorSanitizer hvata zlouporabu cijelih brojeva i pokazivača, a MemorySanitizer hvata čitanja neinicijalizirane memorije. Bez njih mnoga oštećenja prolaze tiho i fuzzer uopće ne prijavljuje nikakvu grešku.

Reproduciraj ga, minimiziraj ulaz na najmanji slučaj kvara, grupiraj ga s rušenjima koja dijele isti stog trace, zatim podnesite jednu kartu putem uobičajenog proces upravljanja nedostacima i dodajte ulaz u regresijski korpus.

Dijele slučajnost, ali ne i namjeru. Testiranje na majmunima baca proizvoljne korisničke akcije na sučelje koje se izvršava, dok fuzzing cilja određeni parser ulaza i mjeri pokrivenost koda, tako da se može usmjeriti prema kodu do kojeg raniji ulazi nikada nisu došli.

Jezični modeli koriste se za izradu sustava za nefuzzirane API-je, za sintezu početnih ulaza za egzotične formate te za grupiranje i sažimanje izvješća o rušenju sustava. Mehanizam i dalje pruža povratne informacije o pokrivenosti; model uglavnom uklanja ručni rad na postavljanju.

GitHub kopilot može izraditi ulaznu točku libFuzzera, datoteku za izgradnju i generator početnih vrijednosti iz postojećeg API potpisa. RevPažljivo pogledajte rezultat, budući da sustav koji tiho proguta greške neće prijaviti pad sustava.

Sažmite ovu objavu uz: