Fuzz-testauksen (fuzzing) opetusohjelma

⚡ Älykäs yhteenveto

Fuzz Testing syöttää ohjelmaan virheellistä, odottamatonta tai satunnaista dataa ja tarkkailee kaatumisia, jumiutumisia ja muistivirheitä paljastaen tietoturva-aukkoja, joihin skriptatut toiminnalliset testit eivät melkein koskaan itse löydä.

  • 🔘 Alkuperä: Barton Miller loi termin Wisconsinin ja Madisonin yliopistossa, ja ensimmäiset fuzz-ajot vuonna 1989 kaatuivat noin kolmanneksessa testatuista UNIX-apuohjelmista.
  • ☑️ Kuusivaiheinen silmukka: Tunnista kohde, tunnista syötteet, luo sumeaa dataa, suorita, valvo toimintaa ja kirjaa sitten kaikki ilmenevät viat.
  • ✅ Kolme sukupolven strategiaa: Mutaatiofuzzerit sotkevat valideja näytteitä, generointifuzzerit rakentavat syötteitä mallista ja protokollafuzzerit toimivat spesifikaation pohjalta.
  • 🧪 Palaute uutisoinnista muutti tilannetta: Nykyaikaiset moottorit säilyttävät kaiken syötteen, joka saavuttaa uuden koodin, joka löytää paljon syvempiä virheitä kuin puhtaasti satunnainen data.
  • 🛠️ Työkalut ovat kehittyneet: Peach Fuzzer ja WebScarab on arkistoitu, kun taas AFL++, libFuzzer, OSS-Fuzz, boofuzz ​​ja OWASP ZAP ovat ylläpidettyjä vaihtoehtoja.
  • ⚙️ Tunnetut rajoitukset: Fuzzing löytää kaatumisia, ei logiikkavirheitä, joten se täydentää eikä korvaa koodikatselmusta ja penetraatiotestausta.

Fuzz-testauksen (fuzzing) opetusohjelma

Mitä on Fuzz-testaus?

Fuzz-testaus tai fuzzing on ohjelmistotestaustekniikka, jossa ohjelmistojärjestelmään lisätään virheellistä tai satunnaista dataa, jota kutsutaan nimellä FUZZ, koodausvirheiden ja tietoturva-aukkojen löytämiseksi. Fuzz-testauksen tarkoituksena on lisätä dataa automatisoitujen tai puoliautomaattisten tekniikoiden avulla ja testata järjestelmää erilaisten poikkeusten, kuten järjestelmän kaatumisten tai sisäänrakennetun koodin virheiden, varalta.

Fuzz-testauksen kehitti alun perin Barton Miller Wisconsinin ja Madisonin yliopistosta. Hän loi termin sen jälkeen, kun modeemilinkin linjakohina kaatoi hänen käyttämänsä ohjelmat. Hänen opiskelijansa ajoivat ensimmäiset fuzz-testaukset vuonna 1989 ja havaitsivat, että noin kolmannes heidän kohdistamista UNIX-apuohjelmista kaatui tai jumiutui. Fuzz-testaus on ohjelmistojen testaus tekniikka, ja se on eräänlainen Suojaustestaus.

Alla oleva kaavio näyttää fuzzing-silmukan perusmuodon, jossa luotu data syötetään testattavaan sovellukseen ja vastetta tarkkaillaan.

Fuzz-testauksen työnkulku: fuzzer luo epämuotoisen syötteen ja syöttää sen testattavalle sovellukselle

Miksi tehdä Fuzz-testaus?

