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.

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.
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:
- Katsetamist ei saa jätkata enne, kui spetsifikatsioon on küps.
- 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.

