Hägu testimise (fuzzing) õpetus

⚡ Nutikas kokkuvõte

Hägustestimine annab programmile vigaseid, ootamatuid või juhuslikke andmeid ning jälgib krahhe, hangumisi ja mäluvigu, paljastades turvavead, milleni skriptitud funktsionaalsed testid iseenesest peaaegu kunagi ei jõua.

  • 🔘 Päritolu: Barton Miller lõi selle termini Wisconsini-Madisoni Ülikoolis ja esimesed fuzz-käivitused 1989. aastal põhjustasid umbes kolmandiku testitud UNIX-i utiliitidest krahhi.
  • ☑️ Kuueastmeline tsükkel: Tuvastage sihtmärk, tuvastage sisendid, genereerige hägusad andmed, käivitage, jälgige käitumist ja seejärel logige iga ilmnenud defekt.
  • Kolm põlvkonna strateegiat: Mutatsioonifuzzerid moonutavad kehtivaid valimeid, genereerimise fuzzerid loovad sisendeid mudelist ja protokolli fuzzerid töötavad spetsifikatsiooni põhjal.
  • 🧪 Kajastuse tagasiside muutis valdkonda: Kaasaegsed mootorid säilitavad kõik sisendid, mis jõuavad uude koodi, mis leiab palju sügavamaid vigu kui puhtalt juhuslikud andmed.
  • 🛠️ Tööriistade valmistamine on edasi liikunud: Peach Fuzzer ja WebScarab on arhiveeritud, samas kui AFL++, libFuzzer, OSS-Fuzz, boofuzz ​​ja OWASP ZAP on hooldatud valikud.
  • ⚙️ Teadaolevad piirid: Hägususanalüüs leiab krahhe, mitte loogikaviga, seega see täiendab, mitte ei asenda koodi ülevaatamist ja penetratsioonitestimist.

Hägu testimise (fuzzing) õpetus

Mis on fuzz-testimine?

Hägustestimine või hägustumine on tarkvara testimise tehnika, mille käigus sisestatakse tarkvarasüsteemi sobimatuid või juhuslikke andmeid (nn FUZZ), et avastada kodeerimisvigu ja turvaauke. Hägustestimise eesmärk on andmete sisestamine automatiseeritud või poolautomaatsete tehnikate abil ja süsteemi testimine mitmesuguste erandite, näiteks süsteemi krahhide või sisseehitatud koodi tõrgete suhtes.

Hägusustestimise töötas algselt välja Barton Miller Wisconsini-Madisoni Ülikoolist, kes lõi selle termini pärast seda, kui modemiühenduse liinimüra põhjustas tema kasutatavate programmide krahhi. Tema õpilased käivitasid esimesed hägusustestid 1989. aastal ja leidsid, et umbes kolmandik nende sihtmärgiks olnud UNIX-i utiliitidest jooksis kokku või hangus. Hägusustestimine on tarkvara testimine tehnika ja see on teatud tüüpi Turvalisuse testimine.

Allolev diagramm näitab põhilist hägustustsüklit, kus genereeritud andmed edastatakse testitavale rakendusele ja vaadeldakse vastust.

Hägustestimise töövoog: hägusti genereerib vigase sisendi ja edastab selle testitavale rakendusele.

Miks teha fuzz-testi?

Hägususanalüüs teenib oma koha testiplaanis, sest see uurib sisendeid, mille jaoks keegi poleks tulnudki välja testi kirjutamiseks. Peamised põhjused, miks meeskonnad seda kasutavad, on loetletud allpool.

  • Hägustestimine leiab tavaliselt kõige tõsisemad turvavead ja -defektid, sest krahh on otsene tõend töötlemata sisendteest.
  • Hägustestimine annab efektiivsema tulemuse, kui seda kasutada koos Must Box Testimine, beetatestimine ja muud silumismeetodid.
  • Tarkvara haavatavuse kontrollimiseks kasutatakse hägustestimist ja see on väga kulutõhus testimistehnika, kuna sisendid genereeritakse, mitte ei kirjutata käsitsi.
  • Hägustestimine on üks musta kasti testimise tehnikaid. Hägustestimine on ka üks levinumaid meetodeid, mida häkkerid süsteemi haavatavuste leidmiseks kasutavad, seega selle esmane käivitamine eemaldab ründaja jaoks lihtsaima tee sisse.

