Tutorial de testare Fuzz (Fuzzing).
โก Rezumat inteligent
Testarea Fuzz introduce date nevalide, neaศteptate sau aleatorii รฎntr-un program ศi urmฤreศte erorile de funcศionare, blocฤrile ศi erorile de memorie, expunรขnd defecte de securitate pe care testele funcศionale scriptate aproape niciodatฤ nu le ating singure.
Ce este Fuzz Testing?
Testarea Fuzz sau Fuzzing este o tehnicฤ de testare software care constฤ รฎn introducerea de date nevalide sau aleatorii, numitฤ FUZZ, รฎntr-un sistem software pentru a descoperi erori de codare ศi lacune de securitate. Scopul testฤrii fuzz este de a introduce date folosind tehnici automate sau semi-automate ศi de a testa sistemul pentru diverse excepศii, cum ar fi blocarea sistemului sau defecศiunea codului รฎncorporat.
Testarea fuzz a fost dezvoltatฤ iniศial de Barton Miller la Universitatea din Wisconsin-Madison, care a inventat termenul dupฤ ce zgomotul de linie de pe o legฤturฤ de modem a dus la blocarea programelor pe care le folosea. Studenศii sฤi au rulat primele fuzzere รฎn 1989 ศi au descoperit cฤ aproximativ o treime din utilitarele UNIX pe care le-au vizat s-au blocat sau s-au blocat. Testarea fuzz este o testare software tehnicฤ ศi este un tip de Testarea securitฤศii.
Diagrama de mai jos prezintฤ bucla de fuzzing de bazฤ, รฎn care datele generate sunt trimise cฤtre aplicaศia testatฤ, iar rฤspunsul este observat.
De ce sฤ faci Fuzz Testing?
Fuzzing-ul รฎศi cรขศtigฤ locul รฎntr-un plan de testare deoarece exploreazฤ input-urile pentru care nimeni nu s-a gรขndit sฤ scrie un caz de testare. Principalele motive pentru care echipele รฎl adoptฤ sunt enumerate mai jos.
- Testarea fuzz gฤseศte de obicei cele mai grave erori ศi defecte de securitate, deoarece o eroare este o dovadฤ directฤ a unei cฤi de intrare netratate.
- Testarea fuzz oferฤ rezultate mai eficiente atunci cรขnd este utilizatฤ cu Negru Box Testarea, testarea beta ศi alte metode de depanare.
- Testarea fuzz este utilizatฤ pentru a verifica vulnerabilitatea software-ului ศi este o tehnicฤ de testare foarte rentabilฤ, deoarece datele de intrare sunt generate mai degrabฤ decรขt scrise de mรขnฤ.
- Testarea fuzz este una dintre tehnicile de testare de tip โcutie neagrฤโ. Fuzzing-ul este, de asemenea, una dintre cele mai comune metode folosite de hackeri pentru a gฤsi o vulnerabilitate รฎntr-un sistem, aศa cฤ rularea ei mai รฎntรขi eliminฤ cea mai uศoarฤ rutฤ de intrare pentru un atacator.
Tipuri de testare Fuzz
Fuzzerii sunt de obicei grupaศi รฎn funcศie de cรขt ศtiu despre programul pe care รฎl atacฤ. Cu cรขt fuzzerul ศtie mai multe, cu atรขt poate aprofunda codul.
| Tip | Ce ศtie fuzzerul | Utilizare tipicฤ |
| Cutia neagrฤ fuzzing | Nimic despre componentele interne; vede doar intrฤri ศi ieศiri. | Fumul rapid ruleazฤ รฎmpotriva unui binar sau a unui endpoint live. |
| Cutie albฤ care se estompeazฤ | Cod sursฤ complet, adesea combinat cu execuศie simbolicฤ pentru a rezolva ramificaศiile greu accesibile. | Analiza aprofundatฤ a unei componente a cฤrei sursฤ este disponibilฤ. |
| Cutia gri fuzzing | Fฤrฤ revizuire a sursei, dar cu feedback la momentul execuศiei, cum ar fi ramificaศiile de cod la care a ajuns o intrare. | Implicit pentru motoarele moderne precum AFL++ ศi libFuzzer. |
O a doua divizare, mai veche, separฤ prostii de la fuzzing inteligentUn parser neinteligent schimbฤ biศii fฤrฤ sฤ ศtie ce format de intrare are, aศa cฤ majoritatea datelor sale sunt respinse de primul parser pe care รฎl รฎntรขlneศte. Un parser inteligent รฎnศelege sumele de control, cรขmpurile de lungime ศi structura mesajelor, astfel รฎncรขt intrฤrile sale supravieศuiesc validฤrii ศi ajung la logica de bazฤ. Fuzzing ghidat de acoperire este rafinamentul de tip โcutie griโ care a fฤcut ca fuzzing-ul sฤ devinฤ mainstream: motorul instrumenteazฤ codul binar, pฤstreazฤ orice intrare care ajunge la o nouฤ ramurฤ ศi modificฤ supravieศuitorii, astfel รฎncรขt corpusul evolueazฤ constant cฤtre cod neexplorat รฎn loc sฤ reporneascฤ de la un zgomot aleatoriu.
Cum se face Fuzz Testing
Paศii pentru testarea fuzz includ paศii de bazฤ ai testฤrii:
Pasul 1) Identificaศi sistemul ศintฤ โ alegeศi fiศierul binar, biblioteca, serviciul sau endpoint-ul protocolului care va fi atacat ศi confirmaศi cฤ aveศi permisiunea de a-l testa.
Pasul 2) Identificaศi intrฤrile โ listeazฤ fiecare punct de intrare din care citeศte ศinta: fiศiere, argumente din linia de comandฤ, variabile de mediu, pachete de reศea, cรขmpuri de formular ศi sarcini utile API.
Pasul 3) Generaศi date Fuzzed โ produc intrฤri malformate prin mutarea eศantioanelor valide, prin generarea lor dintr-un model al formatului sau prin combinarea ambelor.
Pasul 4) Executaศi testul folosind date fuzzy โ ruleazฤ ศinta รฎn funcศie de intrฤrile generate, ideal รฎntr-o buclฤ care reporneศte procesul automat dupฤ fiecare eศec.
Pasul 5) Monitorizaศi comportamentul sistemului โ fiศi atenศi la erori, blocฤri, erori de aserศionฤri, utilizare excesivฤ a memoriei ศi rapoarte de dezinfectare, รฎn loc sฤ verificaศi doar rezultatul tipฤrit.
Pasul 6) รnregistraศi defectele โ salvaศi intrarea exactฤ care a declanศat fiecare eศec, micศoraศi-o la cel mai mic caz reproductiv ศi arhivaศi-o รฎn stivฤ trace ataศat.
Exemple de Fuzzers
Fuzzerii sunt clasificaศi ศi รฎn funcศie de modul รฎn care รฎศi construiesc inputul, iar cele trei abordฤri de mai jos sunt cele pe care le veศi รฎntรขlni cel mai des.
- Fuzzers bazate pe mutaศii modificaศi mostrele de date existente pentru a crea noi date de test. Aceasta este o abordare foarte simplฤ ศi directฤ: รฎncepe cu mostre valide ale unui protocol ศi continuฤ sฤ modifice fiecare octet sau fiศier.
- Fuzzere bazate pe generaศii definesc date noi pe baza datelor de intrare ale modelului. รncep sฤ genereze date de intrare de la zero pe baza specificaศiei.
- Fuzzeri bazaศi pe protocol depind de cunoศtinศe detaliate despre formatul protocolului testat, iar aceastฤ รฎnศelegere provine din specificaศie. Aceasta implicฤ scrierea unei matrice a specificaศiei รฎn instrument, apoi utilizarea unei tehnici de generare de teste bazate pe model pentru a parcurge specificaศia ศi a adฤuga nereguli รฎn conศinutul datelor, secvenศฤ ศi aศa mai departe. Aceasta este cunoscutฤ ศi sub denumirea de testare sintacticฤ, testare gramaticalฤ sau testare a robusteศii. Un fuzzer poate genera cazuri de testare dintr-unul existent sau poate utiliza intrฤri valide sau nevalide.
Existฤ douฤ limitฤri ale fuzzing-ului bazat pe protocol:
- Testarea nu poate continua pรขnฤ cรขnd specificaศia este maturฤ.
- Multe protocoale utile sunt o extensie a protocoalelor publicate. Dacฤ testarea fuzz se bazeazฤ pe specificaศiile publicate, Testaศi acoperirea pentru noile protocoale vor fi limitate.
Cea mai simplฤ formฤ de tehnicฤ de fuzzing este trimiterea de date de intrare aleatorii cฤtre software, fie sub formฤ de pachete de protocol, fie ca eveniment. Aceastฤ tehnicฤ de transmitere a unor date de intrare aleatorii este foarte puternicฤ pentru gฤsirea erorilor รฎn multe aplicaศii ศi servicii. Sunt disponibile ศi alte tehnici, care sunt foarte uศor de implementat. Pentru a implementa aceste tehnici, trebuie doar sฤ modificฤm intrฤrile existente ศi putem modifica o intrare pur ศi simplu prin interschimbarea biศilor acesteia.
Tipuri de erori detectate de Fuzz Testing
Deoarece fuzzingul judecฤ o rulare dupฤ cum se comportฤ programul ศi nu dupฤ o valoare aศteptatฤ, defectele pe care le scoate la ivealฤ se grupeazฤ รฎn trei familii.
- Eศecuri de afirmare ศi scurgeri de memorie: Aceastฤ metodologie este utilizatฤ pe scarฤ largฤ pentru aplicaศii mari รฎn care erorile afecteazฤ siguranศa memoriei, ceea ce reprezintฤ o vulnerabilitate severฤ. Buffer Aici apar depฤศirile de capacitate, citirile de tip โuse-after-freeโ ศi citirile out-of-bounds.
- Intrare nevalidฤ: รn testarea fuzz, fuzzerii sunt folosiศi pentru a genera date de intrare nevalide, care sunt folosite pentru testarea rutinelor de gestionare a erorilor, iar acest lucru este important pentru software-ul care nu รฎศi controleazฤ datele de intrare. Fuzzing-ul simplu poate fi vฤzut ca o modalitate de a automatiza testare negativฤ.
- Erori de corectitudine: Fuzzing-ul poate fi folosit ศi pentru a detecta anumite tipuri de erori de โcorectitudineโ, cum ar fi o bazฤ de date coruptฤ sau rezultate de cฤutare slabe. Fuzzing-ul diferenศial, care furnizeazฤ aceeaศi intrare cฤtre douฤ implementฤri ศi comparฤ rฤspunsurile, este modalitatea obiศnuitฤ de a le detecta.
Instrumente de testare Fuzz
Instrumentele utilizate รฎn securitatea web pot fi utilizate pe scarฤ largฤ รฎn testarea fuzz, cum ar fi Burp Suite ศi Peach Fuzzer. Mai multe dintre numele clasice de mai jos sunt acum arhivate, aศa cฤ statutul lor actual este menศionat lรขngฤ fiecare intrare.
- Fuzzer cu piersiciPeach Fuzzer oferฤ o acoperire de securitate mai robustฤ decรขt un scaner. Alte instrumente de testare pot cฤuta doar ameninศฤri cunoscute, รฎn timp ce Peach Fuzzer permite utilizatorilor sฤ gฤseascฤ ameninศฤri cunoscute ศi necunoscute. Peach Tech a fost achiziศionatฤ de GitLab, iar Community Edition v3 nu mai este รฎntreศinutฤ; succesorul รฎntreศinut este Ediศia Comunitarฤ GitLab Protocol Fuzzer.
- Spike Proxy: un instrument de nivel profesional care cautฤ vulnerabilitฤศi la nivel de aplicaศie รฎn aplicaศiile web. SPIKE Proxy acoperฤ elementele de bazฤ, cum ar fi SQL Injecศie ศi scripting cross-site, pe o reศea complet deschisฤ Python infrastructurฤ ศi era disponibilฤ pentru Linux ศi WindowsNu a fost รฎntreศinut de mulศi ani ศi este inclus aici din motive istorice.
- WebScarabWebScarab este scris รฎn Java ศi, prin urmare, este portabil pe multe platforme. Framework-ul WebScarab comunicฤ folosind protocoalele HTTP ศi HTTPS ศi funcศioneazฤ ca un proxy de interceptare: permite operatorului sฤ revizuiascฤ ศi sฤ modifice cererile create de browser รฎnainte ca serverul sฤ le primeascฤ ศi sฤ revizuiascฤ ศi sฤ actualizeze rฤspunsurile generate de server รฎnainte ca browserul sฤ le primeascฤ. Orice breศฤ pe care o gฤseศte WebScarab este adฤugatฤ la lista sa de probleme raportate. Depozitul a fost arhivat รฎn aprilie 2024 ศi este acum doar pentru citire.
- OWASP WSFuzzerWSFuzzer este un program licenศiat GPL, scris รฎn Python care viza serviciile web ศi, รฎn ultima sa versiune, bazat pe HTTP Servicii SOAP au fost ศinta principalฤ. A fost livrat ca parte a WebScarab ศi a fost retras odatฤ cu acesta; OWASP ZAP ศi add-on-ul sฤu Fuzzer sunt รฎnlocuitorul recomandat.
- Alternative menศinute: AFL++ ศi libFuzzer sunt motoarele standard ghidate de acoperire pentru codul nativ, OSS-Fuzz le ruleazฤ continuu ศi gratuit pentru proiecte open-source ศi boofuzz acoperฤ fuzzing-ul protocolului de reศea รฎn PythonO listฤ mai amplฤ este inclusฤ รฎn ghidul pentru instrumente de testare a securitฤศii.
Cele mai bune practici de testare fuzz
Un fuzzer รฎndreptat spre o ศintฤ ศi lฤsat รฎn pace rareori gฤseศte prea multe. Practicile de mai jos diferenศiazฤ o campanie care produce defecte รฎnregistrate de una care doar consumฤ timp CPU.
- รncepeศi de la un corpus de seminศe bun. Colecteazฤ intrฤri reale, valide, pe care aplicaศia le acceptฤ deja. Mutarea unui fiศier autentic ajunge la codul de parsare mult mai repede decรขt mutarea unor octeศi aleatori.
- Scrieศi un ham mic ศi rapid. Punctul de intrare ar trebui sฤ facฤ un singur lucru per rulare, sฤ evite apelurile de reศea ศi scrierile pe disc ศi sฤ se รฎntoarcฤ rapid, deoarece debitul se mฤsoarฤ รฎn execuศii pe secundฤ.
- Porniศi dezinfectantele. Corupศia silenศioasฤ a memoriei adesea nu duce la blocฤri. AddressSanitizer ศi UndefinedBehaviorSanitizer o transformฤ รฎntr-o eroare imediatฤ, diagnosticabilฤ.
- Aleargฤ mult timp ศi aleargฤ continuu. O rulare de una sau douฤ ore identificฤ erorile superficiale; cฤile profunde necesitฤ de obicei multe ore, motiv pentru care fuzzing-ul ar trebui sฤ fie inclus รฎntr-o sesiune CI nocturnฤ, mai degrabฤ decรขt รฎntr-o sesiune manualฤ.
- Minimizeazฤ ศi deduplicฤ fiecare eroare. Reduce intrarea eศuatฤ la cea mai micฤ formฤ ศi grupeazฤ erorile dupฤ stivฤ trace, altfel o eroare ajunge cรขt sute de bilete.
- Pฤstraศi un corpus de regresie. Adฤugaศi fiecare intrare de reproducere la un set permanent care ruleazฤ la fiecare compilare, astfel รฎncรขt un defect remediat sฤ nu poatฤ reveni รฎn mod discret.
- Delimiteazฤ ศinta din punct de vedere legal. Defectarea unui serviciu terศ activ fฤrฤ permisiune scrisฤ este imposibil de distins de un atac.
Avantajele testฤrii Fuzz
Folositฤ cu aศteptฤri realiste, fuzzing-ul adaugฤ o valoare pe care alte tehnici se chinuie sฤ o egaleze.
- Testarea fuzz รฎmbunฤtฤศeศte testarea securitฤศii software-ului.
- Erorile gฤsite รฎn fuzzing sunt uneori severe ศi sunt adesea aceleaศi cu cele folosite de atacatori, inclusiv blocฤri, scurgeri de memorie ศi excepศii netratate.
- Dacฤ testerii nu observฤ erori din cauza limitฤrilor de timp ศi resurse, acele erori se gฤsesc ศi รฎn testarea fuzz.
- Intrฤrile sunt generate de o maศinฤ, astfel รฎncรขt acoperirea continuฤ sฤ creascฤ peste noapte, fฤrฤ efort manual suplimentar.
Dezavantajele testฤrii Fuzz
Aceleaศi proprietฤศi care fac fuzzing-ul ieftin limiteazฤ ศi ceea ce poate dovedi.
- Testarea fuzz singurฤ nu poate oferi o imagine completฤ a unei ameninศฤri generale de securitate sau a unui set de erori.
- Testarea fuzz este mai puศin eficientฤ รฎn gestionarea ameninศฤrilor de securitate care nu provoacฤ blocฤri ale programelor, cum ar fi unii viruศi, viermi ศi troieni.
- Testarea fuzz poate detecta doar erori sau ameninศฤri relativ simple ศi nu va raศiona despre logica de afaceri.
- Pentru a funcศiona eficient, necesitฤ un timp semnificativ de lucru cu maศina.
- Stabilirea unei condiศii de valoare limitฤ cu intrฤri aleatorii este foarte problematicฤ, deศi testerii rezolvฤ acum o mare parte din aceasta cu algoritmi determiniศti conduศi de intrฤrile utilizatorului.
Testarea Fuzz vs. Testarea Penetraศiei
Ambele activitฤศi cautฤ defecte de securitate, รฎnsฤ rฤspund la รฎntrebฤri diferite ศi sunt rareori interschimbabile.
| Criterii | Testarea Fuzz | Testarea penetrฤrii |
| Condus de | Un motor automat care genereazฤ date de intrare incorecte | Un tester priceput raศioneazฤ despre sistem |
| Cautฤ | Blocฤri, blocฤri ศi erori de siguranศฤ a memoriei | Puncte slabe exploatabile, inclusiv defecte logice ศi de configurare |
| Adรขncime | Acoperire foarte largฤ a datelor de intrare, raศionament superficial | Acoperire restrรขnsฤ, raศionament profund |
| producศie | Reproducerea intrฤrilor ศi a stivei traces | Un raport de constatฤri cu cฤi de exploatare ศi evaluฤri ale riscurilor |
| Cel mai bun moment | Continuu, รฎn procesul de construire | Periodic, รฎmpotriva unui candidat la lansare |
รn practicฤ, cele douฤ se alimenteazฤ reciproc: fuzzing-ul eliminฤ erorile ieftine ศi automatizabile, astfel รฎncรขt orele limitate ale unui tester sunt dedicate defectelor pe care doar un om le poate observa.