Fuzzing ansaitsee paikkansa testaussuunnitelmassa, koska se tutkii syötteitä, joita varten kukaan ei ole ajatellut kirjoittaa testitapausta. Tärkeimmät syyt, miksi tiimit ottavat sen käyttöön, on lueteltu alla.

  • Fuzz-testaus löytää yleensä vakavimmat tietoturvaviat ja -puutteet, koska kaatuminen on suora todiste käsittelemättömästä syöttöpolusta.
  • Fuzz-testaus antaa tehokkaamman tuloksen, kun sitä käytetään yhdessä Musta Box Testaus, beta-testaus ja muut virheenkorjausmenetelmät.
  • Fuzz-testausta käytetään ohjelmistojen haavoittuvuuksien tarkistamiseen, ja se on erittäin kustannustehokas testaustekniikka, koska syötteet generoidaan käsin kirjoitettujen sijaan.
  • Fuzz-testaus on yksi mustan laatikon testaustekniikoista. Fuzz on myös yksi yleisimmistä menetelmistä, joita hakkerit käyttävät järjestelmän haavoittuvuuksien löytämiseen, joten sen suorittaminen ensin poistaa hyökkääjän helpoimman reitin sisään.

Fuzz-testauksen tyypit

Fuzzerit ryhmitellään yleensä sen mukaan, kuinka paljon ne tietävät hyökkäämästään ohjelmasta. Mitä enemmän fuzzeri tietää, sitä syvemmälle koodiin se voi työntää.

Tyyppi Mitä sumuttaja tietää Tyypillinen käyttö
Mustan laatikon sumeus Ei mitään sisäosista; se näkee vain tulot ja lähdöt. Quick Smoke suoritetaan binääritiedostoa tai live-päätepistettä vastaan.
Valkoisen laatikon sumentuminen Täysi lähdekoodi, usein yhdistettynä symboliseen suoritukseen vaikeasti tavoitettavien haarojen ratkaisemiseksi. Syvällinen analyysi komponentista, jonka lähde on saatavilla.
Harmaan laatikon sumentuminen Ei lähdekoodin tarkistusta, mutta ajonaikaista palautetta, kuten mihin koodihaaraan syöte päätyi. Oletusarvo moderneille hakukoneille, kuten AFL++ ja libFuzzer.

Toinen, vanhempi ero erottaa tyhmä hölynpöly alkaen älykäs sumeusTyhmä fuzzeri kääntää bittejä taaksepäin ilman mitään käsitystä syöttömuodosta, joten ensimmäinen kohtaama jäsennin hylkää suurimman osan sen datasta. Älykäs fuzzeri ymmärtää tarkistussummat, pituuskentät ja viestirakenteen, joten sen syötteet selviävät validoinnista ja saavuttavat alla olevan logiikan. Kattavuusohjattu sumeus on harmaan laatikon hienosäätö, joka teki fuzzingista valtavirtaa: moottori instrumentoi binäärikoodin, säilyttää kaikki uuteen haaraan johtavat syötteet ja mutatoi eloonjääneet, joten korpus kehittyy tasaisesti kohti tutkimatonta koodia sen sijaan, että se käynnistyisi uudelleen satunnaisesta kohinasta.

Kuinka tehdä Fuzz-testaus

Fuzz-testauksen vaiheet sisältävät testauksen perusvaiheet:

Vaihe 1) Tunnista kohdejärjestelmä — valitse hyökkäyksen kohteena oleva binääri-, kirjasto-, palvelu- tai protokollapäätepiste ja vahvista, että sinulla on lupa testata sitä.

Vaihe 2) Tunnista tulot — listaa kaikki aloituskohdat, joista kohde lukee: tiedostot, komentoriviargumentit, ympäristömuuttujat, verkkopaketit, lomakekentät ja API-hyötykuormat.

Vaihe 3) Luo sumea data — tuottaa virheellisesti muotoiltuja syötteitä muuntamalla kelvollisia näytteitä, luomalla ne formaatin mallista tai yhdistämällä molempia.

Vaihe 4) Suorita testi käyttämällä sumeaa dataa — ajaa kohdetta luotuja syötteitä vasten, mieluiten silmukassa, joka käynnistää prosessin automaattisesti uudelleen jokaisen virheen jälkeen.

