Výukový program Fuzz Testing (Fuzzing).

⚡ Chytré shrnutí

Fuzz testování vkládá do programu neplatná, neočekávaná nebo náhodná data a sleduje pády, zaseknutí a chyby paměti, čímž odhaluje bezpečnostní vady, ke kterým se skriptované funkční testy samy o sobě téměř nikdy nedostanou.

  • 🔘 Původ: Barton Miller tento termín zavedl na University of Wisconsin-Madison a první běhy fuzzů v roce 1989 způsobily pád zhruba třetiny testovaných unixových utilit.
  • ☑️ Šestikroková smyčka: Identifikujte cíl, identifikujte vstupy, generujte fuzzy data, spusťte, monitorujte chování a poté zaznamenejte každou objevenou vadu.
  • (Tj. Tři generační strategie: Mutační fuzzery manipulují s platnými vzorky, generační fuzzery sestavují vstupy z modelu a protokolové fuzzery pracují se specifikací.
  • 🧪 Zpětná vazba z pokrytí změnila pole: Moderní enginy uchovávají veškerý vstup, který dosáhne nového kódu, který tak nachází mnohem hlubší chyby než čistě náhodná data.
  • 🛠️ Nástrojářství se posunulo dál: Peach Fuzzer a WebScarab jsou archivované, zatímco AFL++, libFuzzer, OSS-Fuzz, boofuzz ​​a OWASP ZAP jsou udržované možnosti.
  • ⚙️ Známé limity: Fuzzing vyhledává pády, nikoli logické chyby, takže spíše doplňuje než nahrazuje kontrolu kódu a penetrační testování.

Výukový program Fuzz Testing (Fuzzing).

Co je Fuzz testování?

Fuzz testování neboli fuzzing je technika testování softwaru, která vkládá neplatná nebo náhodná data zvaná FUZZ do softwarového systému za účelem odhalení chyb v kódu a bezpečnostních mezer. Účelem fuzz testování je vkládání dat pomocí automatizovaných nebo poloautomatických technik a testování systému na různé výjimky, jako je pád systému nebo selhání vestavěného kódu.

Fuzz testování původně vyvinul Barton Miller na University of Wisconsin-Madison, který tento termín zavedl poté, co šum na modemovém spojení způsobil pád programů, které používal. Jeho studenti spustili první fuzzery v roce 1989 a zjistili, že zhruba třetina unixových utilit, na které se zaměřili, se zhroutila nebo se zasekla. Fuzz testování je... testování softwaru technika a je to druh Testování bezpečnosti.

Níže uvedený diagram znázorňuje základní fuzzingovou smyčku, kde jsou vygenerovaná data odesílána do testované aplikace a je pozorována odezva.

Pracovní postup fuzz testování: fuzzer generuje chybně formátovaný vstup a předává ho testované aplikaci.

Proč dělat Fuzz testování?

Fuzzing si v testovacím plánu zaslouží své místo, protože zkoumá vstupy, pro které nikdo nenapadlo napsat testovací případ. Hlavní důvody, proč ho týmy používají, jsou uvedeny níže.

  • Fuzz testování obvykle nachází nejzávažnější bezpečnostní chyby a defekty, protože havárie je přímým důkazem neošetřené vstupní cesty.
  • Fuzz testování poskytuje efektivnější výsledky při použití s Černá Box Testování, beta testování a další metody ladění.
  • Fuzz testování se používá ke kontrole zranitelnosti softwaru a je to velmi nákladově efektivní testovací technika, protože vstupy jsou generovány, nikoli psány ručně.
  • Fuzz testování je jednou z technik testování černé skříňky. Fuzzing je také jednou z nejběžnějších metod, které hackeři používají k nalezení zranitelnosti v systému, takže jeho spuštění jako první odstraní útočníkovi nejjednodušší cestu dovnitř.

Typy fuzz testování

Fuzzery se obvykle seskupují podle toho, kolik toho vědí o programu, na který útočí. Čím více fuzzer ví, tím hlouběji do kódu se může dostat.

Typ Co ví chmýřík Typické použití
Rozmazávání černé skříňky Nic o vnitřním zařízení; vidí pouze vstupy a výstupy. Quick smoke běží na binárním nebo aktivním endpointu.
Bílé boxové rozmazávání Plný zdrojový kód, často kombinovaný se symbolickým prováděním pro řešení těžko dostupných větví. Hloubková analýza komponenty, jejíž zdroj je k dispozici.
Šedá krabice se chmýří Žádná kontrola zdrojového kódu, ale zpětná vazba za běhu, například které větve kódu vstup dosáhl. Výchozí nastavení pro moderní enginy jako AFL++ a libFuzzer.

Druhé, starší rozdělení odděluje hloupé chmýření od inteligentní fuzzingHloupý fuzzer obrací bity bez znalosti vstupního formátu, takže většina jeho dat je odmítnuta prvním analyzátorem, na který narazí. Inteligentní fuzzer rozumí kontrolním součtům, polím délky a struktuře zpráv, takže jeho vstupy přežijí validaci a dostanou se k logice pod nimi. Fuzzing s řízeným pokrytím je zjemnění šedé krabice, které udělalo z fuzzingu mainstream: engine instrumentuje binární soubor, uchovává jakýkoli vstup, který dosáhne nové větve, a mutuje přeživší, takže korpus se stabilně vyvíjí směrem k neprozkoumanému kódu, místo aby se restartoval od náhodného šumu.

Jak provést Fuzz testování

Kroky pro fuzz testování zahrnují základní testovací kroky:

Krok 1) Identifikujte cílový systém — vyberte binární, knihovní, servisní nebo protokolový koncový bod, který bude napaden, a potvrďte, že máte oprávnění jej otestovat.