Fuzz-testimise tüübid

Fuzzer-tarkvara rühmitatakse tavaliselt selle järgi, kui palju nad rünnatava programmi kohta teavad. Mida rohkem fuzzer teab, seda sügavamale koodi see suudab tungida.

KASUTUSALA Mida hägune teab Tüüpiline kasutamine
Musta kasti hägusus Sisemiste osade kohta pole midagi; see näeb ainult sisendeid ja väljundeid. Quick Smoke töötab binaarfaili või reaalajas lõpp-punkti vastu.
Valge kasti hägustumine Täielik lähtekood, sageli kombineerituna sümboolse teostusega raskesti ligipääsetavate harude lahendamiseks. Komponendi süvaanalüüs, mille allikas on saadaval.
Halli kasti hägustumine Allika ülevaatamist ei toimu, aga käitusaja tagasisidet, näiteks millise koodiharuni sisend jõudis. Vaikimisi tänapäevaste mootorite, näiteks AFL++ ja libFuzzer, jaoks.

Teine, vanem lõhe lahutab rumal sumisemine Rohkem kui nutikas hägustamineRumal hägusti pöörab bitte ümber ilma sisendvormingust aimugi omamata, seega lükkab esimene parser, millega kokku puutub, enamiku selle andmetest tagasi. Nutikas hägusti saab aru kontrollsummadest, pikkusväljadest ja sõnumistruktuurist, seega selle sisendid jäävad valideerimisele püsima ja jõuavad aluseks oleva loogikani. Katvusel põhinev hägusus on halli kasti täiustus, mis muutis hägustuse (fuzzing) peavooluks: mootor instrumenteerib binaarfaili, säilitab kõik sisendid, mis jõuavad uude harusse, ja muteerib ellujäänuid, nii et korpus areneb pidevalt uurimata koodi suunas, selle asemel et taaskäivituda juhuslikust mürast.

Kuidas teha fuzz-testi

Fuzz-testimise etapid hõlmavad põhilisi testimisetappe:

1. samm) tuvastage sihtsüsteem — vali rünnatav binaarfail, teek, teenus või protokolli lõpp-punkt ja kinnita, et sul on lubatud seda testida.

2. samm) tuvastage sisendid — loetlege kõik sisenemispunktid, kust sihtmärk loeb: failid, käsurea argumendid, keskkonnamuutujad, võrgupaketid, vormiväljad ja API kasulikud koormused.

3. samm) genereerige hägused andmed — tekitada vigaseid sisendeid kehtivate näidiste muteerimise, vormingu mudeli põhjal genereerimise või mõlema kombineerimise teel.

4. samm) Tehke test hägusate andmetega — käivitada sihtmärk genereeritud sisendite suhtes, ideaaljuhul tsüklis, mis taaskäivitab protsessi automaatselt pärast iga tõrget.

Samm 5) Jälgige süsteemi käitumist — jälgige krahhe, hangumisi, kinnitusvigu, mälu üleküllust ja puhastaja aruandeid, selle asemel et kontrollida ainult prinditud väljundit.

6. samm) Logi defektid — salvestage iga vea käivitanud täpne sisend, vähendage see väikseima taasesitatava juhtumini ja arhiveerige see pinuga trace lisatud.

Fuzzeri näited

Fuzzereid liigitatakse ka selle järgi, kuidas nad oma sisendi üles ehitavad, ja allpool on toodud kolm lähenemisviisi, millega kokku puutute kõige sagedamini.

  • Mutatsioonipõhised fuzzerid muuta olemasolevaid andmevalimeid uute testandmete loomiseks. See on väga lihtne ja otsekohene lähenemisviis: see alustab protokolli kehtivate valimitega ja moonutab pidevalt iga baiti või faili.
  • Põlvkonnapõhised fuzzerid defineerivad mudeli sisendi põhjal uued andmed. Nad hakkavad sisendit nullist genereerima spetsifikatsiooni põhjal.
  • Protokollipõhised fuzzerid sõltuvad testitava protokolli vormingu detailsetest teadmistest ja see arusaam tuleb spetsifikatsioonist. See hõlmab spetsifikatsiooni massiivi kirjutamist tööriista ja seejärel mudelipõhise testi genereerimise tehnika kasutamist spetsifikatsiooni läbivaatamiseks ja ebakorrapärasuste lisamiseks andmesisusse, järjestusse jne. Seda tuntakse ka süntaksitestimise, grammatikatestimise või robustsuse testimisena. Hägusti saab genereerida testjuhtumeid olemasolevast või kasutada kehtivaid või kehtetuid sisendeid.

