Vad är Fuzzing?

Vad är fuzzing

Intro: Vad är fuzzing?

Under 2014 kinesiska hackare hackade sig in i Community Health Systems, en vinstdrivande amerikansk sjukhuskedja, och stal 4.5 miljoner patientdata. Hackarna utnyttjade en bugg som heter Heartbleed som upptäcktes i OpenSSLs kryptografibibliotek några månader före hacket.

Heartbleed är ett exempel på en klass av attackvektorer som tillåter angripare att komma åt ett mål genom att skicka in felaktiga förfrågningar som är tillräckligt giltiga för att klara preliminära kontroller. Medan proffs som arbetar med olika delar av en app gör sitt bästa för att säkerställa dess säkerhet, är det omöjligt att tänka på alla hörnfall som kan skada en app eller göra den sårbar under utveckling.

Det är här "fuzzing" kommer in.

Vad är en fuzzing attack?

Fuzzing, fuzz-testning eller en fuzzing-attack är en automatiserad mjukvarutestteknik som används för att mata in slumpmässiga, oväntade eller ogiltiga data (kallas fuzz) i ett program. Programmet övervakas för ovanliga eller oväntade beteenden såsom buffertspill, kraschar, minnesläckor, trådhängningar och läs-/skrivåtkomstöverträdelser. Fuzzing-verktyget eller fuzzern används sedan för att avslöja orsaken till det ovanliga beteendet.

Fuzzing bygger på antagandet att alla system innehåller buggar som väntar på att upptäckas och kan ges tillräckligt med tid och resurser för att göra det. De flesta system har mycket bra parsers eller indatavalideringsförhindrande nätbrottslingar från att utnyttja eventuella hypotetiska buggar i ett program. Men som vi nämnde ovan är det svårt att täcka alla hörnfall under utvecklingen.

Fuzzers används i program som tar in strukturerad input eller har någon form av tillitsgräns. Till exempel skulle ett program som accepterar PDF-filer ha en viss validering för att säkerställa att filen har filtillägget .pdf och parser för att bearbeta PDF-filen.

En effektiv fuzzer kan generera indata som är tillräckligt giltiga för att komma förbi dessa gränser men ändå ogiltiga nog att orsaka oväntat beteende längre ner i programmet. Detta är viktigt eftersom bara att kunna komma förbi valideringarna betyder inte mycket om ingen ytterligare skada orsakas.

Fuzzers upptäcker attackvektorer som mycket liknar och inkluderar sådana som SQL-injektion, cross-site scripting, buffer overflow och denial-of-service-attacker. Alla dessa attacker är ett resultat av att oväntade, ogiltiga eller slumpmässiga data matas in i ett system. 

 

Typer av fuzzers

Fuzzers kan klassificeras baserat på några egenskaper:

  1. Attackera mål
  2. Metod för att skapa fuzz
  3. Medvetenhet om inputstruktur
  4. Medvetenhet om programstruktur

1. Attackera mål

Denna klassificering baseras på vilken typ av plattform fuzzern används för att testa. Fuzzers används ofta med nätverksprotokoll och mjukvaruapplikationer. Varje plattform har en viss typ av input som den tar emot, och kräver därför olika typer av fuzzers.

Till exempel, när man hanterar applikationer, sker alla fuzzingsförsök vid applikationens olika ingångskanaler, såsom användargränssnittet, kommandoradsterminalen, formulär/textinmatningar och filuppladdningar. Så alla ingångar som genereras av fuzzern måste matcha dessa kanaler.

Fuzzers som hanterar kommunikationsprotokoll måste hantera paket. Fuzzers som riktar in sig på den här plattformen kan generera förfalskade paket, eller till och med fungera som proxyservrar för att modifiera avlyssnade paket och spela upp dem igen.

2. Metod för att skapa fuzz

Fuzzers kan också klassificeras baserat på hur de skapar data att fuzza med. Historiskt sett skapade fuzzers fuzz genom att generera slumpmässiga data från grunden. Det var så professor Barton Miller, initiativtagaren till denna teknik, gjorde det till en början. Denna typ av fuzzer kallas en generationsbaserad fuzzer.

Men även om man teoretiskt sett skulle kunna generera data som kommer att kringgå en förtroendegräns, skulle det ta avsevärd tid och resurser att göra det. Därför används denna metod vanligtvis för system med enkla indatastrukturer.

En lösning på detta problem är att mutera data som är kända för att vara giltiga för att generera data som är tillräckligt giltiga för att passera en förtroendegräns, men ändå ogiltig nog för att orsaka problem. Ett bra exempel på detta är a DNS fuzzer som tar ett domännamn och sedan genererar en stor lista med domännamn för att upptäcka potentiellt skadliga domäner som riktar sig till ägaren av den angivna domänen.

Detta tillvägagångssätt är smartare än det föregående och minskar de möjliga permutationerna avsevärt. Fuzzers som använder denna metod kallas mutationsbaserade fuzzers

Det finns en tredje nyare metod som använder genetiska algoritmer för att konvergera på den optimala fuzz-data som behövs för att utrota sårbarheter. Det fungerar genom att kontinuerligt förfina dess fuzz-data, med hänsyn till prestandan för varje testdata när den matas in i ett program. 

De sämst presterande datauppsättningarna tas bort från datapoolen, medan de bästa muteras och/eller kombineras. Den nya generationen data används sedan för att fuzztesta igen. Dessa fuzzers kallas evolutionära mutationsbaserade fuzzers.

3. Medvetenhet om inputstruktur

Denna klassificering baseras på om en fuzzer är medveten om och aktivt använder indatastrukturen för ett program för att generera fuzz-data. A stum fuzzer (en fuzzer som inte är medveten om ett programs indatastruktur) genererar fuzz på ett mestadels slumpmässigt sätt. Detta kan innefatta både generations- och mutationsbaserade fuzzers. 


Om en fuzzer förses med ingångsmodellen för ett program, kan fuzzern sedan försöka generera eller mutera data så att den matchar den tillhandahållna ingångsmodellen. Detta tillvägagångssätt minskar ytterligare mängden resurser som spenderas på att generera ogiltiga data. En sådan fuzzer kallas en smart fuzzer.

4. Medvetenhet om programstruktur

Fuzzers kan också klassificeras baserat på om de är medvetna om det interna arbetet i programmet de fuzzar, och använder den medvetenheten för att hjälpa till att generera fuzz-data. När fuzzers används för att testa ett program utan att förstå dess interna struktur, kallas det black-box-testning. 

Fuzz-data som genereras under black-box-testning är vanligtvis slumpmässigt såvida inte fuzzern är en evolutionär mutationsbaserad fuzzer, där den "lär sig" genom att övervaka effekten av dess fuzzing och använda den informationen för att förfina dess fuzz-datauppsättning.

White-box-testning använder å andra sidan en modell av programmets interna struktur för att generera fuzz-data. Detta tillvägagångssätt låter en fuzzer komma till kritiska platser i ett program och testa det. 

Populära fuzzing-verktyg

Det är många luddiga verktyg där ute som används av penntestare. Några av de mest populära är:

Begränsningar av fuzzing

Även om Fuzzing är en riktigt användbar penntestteknik, är den inte utan sina fel. Några av dessa är:

  • Det tar ganska lång tid att springa.
  • Krascher och andra oväntade beteenden som upptäcks under black-box-testning av ett program kan vara svåra, för att inte säga omöjliga, att analysera eller felsöka.
  • Att skapa mutationsmallar för smarta mutationsbaserade fuzzers kan vara tidskrävande. Ibland kanske det inte ens är möjligt på grund av att ingångsmodellen är proprietär eller okänd.

 

Ändå är det ett ganska användbart och nödvändigt verktyg för alla som vill upptäcka buggar före skurkarna.

Slutsats

Fuzzing är en kraftfull penntestteknik som kan användas för att upptäcka sårbarheter i programvara. Det finns många olika typer av fuzzers, och nya fuzzers utvecklas hela tiden. Även om fuzzing är ett otroligt användbart verktyg, har det sina begränsningar. Till exempel kan fuzzers bara hitta så många sårbarheter och de kan vara ganska resurskrävande. Men om du vill prova denna fantastiska teknik själv har vi en gratis DNS Fuzzer API som du kan använda på vår plattform. 

Så vad väntar du på? 

Börja lura idag!

Google och The Incognito Myth

Google och The Incognito Myth

Google och inkognitomyten Den 1 april 2024 gick Google med på att avgöra en rättegång genom att förstöra miljarder dataposter som samlats in från inkognitoläget.

Läs mer »