Krok 2) Identifikujte vstupy — vypsat všechny vstupní body, ze kterých cíl čte: soubory, argumenty příkazového řádku, proměnné prostředí, síťové pakety, pole formulářů a datová zatížení API.

Krok 3) Vygenerujte fúzovaná data — produkovat chybně formátované vstupy mutací platných vzorků, jejich generováním z modelu formátu nebo kombinací obojího.

Krok 4) Proveďte test s použitím fuzzy dat — spusťte cíl s vygenerovanými vstupy, ideálně ve smyčce, která po každém selhání proces automaticky restartuje.

Krok 5) Sledujte chování systému — sledujte pády, zablokování, selhání assercí, nadměrné využití paměti a sanitizační hlášení, spíše než jen kontrolujte tištěný výstup.

Krok 6) Zaznamenejte závady — uložit přesný vstup, který spustil každé selhání, zmenšit ho na nejmenší reprodukovatelný případ a uložit ho do zásobníku trace připojeno.

Příklady Fuzzerů

Fuzzery se také klasifikují podle toho, jak sestavují svůj vstup, a tři níže uvedené přístupy jsou ty, se kterými se setkáte nejčastěji.

  • Fuzzery založené na mutaci změnit existující vzorky dat za účelem vytvoření nových testovacích dat. Jedná se o velmi jednoduchý a přímočarý přístup: začíná s platnými vzorky protokolu a neustále se upravuje každý bajt nebo soubor.
  • Fuzzery založené na generaci definují nová data na základě vstupu modelu. Začnou generovat vstup od nuly na základě specifikace.
  • Protokolové fuzzery závisí na detailní znalosti testovaného formátu protokolu a tato znalost vychází ze specifikace. Zahrnuje to zápis pole specifikace do nástroje a následné použití techniky generování testů založené na modelu k procházení specifikace a přidání nepravidelností v obsahu dat, sekvenci atd. Toto je také známé jako syntaktické testování, gramatické testování nebo testování robustnosti. Fuzzer může generovat testovací případy z existujícího případu nebo může použít platné či neplatné vstupy.

Protokolově založené fuzzing má dvě omezení:

  1. Testování nemůže pokračovat, dokud není specifikace zralá.
  2. Mnoho užitečných protokolů je rozšířením publikovaných protokolů. Pokud je fuzz testování založeno na zveřejněných specifikacích, Pokrytí testu pro nové protokoly budou omezeny.

Nejjednodušší formou fuzzingové techniky je odesílání náhodného vstupu do softwaru buď jako pakety protokolu, nebo jako událost. Tato technika předávání náhodného vstupu je velmi účinná pro hledání chyb v mnoha aplikacích a službách. K dispozici jsou i další techniky, které se velmi snadno implementují. K implementaci těchto technik stačí změnit stávající vstupy a vstup můžeme změnit jednoduše záměnou jeho bitů.

Typy chyb zjištěných Fuzz Testingem

Protože fuzzing posuzuje běh podle chování programu, nikoli podle očekávané hodnoty, odhalené vady se shlukují do tří skupin.

  • Selhání assertací a úniky paměti: Tato metodologie se široce používá pro rozsáhlé aplikace, kde chyby ovlivňují bezpečnost paměti, což představuje závažnou zranitelnost. Buffer Zde se objevují přetečení, použití po uvolnění a čtení mimo hranice.
  • Neplatný vstup: Ve fuzz testování se fuzzery používají ke generování neplatného vstupu, který se používá k testování rutin pro ošetření chyb, což je důležité pro software, který nekontroluje svůj vstup. Jednoduchý fuzzing lze vnímat jako způsob automatizace. negativní testování.
  • Chyby v korektnosti: Fuzzing lze také použít k detekci některých typů chyb „správnosti“, jako je poškozená databáze nebo špatné výsledky vyhledávání. Obvyklým způsobem, jak tyto chyby odhalit, je diferenciální fuzzing, který přivádí stejný vstup do dvou implementací a porovnává odpovědi.