Protokollipõhisel hägustamisel on kaks piirangut:

  1. Katsetamist ei saa jätkata enne, kui spetsifikatsioon on küps.
  2. Paljud kasulikud protokollid on avaldatud protokollide laiendused. Kui fuzz-testimine põhineb avaldatud spetsifikatsioonidel, Katse katvus uute protokollide jaoks on piiratud.

Lihtsaim hägustustehnika on tarkvarale juhusliku sisendi saatmine kas protokollipakettidena või sündmusena. See juhusliku sisendi edastamise tehnika on väga võimas vigade leidmiseks paljudes rakendustes ja teenustes. Saadaval on ka teisi tehnikaid ja neid on väga lihtne rakendada. Nende tehnikate rakendamiseks peame lihtsalt muutma olemasolevaid sisendeid ja me saame sisendit muuta lihtsalt selle bitte vahetades.

Fuzz Testingi tuvastatud vigade tüübid

Kuna hägustamine hindab programmi käitumist, mitte oodatava väärtuse järgi, koonduvad selle tuvastatud vead kolme perekonda.

  • Väidete tõrked ja mälulekked: Seda metoodikat kasutatakse laialdaselt suurtes rakendustes, kus vead mõjutavad mälu turvalisust, mis on tõsine haavatavus. Buffer Siin kuvatakse kõik ületäitumised, use-after-free ja out-of-bounds lugemised.
  • Sobimatu sisend: Hägustestimisel kasutatakse hägustajaid sobimatu sisendi genereerimiseks, mida kasutatakse veakäsitlusrutiinide testimiseks, ja see on oluline tarkvara puhul, mis oma sisendit ei kontrolli. Lihtsat hägustust võib vaadelda kui viisi automatiseerimiseks negatiivne test.
  • Õigekirja vead: Hägusanalüüsi saab kasutada ka teatud tüüpi "õigsusvigade" tuvastamiseks, näiteks rikutud andmebaasi või halbade otsingutulemuste korral. Diferentsiaalhägusanalüüs, mis annab sama sisendi kahele rakendusele ja võrdleb vastuseid, on tavaline viis nende leidmiseks.

Fuzzi testimise tööriistad

Veebiturvalisuses kasutatavaid tööriistu saab laialdaselt kasutada hägustestimisel, näiteks Burp Suite ja Peach Fuzzer. Mitmed allpool loetletud klassikalised nimed on nüüd arhiveeritud, seega on iga sissekande juures märgitud nende praegune staatus.

  • Peach FuzzerPeach Fuzzer pakub skanneriga võrreldes tugevamat turvakatvust. Teised testimistööriistad saavad otsida ainult teadaolevaid ohte, samas kui Peach Fuzzer võimaldab kasutajatel leida nii teadaolevaid kui ka tundmatuid ohte. Peach Techi omandas GitLab ja Community Edition v3-d enam ei hooldata; hooldatud järeltulija on GitLab Protocol Fuzzeri kogukonnaväljaanne.
  • Spike puhverserver: professionaalse taseme tööriist, mis otsib veebirakendustes rakendustaseme haavatavusi. SPIKE Proxy hõlmab põhitõdesid, näiteks SQL Süstimine ja saidiülene skriptimine täiesti avatud platvormil Python infrastruktuuri ja see oli saadaval Linux ja WindowsSeda pole aastaid hooldatud ja see on siia lisatud ajaloolise konteksti huvides.
  • WebSkarabeusWebScarab on kirjutatud keeles Java ja on seetõttu paljudele platvormidele kaasaskantav. WebScarabi raamistik suhtleb HTTP ja HTTPS protokollide abil ning toimib pealtkuulamisproksina: see võimaldab operaatoril brauseri loodud päringuid enne serverisse jõudmist üle vaadata ja muuta ning serveri loodud vastuseid enne brauserisse jõudmist üle vaadata ja värskendada. Kõik WebScarabi leitud lüngad lisatakse teatatud probleemide loendisse. Repositoorium arhiveeriti 2024. aasta aprillis ja on nüüd kirjutuskaitstud.
  • OWASP WSFuzzerWSFuzzer on GPL-litsentsiga programm, mis on kirjutatud ... keeles. Python mis oli suunatud veebiteenustele ja oma viimases versioonis HTTP-põhisele SEEBI teenused olid peamine sihtmärk. See tarniti osana WebScarabist ja sellega koos eemaldati; OWASP ZAP ja selle Fuzzeri lisandmoodul on soovitatav asendaja.
  • Säilitatud alternatiivid: AFL++ ja libFuzzer on natiivkoodi standardsed katvuspõhised mootorid, OSS-Fuzz käitab neid avatud lähtekoodiga projektide jaoks pidevalt ja tasuta ning möll hõlmab võrguprotokolli hägustumist PythonLaiem loetelu on esitatud juhendis turvatestimise tööriistad.

