C++ Academy · Pelajaran

Fuzzing dengan libFuzzer

Cari kerosakan kes tepi dengan menguji kod anda secara fuzz menggunakan libFuzzer.

Pelajaran 3 daripada 415 langkah

Fuzzing dengan libFuzzer ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Mengapa Pengujian Fuzz?

Pengujian fuzz menjana masukan rawak untuk mencari ranap, kebuntuan dan pepijat keselamatan. Penguji fuzz moden menggunakan maklum balas liputan untuk mengembangkan masukan yang meneroka laluan kod baharu.

libFuzzer

libFuzzer ialah sebahagian daripada LLVM dan berintegrasi dengan pensanitasi. Tulis satu fungsi yang menguji satu titik masuk; rangka kerja mengawal penjanaan masukan.

Menulis Sasaran Fuzz

Tandatangan fungsi adalah tetap: terima tatasusunan bait dan pulangkan 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;
}

Mengkompil untuk libFuzzer

Gunakan Clang dengan gabungan -fsanitize=fuzzer,address. Pautkan secara terus — tiada main diperlukan.

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

Mutasi Berpandukan Liputan

libFuzzer menjejaki laluan kod yang dilaksanakan oleh setiap masukan. Alat ini mengubah suai masukan yang menjanjikan untuk meneroka laluan yang lebih mendalam — jauh lebih cekap berbanding penjanaan rawak tanpa panduan.

Korpus

Mulakan penguji fuzz dengan direktori yang mengandungi masukan menarik yang diketahui. Penguji fuzz mengembangkan masukan baharu dengan mengubah suai masukan tersebut.

./fuzz_target corpus/

Fail Kamus

Sediakan kamus token biasa untuk mempercepat penerokaan masukan bergramatis seperti HTML, JSON dan mesej protokol.

Gabungkan dengan Pensanitasi

Menjalankan program di bawah AddressSanitizer menukar kerosakan senyap kepada ranap serta-merta yang boleh dikesan oleh penguji fuzz.

Prestasi

Satu teras boleh melakukan puluhan ribu pelaksanaan sesaat pada sasaran kecil. Jalankan selama beberapa jam atau hari; biarkan ia berjalan di latar belakang CI.

Menghasilkan Semula Ranap

Apabila libFuzzer menemui ranap, alat ini menyimpan masukan ke cakera. Mainkannya semula kemudian untuk menyahpepijat.

./fuzz_target crash-abc123

OSS-Fuzz

OSS-Fuzz oleh Google menjalankan penguji fuzz pada projek sumber terbuka secara berterusan dan melaporkan pepijat. Banyak pustaka terkenal berintegrasi dengannya.

AFL dan Honggfuzz

Penguji fuzz lain juga tersedia:

  • AFL/AFL++ — berasaskan proses, dengan peningkatan kelajuan pelayan fork
  • Honggfuzz — menyokong protokol rangkaian

libFuzzer ialah integrasi C++ yang paling mudah.

Bila Hendak Menggunakan Pengujian Fuzz

Lakukan pengujian fuzz pada mana-mana kod yang mengendalikan masukan yang tidak dipercayai:

  • Penghurai (JSON, XML, protobuf)
  • Penyahkod (imej, audio, video)
  • Pengendali protokol rangkaian
  • Apa-apa sahaja yang membaca data luaran

Semakan Pantas

Apakah yang menjadikan pengujian fuzz berpandukan liputan lebih berkesan berbanding pengujian fuzz yang sepenuhnya rawak?

Ringkasan

libFuzzer ialah penguji fuzz berpandukan liputan yang berintegrasi dengan Clang. Tulis titik masuk LLVMFuzzerTestOneInput yang kecil, bina dengan -fsanitize=fuzzer,address dan biarkan alat itu mencari ranap. Gabungkan dengan pensanitasi dan korpus; lakukan pengujian fuzz pada mana-mana kod yang menyentuh masukan yang tidak dipercayai.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Fuzzing dengan libFuzzer” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Fuzzing dengan libFuzzer”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Fuzzing dengan libFuzzer”?

Cari kerosakan kes tepi dengan menguji kod anda secara fuzz menggunakan libFuzzer. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Fuzzing dengan libFuzzer” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Alat Analisis Statik: clang-tidy, cppcheck
  2. Sanitizers: Address, Thread, UB Sanitizer
  3. Fuzzing dengan libFuzzer
  4. Integrasi Berterusan untuk Projek C++
← Kembali ke C++ Academy