Vaihe 5) Tarkkaile järjestelmän toimintaa — tarkkaile kaatumisia, jumiutumisia, vahvistusvirheitä, ylikuormitettua muistinkäyttöä ja puhdistusraportteja pelkän tulosteen tarkistamisen sijaan.

Vaihe 6) Loki viat — tallenna tarkka syöte, joka laukaisi kunkin vian, kutista se pienimpään toistuvaan tapaukseen ja arkistoi se pinoon trace liitteenä.

Esimerkkejä Fuzzereista

Fuzzerit luokitellaan myös sen mukaan, miten ne rakentavat syötteen, ja alla olevat kolme lähestymistapaa ovat ne, joihin törmäät useimmin.

  • Mutaatiopohjaiset sumuttimet muokata olemassa olevia datanäytteitä luodakseen uutta testidataa. Tämä on hyvin yksinkertainen ja suoraviivainen lähestymistapa: se aloittaa valideilla protokollan näytteillä ja jatkaa jokaisen tavun tai tiedoston muokkaamista.
  • Sukupolvipohjaiset fuzzerit määrittelevät uutta dataa mallin syötteen perusteella. He alkavat tuottaa syötettä tyhjästä spesifikaation perusteella.
  • Protokollapohjaiset fuzzerit riippuvat testattavan protokollamuodon yksityiskohtaisesta tiedosta, ja tämä ymmärrys tulee spesifikaatiosta. Se tarkoittaa spesifikaation taulukon kirjoittamista työkaluun ja sitten mallipohjaisen testigenerointitekniikan käyttöä spesifikaation läpikäymiseksi ja epäsäännöllisyyksien lisäämiseksi tietosisältöön, järjestykseen jne. Tätä kutsutaan myös syntaksitestaukseksi, kielioppitestaukseksi tai kestävyystestaukseksi. Fuzzer voi luoda testitapauksia olemassa olevasta tai se voi käyttää kelvollisia tai virheellisiä syötteitä.

Protokollapohjaisella fuzzingilla on kaksi rajoitusta:

  1. Testausta ei voi jatkaa ennen kuin spesifikaatio on kypsä.
  2. Monet hyödylliset protokollat ​​ovat julkaistujen protokollien laajennuksia. Jos fuzz-testaus perustuu julkaistuihin spesifikaatioihin, Testin kattavuus uusille protokollille on rajoitettu.

Yksinkertaisin sumeustekniikan muoto on lähettää ohjelmistolle satunnaista syötettä joko protokollapaketteina tai tapahtumana. Tämä satunnaisen syötteen välittämiseen perustuva tekniikka on erittäin tehokas virheiden löytämiseen monista sovelluksista ja palveluista. Saatavilla on myös muita tekniikoita, ja ne on erittäin helppo toteuttaa. Näiden tekniikoiden toteuttamiseksi meidän tarvitsee vain muuttaa olemassa olevia syötteitä, ja voimme muuttaa syötettä yksinkertaisesti vaihtamalla sen bittejä.

Fuzz-testauksen havaitsemat bugityypit

Koska sumeus arvioi suoritusajan ohjelman käyttäytymisen eikä odotusarvon perusteella, sen havaitsemat viat ryhmittyvät kolmeen perheeseen.

  • Väitevirheet ja muistivuodot: Tätä menetelmää käytetään laajalti suurissa sovelluksissa, joissa virheet vaikuttavat muistin turvallisuuteen, mikä on vakava haavoittuvuus. Buffer Ylivuoto-, käyttö-vapautuksen jälkeen- ja rajojen ulkopuoliset lukemat näkyvät kaikki tässä.
  • Virheellinen syöte: Fuzz-testauksessa fuzzeja käytetään virheellisen syötteen luomiseen, jota käytetään virheenkäsittelyrutiinien testaamiseen, ja tämä on tärkeää ohjelmistoille, jotka eivät hallitse syötettään. Yksinkertainen fuzzing voidaan nähdä tapana automatisoida negatiivinen testi.
  • Oikeellisuusvirheet: Sumennusta voidaan käyttää myös tietyntyyppisten "oikeellisuusvirheiden", kuten vioittuneen tietokannan tai heikkojen hakutulosten, havaitsemiseen. Differentiaalisumennusta käytetään yleensä siten, että sama syöte syötetään kahteen toteutukseen ja vastauksia vertaillaan.