Nástroje pro testování Fuzz

Nástroje používané ve webové bezpečnosti lze široce využít ve fuzz testování, jako například Burp Suite a Peach Fuzzer. Několik níže uvedených klasických jmen je nyní archivováno, takže jejich aktuální stav je uveden vedle každého záznamu.

  • Peach FuzzerPeach Fuzzer poskytuje robustnější bezpečnostní pokrytí než skener. Jiné testovací nástroje mohou vyhledávat pouze známé hrozby, zatímco Peach Fuzzer umožňuje uživatelům najít známé i neznámé hrozby. Peach Tech byl odkoupen společností GitLab a Community Edition v3 již není udržována; udržovaným nástupcem je Komunitní edice GitLab Protocol Fuzzer.
  • Spike Proxy: profesionální nástroj, který vyhledává zranitelnosti na úrovni aplikací ve webových aplikacích. SPIKE Proxy pokrývá základy, jako například SQL Injection a cross-site scripting na zcela otevřeném Python infrastrukturu a byla k dispozici pro Linux a WindowsNebyl mnoho let udržován a je zde uveden z historického kontextu.
  • WebScarabWebScarab je napsán v jazyce Java a je proto přenositelný na mnoho platforem. Framework WebScarab komunikuje pomocí protokolů HTTP a HTTPS a funguje jako zachycující proxy: umožňuje operátorovi kontrolovat a upravovat požadavky vytvořené prohlížečem předtím, než je server obdrží, a kontrolovat a aktualizovat odpovědi generované serverem předtím, než je prohlížeč obdrží. Jakákoli mezera v legislativě, kterou WebScarab najde, je přidána do seznamu hlášených problémů. Repozitář byl archivován v dubnu 2024 a nyní je pouze pro čtení.
  • OWASP WSFuzzerWSFuzzer je program s licencí GPL, napsaný v Python která cílila na webové služby a ve své poslední verzi byla založena na HTTP SOAP služby byly hlavním cílem. Dodával se jako součást WebScarabu a byl s ním vyřazen z provozu; OWASP ZAP a jeho doplněk Fuzzer jsou doporučenou náhradou.
  • Zachované alternativy: AFL++ a libFuzzer jsou standardní enginy pro nativní kód zaměřené na pokrytí, OSS-Fuzz provozuje je nepřetržitě a zdarma pro open-source projekty a blázen zahrnuje fuzzingy síťových protokolů v PythonŠirší seznam je uveden v průvodci nástroje pro testování zabezpečení.

Nejlepší postupy pro fuzz testování

Fuzzer, který je namířen na cíl a ponechán bez povšimnutí, málokdy najde něco. Níže uvedené postupy odlišují kampaň, která produkuje zaznamenané defekty, od kampaně, která pouze spaluje čas CPU.

  • Začněte s dobrým korpusem semen. Shromažďujte skutečné, platné vstupy, které aplikace již akceptuje. Mutace skutečného souboru dosáhne parsačního kódu mnohem rychleji než mutace náhodných bajtů.
  • Napište malý, rychlý postroj. Vstupní bod by měl během každého běhu provést jednu věc, vyhnout se síťovým voláním a zápisům na disk a rychle se vrátit, protože propustnost se měří v počtu spuštění za sekundu.
  • Zapněte dezinfekční prostředky. Tiché poškození paměti často nezpůsobuje pád systému. AddressSanitizer a UndefinedBehaviorSanitizer jej převedou na okamžité diagnostikovatelné selhání.
  • Běhejte dlouho a běžte nepřetržitě. Hodinový nebo dvouhodinový běh odhalí mělké chyby; hluboké cesty obvykle vyžadují mnoho hodin, a proto patří fuzzing do noční úlohy CI spíše než do manuálního sezení.
  • Minimalizujte a odstraňte duplicitní chyby. Zmenšete chybný vstup na nejmenší možnou formu a seskupte pády podle zásobníku. trace, jinak jedna chyba dorazí jako stovky lístků.
  • Uchovávejte regresní korpus. Přidejte každý reprodukující se vstup do permanentní sady, která se spouští při každém sestavení, aby se opravená vada nemohla tiše vrátit.
  • Legálně vymezte cíl. Fuzzing aktivní služby třetí strany bez písemného souhlasu je nerozeznatelný od útoku.

Výhody Fuzz testování