Hägustestimise parimad tavad

Sihtmärgile suunatud ja rahule jäetud fuzzer leiab harva palju. Allpool toodud tavad eristavad kampaaniat, mis tekitab registreeritud defekte, kampaaniast, mis ainult protsessori aega kulutab.

  • Alustage heast seemnekorpusest. Koguge reaalseid ja kehtivaid sisendeid, mida rakendus juba aktsepteerib. Ehtsa faili muteerimine jõuab koodi parsini palju kiiremini kui juhuslike baitide muteerimine.
  • Kirjutage väike ja kiire rakmete skeem. Sisenemispunkt peaks iga käivitamise kohta tegema ühte asja, vältima võrgukõnesid ja kettale kirjutamist ning kiiresti naasma, sest läbilaskevõimet mõõdetakse täitmiste arvus sekundis.
  • Lülitage desinfitseerimisvahendid sisse. Vaikne mälu rikkumine ei põhjusta sageli krahhi. AddressSanitizer ja UndefinedBehaviorSanitizer muudavad selle koheseks diagnoositavaks tõrkeks.
  • Jookse pikalt ja jookse pidevalt. Ühe- või kahetunnine seire püüab kinni pealiskaudsed putukad; sügavate radade uurimine võtab tavaliselt mitu tundi, mistõttu sobib hägustamine pigem öise CI-töö kui käsitsi seansi osana.
  • Minimeerige ja eemaldage iga krahh. Kahanda vigane sisend väikseimale kujule ja grupeeri krahhid pinu järgi trace, vastasel juhul saabub üks viga sadade piletitena.
  • Säilita regressioonikorpus. Lisage iga reprodutseeriv sisend püsikomplekti, mis töötab igal ehitusel, et parandatud defekt ei saaks vaikselt tagasi tulla.
  • Määrake sihtmärk seaduslikult. Kolmanda osapoole teenuse reaalajas hägustamine ilma kirjaliku loata on rünnakust eristamatu.

Fuzzi testimise eelised

Realistlike ootustega kasutades lisab hägustamine väärtust, millega teistel tehnikatel on raskusi.

  • Hägustestimine parandab tarkvara turvalisuse testimist.
  • Fuzzingus leiduvad vead on mõnikord tõsised ja sageli samad, mida ründajad kasutavad, sealhulgas krahhid, mälulekked ja käsitlemata erandid.
  • Kui testijad ei suuda aja ja ressursside piiratuse tõttu mõnda viga märgata, leitakse need vead ka hägustestimisel.
  • Sisendid genereerib masin, seega kasvab leviala üleöö ilma täiendava käsitsi tehtava pingutuseta.

Fuzzi testimise puudused