Fuzz-testaustyökalut

Verkkoturvallisuudessa käytettyjä työkaluja voidaan käyttää laajalti fuzz-testauksessa, kuten Burp Suite ja Peach Fuzzer. Useat alla olevista klassikkonimistä on nyt arkistoitu, joten niiden nykyinen tila ilmoitetaan jokaisen merkinnän yhteydessä.

  • Peach FuzzerPeach Fuzzer tarjoaa vankemman suojauksen kuin skanneri. Muut testaustyökalut voivat etsiä vain tunnettuja uhkia, kun taas Peach Fuzzer mahdollistaa käyttäjien löytää tunnettuja ja tuntemattomia uhkia. GitLab osti Peach Techin, eikä Community Edition v3:a enää ylläpidetä; ylläpidetty seuraaja on GitLab Protocol Fuzzer -yhteisöversio.
  • Spike-välityspalvelin: ammattilaistason työkalu, joka etsii sovellustason haavoittuvuuksia verkkosovelluksista. SPIKE Proxy kattaa perusasiat, kuten SQL Injektio ja sivustojen välinen komentosarjatuotto täysin avoimella alustalla Python infrastruktuuri, ja se oli käytettävissä Linux ja WindowsSitä ei ole ylläpidetty moneen vuoteen, ja se on sisällytetty tähän historiallisen kontekstin vuoksi.
  • WebSkarabeeWebScarab on kirjoitettu kielellä Java ja on siksi siirrettävissä monille alustoille. WebScarab-kehys kommunikoi HTTP- ja HTTPS-protokollien avulla ja toimii sieppaavana välityspalvelimena: se antaa operaattorille mahdollisuuden tarkastella ja muokata selaimen luomia pyyntöjä ennen kuin palvelin vastaanottaa ne, sekä tarkastella ja päivittää palvelimen luomia vastauksia ennen kuin selain vastaanottaa ne. Kaikki WebScarabin löytämät porsaanreiät lisätään raportoitujen ongelmien luetteloon. Tietovarasto arkistoitiin huhtikuussa 2024 ja on nyt vain luku -tilassa.
  • OWASP WSFuzzerWSFuzzer on GPL-lisensoitu ohjelma, joka on kirjoitettu Python joka kohdistui verkkopalveluihin ja viimeisimmässä versiossaan HTTP-pohjaiseen SOAP palvelut olivat pääkohde. Se toimitettiin osana WebScarabia ja poistettiin sen mukana; OWASP ZAP ja sen Fuzzer-lisäosa ovat suositeltuja vaihto-osia.
  • Säilytetyt vaihtoehdot: AFL++ ja libFuzzer ovat natiivikoodin vakiomuotoisia kattavuusohjattuja moottoreita, OSS-Fuzz suorittaa niitä jatkuvasti ja maksutta avoimen lähdekoodin projekteissa, ja buzz kattaa verkkoprotokollan sumennuksen PythonLaajempi luettelo on koottu oppaaseen tietoturvatestaustyökalut.

Fuzz-testauksen parhaat käytännöt