Pokud se používá s realistickými očekáváními, fuzzing přidává hodnotu, které se jiným technikám obtížně daří.

  • Fuzz testování vylepšuje testování bezpečnosti softwaru.
  • Chyby nalezené ve fuzzingu jsou někdy závažné a často se jedná o ty samé, které používají útočníci, včetně pádů, úniků paměti a neošetřených výjimek.
  • Pokud si testeři kvůli omezenému času a zdrojům nějakých chyb nevšimnou, jsou tyto chyby také nalezeny ve fuzz testování.
  • Vstupy generuje stroj, takže pokrytí roste přes noc bez nutnosti další manuální práce.

Nevýhody Fuzz testování

Stejné vlastnosti, které dělají fuzzing levným, také omezují, co může dokázat.

  • Samotné fuzz testování nemůže poskytnout úplný obraz celkové bezpečnostní hrozby nebo souboru chyb.
  • Fuzz testování je méně efektivní při řešení bezpečnostních hrozeb, které nezpůsobují pády programu, jako jsou některé viry, červi a trojské koně.
  • Fuzz testování dokáže detekovat pouze relativně jednoduché chyby nebo hrozby a nebude se zabývat obchodní logikou.
  • Pro efektivní výkon je zapotřebí značný strojový čas.
  • Stanovení okrajové podmínky s náhodnými vstupy je velmi problematické, ačkoli testeři nyní řeší většinu tohoto problému deterministickými algoritmy řízenými uživatelskými vstupy.

Fuzz testování vs. penetrační testování

Obě aktivity hledají bezpečnostní nedostatky, přesto odpovídají na různé otázky a jsou zřídka zaměnitelné.

Kritéria Fuzz testování Penetrační testování
Řizen Automatizovaný engine generující chybný vstup Zkušený tester uvažuje o systému
Hledá Pády, zablokování a chyby zabezpečení paměti Zneužitelné slabiny, včetně logických a konfiguračních chyb
Hloubka Velmi široké pokrytí vstupů, povrchní uvažování Úzké pokrytí, hluboké zdůvodnění
Výstup Reprodukce vstupů a zásobníku traces Zpráva o zjištěních s cestami zneužití a hodnocením rizik
Nejlepší okamžik Neustále v procesu sestavení Pravidelně proti kandidátovi na vydání

V praxi se tyto dva faktory vzájemně doplňují: fuzzing odstraňuje levné, automatizovatelné pády, takže omezený počet hodin testera se věnuje chybám, které odhalí pouze člověk.

Nejčastější dotazy

Seed corpus je počáteční sada platných vstupů, které fuzzer upravuje. Nejlépe fungují malé, rozmanité a reálné soubory, protože každý z nich již projde analyzátorem a umožňuje enginu utratit svůj rozpočet za hlubší kód místo první kontroly platnosti.

Fuzz harness je malá funkce, která předává jeden buffer fuzzovaných bajtů testovanému kódu. Měla by se vyhnout globálnímu stavu, zápisu do souborů a síťovým voláním, aby ji engine mohl spustit tisíckrát za sekundu.

Hodina nebo dvě odhalí povrchní chyby. Seriózní kampaně probíhají mnoho hodin nebo dnů, protože nové informace přicházejí v návalech. Plató v křivce pokrytí, nikoli údaj hodin, je upřímným signálem, že kampaň se přestala vyplácet.

AddressSanitizer zachycuje přetečení vyrovnávací paměti a použití po uvolnění paměti, UndefinedBehaviorSanitizer zachycuje zneužití celých čísel a ukazatelů a MemorySanitizer zachycuje čtení neinicializované paměti. Bez nich mnoho poškození proběhne tiše a fuzzer nehlásí vůbec žádnou chybu.

Reprodukujte to, minimalizujte vstup na nejmenší případ selhání, seskupte to s haváriemi sdílejícími stejný zásobník trace, poté podejte jeden lístek obvyklým způsobem proces správy vad a přidat vstup do regresního korpusu.

Sdílejí náhodnost, ale ne záměr. Testování na opicích Vyvolává libovolné akce uživatele na běžícím rozhraní, zatímco fuzzing cílí na konkrétní vstupní parser a měří pokrytí kódu, takže se může nasměrovat ke kódu, ke kterému se dřívější vstupy nikdy nedostaly.

Jazykové modely se používají k navrhování rozhraní pro nefuzzovaná API, k syntéze vstupních dat pro exotické formáty a ke shlukování a shrnutí hlášení o selhání. Engine stále poskytuje zpětnou vazbu o pokrytí; model odstraňuje především ruční nastavení.

GitHub Copilot Může vytvořit vstupní bod libFuzzeru, soubor sestavení a generátor semen z existující signatury API. RevPečlivě si prohlédněte výsledek, protože systém, který tiše absorbuje chyby, nebude hlásit žádné pády.

Shrňte tento příspěvek takto: