C++ Academy · Oppitunti

Fuzz-testaus libFuzzerilla

Löydä reunatapauksissa ilmeneviä kaatumisia fuzz-testaamalla koodia libFuzzerilla.

Oppitunti 3/415 vaihetta

Fuzz-testaus libFuzzerilla on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Miksi fuzzata?

Fuzzing tuottaa satunnaisia syötteitä löytääkseen kaatumisia, jumiutumisia ja tietoturvavirheitä. Modernit fuzzing-työkalut käyttävät kattavuuspalautetta ja muokkaavat syötteitä tutkiakseen uusia koodipolkuja.

libFuzzer

libFuzzer kuuluu LLVM:ään ja integroituu sanitizereihin. Kirjoittakaa yksi funktio, joka fuzzkaa yhtä sisääntulopistettä; kehys huolehtii syötteiden tuottamisesta.

Fuzz-kohteen kirjoittaminen

Allekirjoitus on kiinteä: ottakaa vastaan tavutaulukko ja palauttakaa 0.

#include <cstdint>
#include <cstddef>

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
    parse_input(reinterpret_cast<const char*>(data), size);
    return 0;
}

Kääntäminen libFuzzeria varten

Käyttäkää Clangia yhdessä valitsimien -fsanitize=fuzzer,address kanssa. Linkittäkää suoraan — main-funktiota ei tarvita.

clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_target

Kattavuusohjattu muokkaus

libFuzzer seuraa, mitä koodipolkuja kukin syöte suorittaa. Se muokkaa lupaavia syötteitä tutkiakseen syvempiä polkuja — tämä on paljon tehokkaampaa kuin sokkona tuotetut satunnaissyötteet.

Korpus

Alustakaa fuzzer tunnettuja kiinnostavia syötteitä sisältävällä hakemistolla. Fuzzer tuottaa uusia syötteitä muokkaamalla niitä.

./fuzz_target corpus/

Sanakirjatiedostot

Tarjotkaa yleisten tunnisteiden sanakirja, jotta kieliopillisten syötteiden, kuten HTML:n, JSONin ja protokollaviestien, tutkiminen nopeutuu.

Yhdistäkää sanitizerit

AddressSanitizerin alla ajaminen muuttaa hiljaiset muistivirheet välittömiksi kaatumisiksi, jotka fuzzer voi havaita.

Suorituskyky

Yksi ydin voi suorittaa pienillä kohteilla kymmeniä tuhansia ajoja sekunnissa. Ajattakaa fuzzingia tuntien tai päivien ajan ja antakaa sen toimia CI:n taustalla.

Kaatumisten toistaminen

Kun libFuzzer löytää kaatumisen, se tallentaa syötteen levylle. Voitte toistaa ajon myöhemmin virheen selvittämistä varten.

./fuzz_target crash-abc123

OSS-Fuzz

Googlen OSS-Fuzz suorittaa avoimen lähdekoodin projektien fuzzereita jatkuvasti ja raportoi virheistä. Monet tunnetut kirjastot on integroitu siihen.

AFL ja Honggfuzz

Muitakin fuzzereita on olemassa:

  • AFL/AFL++ — prosessipohjainen, fork-palvelimen nopeutukset
  • Honggfuzz — tukee verkkoprotokollia

libFuzzer on helpoin tapa integroida fuzzing C++-projektiin.

Milloin fuzzata

Fuzzatkaa kaikkea koodia, joka käsittelee epäluotettavaa syötettä:

  • jäsentimet (JSON, XML, protobuf)
  • dekooderit (kuva, ääni, video)
  • verkkoprotokollien käsittelijät
  • kaikki ulkoista dataa lukeva koodi

Pikatarkistus

Miksi kattavuusohjattu fuzzing on tehokkaampaa kuin täysin satunnainen fuzzing?

Kertaus

libFuzzer on Clangiin integroitu kattavuusohjattu fuzzer. Kirjoittakaa pieni LLVMFuzzerTestOneInput-sisääntulo, kääntäkää asetuksella -fsanitize=fuzzer,address ja antakaa sen etsiä kaatumisia. Yhdistäkää se sanitizereihin ja korpuksiin; fuzzatkaa kaikkea epäluotettavaa syötettä käsittelevää koodia.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Fuzz-testaus libFuzzerilla” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Fuzz-testaus libFuzzerilla”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Fuzz-testaus libFuzzerilla”?

Löydä reunatapauksissa ilmeneviä kaatumisia fuzz-testaamalla koodia libFuzzerilla. Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Fuzz-testaus libFuzzerilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Staattisen analyysin työkalut: clang-tidy, cppcheck
  2. Sanitizerit: Address, Thread, UB Sanitizer
  3. Fuzz-testaus libFuzzerilla
  4. Jatkuva integraatio C++-projekteille
← Takaisin: C++ Academy