Kohteeseen suunnattu ja rauhaan jätetty fuzzer löytää harvoin paljoakaan. Alla olevat käytännöt erottavat kampanjan, joka tuottaa arkistoituja vikoja, kampanjasta, joka vain kuluttaa prosessoriaikaa.

  • Aloita hyvästä siemenrungosta. Kerää aitoja, kelvollisia syötteitä, jotka sovellus jo hyväksyy. Aidon tiedoston muuntaminen jäsentää koodia paljon nopeammin kuin satunnaisten tavujen muuntaminen.
  • Kirjoita pieni, nopea valjaat. Aloituspisteen tulisi tehdä yksi asia suorituskertaa kohden, välttää verkkokutsuja ja levylle kirjoituksia sekä palata nopeasti, koska läpäisykyky mitataan suoritusten määränä sekunnissa.
  • Ota desinfiointiaineet käyttöön. Hiljainen muistin vioittuminen ei usein aiheuta kaatumista. AddressSanitizer ja UndefinedBehaviorSanitizer muuttavat sen välittömäksi, diagnosoitavaksi viaksi.
  • Juokse pitkään ja juokse jatkuvasti. Yhden tai kahden tunnin ajolla nappaa matalalla sijaitsevat ötökät; syvät polut vaativat yleensä useita tunteja, minkä vuoksi fuzzing kuuluu iltaiseen CI-työhön manuaalisen istunnon sijaan.
  • Minimoi ja poista jokaisen kaatumisen kaksoiskappaleet. Pienennä virheellinen syöte pienimpään muotoonsa ja ryhmittele kaatumiset pinon mukaan tracmuuten yksi vika saapuu satoina tiketteinä.
  • Pidä regressiokorpus yllä. Lisää jokainen toistuva syöte pysyvään joukkoon, joka suoritetaan jokaisella koonnilla, jotta korjattu vika ei voi palata huomaamattomasti.
  • Mittaa kohde laillisesti. Kolmannen osapuolen palvelun toiminnassa olevan sisällön sumentaminen ilman kirjallista lupaa on sama asia kuin hyökkäys.

Fuzz-testauksen edut

Realististen odotusten pohjalta käytettynä fuzzing lisää arvoa, jota muilla tekniikoilla on vaikea saavuttaa.

  • Fuzz-testaus parantaa ohjelmistojen tietoturvatestausta.
  • Fuzzingissa löytyvät virheet ovat joskus vakavia ja usein samoja, joita hyökkääjät käyttävät, mukaan lukien kaatumiset, muistivuotoja ja käsittelemättömiä poikkeuksia.
  • Jos testaajat eivät huomaa bugeja ajan ja resurssien rajallisuuden vuoksi, ne löytyvät myös fuzz-testauksesta.
  • Kone tuottaa syötteet, joten peitto kasvaa yön yli ilman ylimääräistä manuaalista työtä.

Fuzz-testauksen haitat

Samat ominaisuudet, jotka tekevät fuzzingista halpaa, myös kattavat sen, mitä se voi todistaa.

  • Pelkkä sumea testaus ei voi antaa täydellistä kuvaa yleisestä tietoturvauhasta tai joukosta virheitä.
  • Fuzz-testaus on vähemmän tehokasta sellaisten tietoturvauhkien käsittelyssä, jotka eivät aiheuta ohjelmien kaatumisia, kuten jotkut virukset, madot ja troijalaiset.
  • Fuzz-testaus voi havaita vain suhteellisen yksinkertaisia ​​vikoja tai uhkia, eikä se analysoi liiketoimintalogiikkaa.
  • Tehokkaan toiminnan takaamiseksi se vaatii merkittävästi koneaikaa.
  • Reuna-arvoehdon asettaminen satunnaisilla syötteillä on erittäin ongelmallista, vaikka testaajat ratkaisevatkin nykyään suuren osan tästä käyttäjän syötteiden ohjaamilla deterministisillä algoritmeilla.

Fuzz-testaus vs. penetraatiotestaus

Molemmat toiminnot etsivät tietoturva-aukkoja, mutta ne vastaavat eri kysymyksiin ja ovat harvoin keskenään vaihdettavissa.