Samad omadused, mis muudavad fuzzingu odavaks, piiravad ka selle potentsiaali.

  • Ainult hägustestimine ei anna täielikku pilti üldisest turvaohust ega vigade komplektist.
  • Hägustestimine on vähem efektiivne turvaohtudega tegelemisel, mis ei põhjusta programmi krahhe, näiteks mõned viirused, ussid ja troojalased.
  • Hägustestimine suudab tuvastada ainult suhteliselt lihtsaid vigu või ohte ning see ei arutle äriloogika üle.
  • Tõhusaks toimimiseks on vaja märkimisväärset masinaaega.
  • Juhuslike sisenditega ääreväärtuse tingimuse seadmine on väga problemaatiline, kuigi testijad lahendavad seda nüüd suure osa kasutaja sisenditest lähtuvate deterministlike algoritmidega.

Hägustestimine vs läbitungimistestimine

Mõlemad tegevused otsivad turvadefekte, kuid vastavad erinevatele küsimustele ja on harva omavahel asendatavad.

Kriteeriumid Fuzzi testimine Läbitungivuskatse
Ajendatud Automaatne mootor genereerib vigase sisendi Oskusliku testija arutleb süsteemi üle
Otsib Krahhid, hangumised ja mälu turvalisuse vead Ärakasutatavad nõrkused, sealhulgas loogika- ja konfiguratsioonivead
Sügavus Väga lai sisendi ulatus, pealiskaudne arutluskäik Kitsas ulatus, sügav arutluskäik
Väljund Sisendite ja pinu taasesitamine traces Tulemuste aruanne koos ärakasutamise teede ja riskihinnangutega
Parim hetk Pidevalt ehitustorustikus Perioodiliselt, väljalaskekandidaadi vastu

Praktikas toidavad need kaks teineteist: hägususe vähendamine kõrvaldab odavad ja automatiseeritavad krahhid, nii et testija piiratud tööaeg kulub vigadele, mida ainult inimene märkab.

KKK

Seemnekorpus on algne kehtivate sisendite komplekt, mida fuzzer muteerib. Väikesed, mitmekesised ja reaalsed failid toimivad kõige paremini, kuna igaüks neist läbib juba parseri ja laseb mootoril kulutada oma eelarve sügavamale koodile, mitte esimesele kehtivuskontrollile.

Fuzz Harness on väike funktsioon, mis annab testitavale koodile üle ühe puhvri fuzzitud baitide arvuga. See peaks vältima globaalset olekut, failidesse kirjutamist ja võrgukõnesid, et mootor saaks seda tuhandeid kordi sekundis käivitada.

Tund või kaks paljastavad pealiskaudsed putukad. Tõsised kampaaniad kestavad mitu tundi või päeva, sest uus kajastus saabub purskeidena. Katvuskõvera platoo, mitte kella näit, on aus signaal, et kampaania ei ole enam vilja kandnud.

AddressSanitizer püüab kinni puhvri ületäitumised ja pärast vaba kasutamist esinevad vead, UndefinedBehaviorSanitizer täisarvude ja pointerite väärkasutuse ning MemorySanitizer initsialiseerimata mälu lugemised. Ilma nendeta mööduvad paljud vead vaikselt ja hägusti ei anna ühtegi tõrget teada.

Paljunda see, minimeeri sisend väikseima ebaõnnestunud juhtumini, grupeeri see sama pinu jagavate krahhidega. trace, seejärel esitage üks pilet tavapärasel viisil defektide haldamise protsess ja lisage sisend regressioonikorpusesse.

Nad jagavad juhuslikkust, aga mitte kavatsust. Ahvide testimine viskab töötavale liidesele suvalisi kasutajatoiminguid, samal ajal kui hägustamine on suunatud konkreetsele sisendi parsijale ja mõõdab koodi ulatust, et see saaks end suunata koodi poole, milleni varasemad sisendid pole kunagi jõudnud.

Keelemudeleid kasutatakse sulatamata API-de raamistike koostamiseks, eksootiliste vormingute algväärtuste sünteesimiseks ning krahhiaruannete klasteristamiseks ja kokkuvõtmiseks. Mootor annab endiselt katvuse tagasisidet; mudel eemaldab peamiselt käsitsi seadistamise töö.

GitHubi koopia saab olemasolevast API allkirjast luua libFuzzeri sisenemispunkti, ehitusfaili ja seemnegeneraatori. RevVaadake tulemust hoolikalt, sest rakmed, mis vead vaikselt neelavad, ei anna krahhidest teada.

Võta see postitus kokku järgmiselt: