Wikisage, de vrije encyclopedie van de tweede generatie, is digitaal erfgoed

Wikisage is op 1 na de grootste internet-encyclopedie in het Nederlands. Iedereen kan de hier verzamelde kennis gratis gebruiken, zonder storende advertenties. De Koninklijke Bibliotheek van Nederland heeft Wikisage in 2018 aangemerkt als digitaal erfgoed.

  • Wilt u meehelpen om Wikisage te laten groeien? Maak dan een account aan. U bent van harte welkom. Zie: Portaal:Gebruikers.
  • Bent u blij met Wikisage, of wilt u juist meer? Dan stellen we een bescheiden donatie om de kosten te bestrijden zeer op prijs. Zie: Portaal:Donaties.
rel=nofollow

Fuzz-testen

Uit Wikisage
Naar navigatie springen Naar zoeken springen
Bestand:Binary executable file2.png
Een voorbeeld van machinetaal, in hexadecimale cijfers. Deze taal kan de processor van een computer meteen uitvoeren. Software wordt meestal niet meer in deze taal geschreven. Een van de eerste fuzzingmethodes was hierop gebaseerd.

Fuzzing of fuzzing-testen is een techniek voor het testen van software die ongeldige, onverwachte of willekeurige data invoert in een computerprogramma. Het programma wordt in de gaten gehouden voor verwachtingen zoals crashen, falende ingebouwde codepredikaten of het vinden van geheugenlekken. Fuzzing wordt vooral gebruikt voor het testen van beveiligingsproblemen in software of in besturingssystemen.

Geschiedenis

Ontstaan van de term

De term "fuzzing" of fuzz-testen" komt origineel van een klasproject in 1988. Deze klas werd gegeven door Barton Miller aan de the University of Wisconsin[1][2]. Het klasproject ontwikkelde een programma (fuzzer) om de betrouwbaarheid van Unix-programma's te testen. De test werd herhaald in 1995. Toen werd de test uitgebreid om op GUI gebaseerde tools (zoals bijvoorbeeld het X Window System), netwerkprotocollen en systeembibliotheek API's te testen. Testen nadien concentreerden zich op commando- en GUI-gebaseerde applicaties van zowel Windows als Mac OS X.

Vroegere voorbeelden

  • Een van de eerste voorbeelden van fuzzing dateert van 1983. Steve Capps ontwikkelde een Macintosh applicatie genoemd "the monkey". De applicatie maakte gebruik van journaling codes om willekeurige data in te brengen in Mac-programma's. Het werd gebruikt om bugs te testen in MacPaint[3].
  • Een ander voorbeeld van fuzz-test-gereedschap was crashme uit 1991. Het was bedoeld om de robuustheid van Unix en Unix-achtige besturingssystemen te testen door het uitvoeren van willekeurige machine-instructies[4].

Technieken

Twee categorieën

De fuzzing-programma's bestaan in 2 categorieën:

  1. Op mutatie gebaseerde fuzzers muteren bestaande voorbeelddata om nieuwe data te creëren.
  2. Op generatie gebaseerde fuzzers definiëren nieuwe testdata op basis van modellen van de input.

Verschillende vormen

Bestand:Mailman-commandlineinterface.png
Voorbeeld van command-line-interface

De simpelste vorm van fuzzing is het zenden van een willekeurige stroom bits naar de software, als: Command-line-interface, als willekeurig gemuteerde protocolpakketten of als evenementen. Deze techniek van willekeurige data te zenden, blijft een krachtig middel om bugs te vinden in Command-line-interface, netwerkprotocollen en op GUI-gebaseerde applicaties en diensten. Dit valt dus onder de op generatie-gebaseerde fuzzers.

Een andere veel voorkomende gemakkelijke techniek is het muteren van bestaande input (bijv. bestanden van een integratietest) door bits willekeurig om te draaien of door blokken van het bestand te verplaatsen. Echter, de meest succesvolle fuzzers hebben een gedetailleerde kennis over het formaat of het protocol dat wordt getest. Dit valt dus onder de op mutatie gebaseerde fuzzers.

Er bestaat ook de "smart-fuzzing"-techniek (ook bekend als: robuustheidstest, syntactische test, spellingstest of foute (input) injectie). Een op specificatie gebaseerde fuzzer houdt in dat een volledige reeks van specificaties wordt geschreven in een gereedschap. Dan wordt op model gebaseerde generatietesttechnieken in het volledig aflopen door de specificaties en het toevoegen van abnormaliteiten van de data's inhoud, structuur, berichten en sequenties.

De protocolaandachtigheid kan ook heuristisch gecreëerd worden op basis van voorbeelden door gebruik te maken van tools zoals Sequitur. Deze fuzzers kunnen testcasussen genereren uit het niets. Of ze kunnen voorbeelden muteren op basis van test suites of uit het echt. Ze kunnen zich concentreren op geldige of ongeldige input, met 'bijna volledig geldige' input die de 'diepste' fouten eruit haalt.

Er zijn 2 limieten aan op protocol gebaseerde fuzzing gebaseerd op protocolimplementatie van gepubliceerde specificaties:

  1. Het testen kan niet doorgaan tot de specificaties een relatieve maturiteit hebben, sinds een specificatie een eerste vereiste is om zo'n fuzzer te schrijven.
  2. Vele bruikbare protocollen zijn gepatenteerd of bevatten gepatenteerde uitbreidingen van gepubliceerde protocollen. Als fuzzing dan enkel gebaseerd is op gepubliceerde specificaties, dan zal de testomvang voor de nieuwe of gepatenteerde protocollen beperkt tot onbestaande zijn [5].

Combinatie met andere testtechnieken

Fuzzing kan ook gecombineerd worden met andere technieken.

Gebruik

Methodiek

Fuzz-testen wordt vaak gebruikt als een blackboxtest in grote softwareprojecten, waar er een budget bestaat om testtool te ontwikkelen. Fuzz-testen biedt een kosten-batenanalyse voor vele programma's.

De techniek kan slechts een aselecte steekproef voorzien van het systeems gedrag. En in veel gevallen kan het slagen van een fuzz-test alleen aantonen dat een stukje software uitzonderingen aankan zonder te crashen, in plaats van correct gedrag. Dit betekent fuzz-testen algehele kwaliteit verzekert, in plaats van een bug-finding tool, en geen vervanging is voor uitgebreide tests of formele methoden.

Als een ruw meetinstrument voor betrouwbaarheid kan fuzzing voorstellen welke delen van het programma bijzondere aandacht moet krijgen in de vorm van een code audit, statische code analyse of gedeeltelijke herschrijving[5].

Soorten bugs

Bestand:Winpdb-1.3.6.png
een voorbeeld van een programma dat zichzelf debugt
  • Evenals het testen voor volledige crashes, kunnen fuzz-testen ook gebruikt worden om bugs te vinden zoals mislukte beweringen en geheugenlekken (indien gekoppeld met een geheugendebugger). De methode is handig voor grote toepassingen, waarbij eender welke bug de geheugenveiligheid kan beïnvloeden heel waarschijnlijk een ernstige kwetsbaarheid is.
  • Sinds fuzzing vaak ongeldige invoer genereert, wordt het gebruikt voor het testen van foutieve afhandelingsroutines, die belangrijk zijn voor software die zijn input niet kan beheersen. Eenvoudige fuzzing kan van gezien worden als een manier om negatieve testen te automatiseren.
  • Fuzzing kan ook een aantal vormen van "correctheid"bugs vinden. Zo kan het worden gebruikt om foute serialisatiebugste vinden door het klagen wanneer programma's serializer iets uitzendt dat het programma's parser verwerpt. Het kan ook onbedoelde verschillen tussen twee versies van een programma vinden of tussen twee implementaties van dezelfde specificatie.

Voortplanting en isolatie

Testcasevermindering is het proces van minimale testcases te extraheren uit een originele testcase[6][7]. Testcasevermindering kan manueel worden gedaan, of met behulp van softwaretools, en meestal gaat om een verdeel-en-heers-algoritme , waarin delen van de test één voor één verwijderd worden, totdat alleen de essentiële kern van de testcase blijft.

Om fouten te kunnen reproduceren, zal de fuzzing-software vaak de invoergegevens dat ze produceert bijhouden, meestal voordat ze het toepast in de software. Als de computer volledig crasht bijft de data bewaart. Als de fuzz-stroom pseudowillekeurig nummergegenereerd is, kan de zaadwaarde worden opgeslagen om de fuzz-poging te reproduceren. Zodra een bug wordt gevonden, zullen sommige fuzzing-software helpen om een testcase te bouwen, die wordt gebruikt voor debugging, gebruik makend van testcaseverminderingshulpmiddelen zoals Delta of Lithium.

Voor- en nadelen

Voordelen

Bestand:CVE-2014-0160.png
Een voorbeeld van een bug
  • bugs gevonden met fuzz-testen zijn soms ernstig, uitbuitbare bugs die een aanvaller kan gebruiken. Ontdekkingen gebeuren regelmatig omdat de fuzz-testen bekend zijn. Aanvallers gebruiken dezelfde technieken om software te misbruiken. Dit is een voordeel ten opzichte van binaire of brontest en de foute (input) injecties.
  • Fuzz-testen verbeteren de softwarebeveiliging en de softwareveiligheid omdat het vergissingen en gebreken vindt die mensen niet vinden.

Nadelen

  • Het probleem met fuzzing om programmafouten te vinden is dat het slechts eenvoudige fouten vindt. Het uitvoeren van de test wordt steeds moeilijker en elke fuzzer neemt snelkoppelingen om iets interessants te vinden. Een primitieve fuzzer kan een slechte code-omvang hebben als de input een controlesom bevat dat niet aangepast is om willekeurige veranderingen aan te kunnen. Code-omvanginstrumenten worden vaak gebruikt om in te schatten hoe "goed" een fuzzer werkt. Van elke fuzzer kan worden verwacht dat ze een andere set van bugs vinden.
  • De willekeur van inputs gebruikt in fuzzing wordt vaak gezien als een nadeel, omdat het vangen van een grenswaardeomstandigheid met willekeurige input onwaarschijnlijk is. Maar de meeste fuzzers vandaag de dag lossen dit probleem op met behulp van deterministische algoritmen op basis van de gebruiker zijn inputs.

Bronvermelding

Bronnen, noten en/of referenties:

  1. º Barton Miller (2008). "Preface". In Ari Takanen, Jared DeMott and Charlie Miller, Fuzzing for Software Security Testing and Quality Assurance, ISBN 978-1-59693-214-2
  2. º "Fuzz Testing of Application Reliability". University of Wisconsin-Madison. Opgehaald 8-12-2014.
  3. º "Macintosh Stories: Monkey Lives". Folklore.org. 1999-02-22. Opgehaald 8-12-2014.
  4. º "crashme". CodePlex. Retrieved 2012-06-26.
  5. 5,0 5,1 5,2 "Fuzz testing". Wikipedia.org. Opgehaald 10-12-2014.
  6. º "Test Case Reduction". Opgehaald 10-12-2014.
  7. º "IBM Test Case Reduction Techniques". Opgehaald 12-12-2014.
rel=nofollow
Q1189053 op Wikidata  Intertaalkoppelingen via Wikidata (via reasonator)
rel=nofollow
rel=nofollow