Kriteeri Fuzz-testaus Läpäisyn testaus
Ohjaama Automaattinen moottori tuottaa virheellisesti muotoiltua syötettä Taitava testaaja pohtii järjestelmää
Etsii Kaatumiset, jumiutumiset ja muistin turvallisuusongelmat Hyödynnettävissä olevat heikkoudet, mukaan lukien logiikka- ja konfiguraatiovirheet
Syvyys Hyvin laaja syötevalikoima, pinnallinen päättely Kapea kattavuus, syvällinen päättely
ulostulo Tulojen ja pinon toistaminen traces Löydösraportti, jossa on hyväksikäyttöpolut ja riskiluokitukset
Paras hetki Jatkuvasti rakennusputkessa Ajoittain, julkaisuehdokasta vastaan

Käytännössä nämä kaksi ruokkivat toisiaan: fuzzing poistaa halvat, automaattisesti syntyvät kaatumiset, jolloin testaajan rajalliset tunnit käytetään virheisiin, jotka vain ihminen havaitsee.

UKK

Siemenkorpus on fuzzer-funktion mutatoimien validien syötteiden lähtöjoukko. Pienet, vaihtelevat ja oikeat tiedostot toimivat parhaiten, koska jokainen niistä läpäisee jo jäsentimen ja antaa moottorin käyttää budjettinsa syvempään koodiin ensimmäisen validiteettitarkistuksen sijaan.

Fuzz-harnes on pieni funktio, joka luovuttaa testattavalle koodille yhden puskurin fuzz-tavuja. Sen tulisi välttää globaalia tilaa, tiedostojen kirjoittamista ja verkkokutsuja, jotta moottori voi suorittaa sen tuhansia kertoja sekunnissa.

Tunti tai pari paljastaa pinnallisia bugeja. Vakavat kampanjat kestävät useita tunteja tai päiviä, koska uusi peittoalue saapuu purskeina. Peittoalueen tasaantuminen, ei kellon lukema, on rehellinen merkki siitä, että operaatio ei ole enää kannattava.

AddressSanitizer havaitsee puskurin ylivuodot ja käytön jälkeiset virheet, UndefinedBehaviorSanitizer havaitsee kokonaislukujen ja osoittimien väärinkäytön ja MemorySanitizer havaitsee alustamattoman muistin lukemat. Ilman niitä monet vioittuneet tiedot kulkevat huomaamattomasti, eikä fuzzer ilmoita lainkaan virheistä.

Toista se, minimoi syöte pienimpään epäonnistuneeseen tapaukseen, ryhmittele se saman pinon jakavien kaatumisten kanssa trace, sitten lähetä yksi tukipyyntö tavalliseen tapaan vianhallinnan prosessi ja lisää syöte regressiokorpukseen.

He jakavat satunnaisuutta, mutta eivät tarkoituksellisuutta. Apinatestaus heittää mielivaltaisia ​​käyttäjän toimia käynnissä olevaan käyttöliittymään, kun taas fuzzing kohdistaa tiettyyn syötejäsentimeen ja mittaa koodin peittoa, jotta se voi ohjata itseään kohti koodia, jota aiemmat syötteet eivät koskaan saavuttaneet.

Kielimalleja käytetään sumentamattomien API-rajapintojen (unfuzzed API) valjaiden suunnitteluun, eksoottisten formaattien siemensyötteiden syntetisointiin sekä kaatumisraporttien klusterointiin ja yhteenvetoon. Moottori toimittaa edelleen kattavuuspalautteen; malli poistaa pääasiassa manuaalisen asennustyön.

GitHub Copilot voi luoda libFuzzer-aloituspisteen, koontitiedoston ja siemengeneraattorin olemassa olevasta API-allekirjoituksesta. RevTarkastele tulosta huolellisesti, sillä virheet hiljaa nielevä valjaat eivät ilmoita kaatumisista.

Tiivistä tämä viesti seuraavasti: