
Sudah ada artikel tentang Habré beberapa kali yang mengangkat topik American Fuzzy Lop (AFL) (
1 ,
2 ). Tetapi dalam artikel ini kita tidak akan berbicara tentang AFL klasik, tetapi tentang utilitas tambahan untuk itu dan modifikasinya, yang, menurut pendapat kami, dapat secara signifikan meningkatkan kualitas fuzzing. Jika Anda tertarik mempelajari cara meningkatkan AFL dan mencari kerentanan yang lebih cepat dan lebih banyak, selamat datang di cut!
Apa itu AFL dan mengapa begitu bagus
AFL - fuzzer berpandu cakupan atau fuzzer berbasis umpan balik. Anda dapat mempelajari lebih lanjut tentang konsep-konsep ini dari kertas keren seperti
Fuzzing: Seni, Sains, dan Teknik . Jika kami meringkas informasi tentang AFL, maka kami dapat mengatakan yang berikut:
- Alat yang dapat dieksekusi untuk mengumpulkan informasi cakupan
- Mutasi input untuk memaksimalkan cakupan
- Ulangi langkah sebelumnya untuk menemukan program macet.
- Dalam praktiknya, terbukti sangat efektif
Secara grafis, ini dapat direpresentasikan sebagai berikut:

Jika Anda tidak tahu apa itu AFL, maka untuk memulai kami sarankan:
- Halaman resmi proyek
- afl-training - kunjungan singkat ke AFL
- afl-demo - demonstrasi sederhana tentang cara menghapus program C ++ menggunakan AFL
- afl-cve - Kumpulan kerentanan yang ditemukan menggunakan AFL (tidak diperbarui sejak 2017)
- Fakta bahwa AFL menambah program selama perakitan dapat ditemukan di sini.
- Beberapa tips bermanfaat untuk menghapus aplikasi jaringan di sini
Pada saat penulisan, versi AFL terbaru adalah versi
2.52b . Fazzer secara aktif berkembang, dan seiring waktu, beberapa perkembangan pihak ketiga termasuk dalam cabang AFL utama dan menjadi tidak relevan dengan diri mereka sendiri. Saat ini ada beberapa alat bantu yang berguna yang dapat diidentifikasi - mereka terdaftar di bagian berikutnya.
Persaingan Rode0daySecara terpisah, ada baiknya menyebutkan kompetisi bulanan
Rode0day , di mana ada persaingan antara phaser yang akan menemukan kerentanan lebih cepat dan lebih banyak dalam kasus yang disiapkan sebelumnya dengan akses ke kode sumber dan tanpa itu. Dan pada umumnya adalah konfrontasi dari berbagai modifikasi dan garpu AFL.
Namun, beberapa pengguna AFL
mencatat bahwa penulis phaser Michal Zalewski mencetak kampanye untuk mendukung gagasannya, karena perubahan terbaru tertanggal 5 November 2017. Ini diduga terkait dengan kepergiannya dari Google dan proyek-proyek baru. Dalam hal ini, orang mulai secara independen mengumpulkan dan membuat
tambalan untuk versi terbaru 2.52b saat ini.

Ada juga berbagai opsi dan turunan dari AFL yang memungkinkan fuzzing Python, Go, Rust, OCaml, GCJ Java, syscalls kernel, atau bahkan seluruh VM.
Alat bantu
Di bagian ini, kami telah memilih berbagai skrip dan alat untuk bekerja dengan AFL dan membaginya menjadi beberapa kategori:
Pengolahan kresh- afl-utils - satu set utilitas untuk pemrosesan otomatis / analisis crash dan meminimalkan test case.
- afl-crash-analyzer - Penganalisa kecelakaan AFL lainnya.
- fuzzer-utils - sekumpulan skrip untuk menganalisis hasilnya.
- Atriage adalah alat triase sederhana.
- afl-kit - Ditulis ulang dalam python afl-cmin.
- AFLize adalah alat yang secara otomatis menghasilkan build paket debian yang ramah bagi pengguna.
- afl-fid - seperangkat alat untuk bekerja dengan input data.
Cakupan Kode- afl-cov - Menyediakan data cakupan yang dapat dibaca manusia.
- count-afl-calls - Skor rasio. Script menghitung jumlah blok instrumen dalam binar.
- afl-sancov - seperti afl-cov, tetapi menggunakan clang sanitizer.
- covnavi adalah skrip analisis dan cakupan kode dari Cisco Talos Group.
- LAF LLVM Passes adalah sedikit kumpulan tambalan untuk afl yang memodifikasi kode untuk memudahkan fuzzers melalui cabang
Beberapa skrip untuk meminimalkan kasus uji- afl-pytmin adalah pembungkus untuk afl-tmin yang mencoba mempercepat proses meminimalkan test case dengan menggunakan beberapa core CPU.
- afl-ddmin-mod - variasi afl-tmin berdasarkan algoritma ddmin.
- halfempty adalah utilitas berbasis paralelisasi cepat untuk meminimalkan kasus uji dari Tavis Ormandy.
Untuk startup terdistribusiJuga, artikel yang sangat bagus
"Menskalakan AFL ke mesin 256 thread" baru-baru ini telah diterbitkan pada topik ini, yang menjelaskan peluncuran AFL pada 256 utas.
Penempatan, manajemen, pemantauan, pelaporan- afl-other-arch - satu set tambalan dan skrip untuk dengan mudah menambahkan dukungan untuk berbagai arsitektur (non x86) di AFL.
- afl-trivia - beberapa skrip kecil untuk menyederhanakan manajemen AFL.
- afl-monitor - skrip untuk memantau operasi AFL.
- afl-manager - server web python untuk mengelola multi-afl.
- afl-tools - gambar buruh pelabuhan dengan afl-terbaru, afl-dyninst dan Triforce-afl.
- afl-remote - server web untuk manajemen instance afl jarak jauh.
Modifikasi AFL
AFL telah sangat memengaruhi komunitas pencarian kerentanan dan industri fuzzing itu sendiri. Dan tidak mengherankan bahwa seiring waktu, berbagai modifikasi yang terinspirasi oleh AFL asli mulai muncul atas dasar idenya. Di bagian ini kita akan mempertimbangkannya. Masing-masing modifikasi ini memiliki kelebihan dan kekurangannya dibandingkan dengan versi AFL asli dalam situasi yang berbeda.
Katakan saja jika ada masalah dengan instalasi atau tidak ingin menghabiskan waktu - hampir semua modifikasi dapat ditemukan di
hub.docker.comMengapa
- Meningkatkan kecepatan dan / atau jangkauan kode
- Bekerja dalam kondisi tanpa kode sumber
- Emulasi kode
- Instrumentasi kode
Mode AFL bawaanSebelum melanjutkan ke diskusi tentang berbagai modifikasi dan garpu AFL, perlu untuk berbicara tentang dua mode penting yang dulu juga modifikasi, dan akhirnya menjadi mode bawaan. Ini adalah mode Syzygy dan mode Qemu.
Mode
Syzygy - adalah mode operasi di instrument instrument.exe
instrument.exe --mode=afl --input-image=test.exe --output-image=test.instr.exe
Untuk mode ini perlu: Menulis ulang biner PE32 secara statis dengan AFL, diperlukan simbol, Membutuhkan dev tambahan untuk membuat kernel WinAFL sadar.
Mode Qemu - Cara kerjanya di bawah QEMU dapat ditemukan di sini
"Internal fuzzer AFL - Instrumentasi QEMU" . Dukungan untuk bekerja dengan binari menggunakan QEMU muncul di AFL hulu dari Versi 1.31b. Mode qemu setelah bekerja dengan fungsi tambahan instrumentasi kode biner ke mesin terjemahan biner qemu tcg (generator kode kecil). Untuk melakukan ini, afl memiliki skrip build qemu yang mengunduh kode sumber dari versi qemu tertentu (2.10.0), memaksakan beberapa tambalan kecil pada mereka dan mengkompilasi untuk arsitektur yang diberikan. Setelah itu, file afl-qemu-trace dikembalikan, yang sebenarnya adalah mode pengguna (emulasi hanya file yang dapat dieksekusi ELF) qemu-emulasi. Berkat ini, Anda dapat menggunakan fuzzing dengan umpan balik pada binari elf, dan untuk sekelompok arsitektur berbeda yang didukung oleh qemu. Selain itu, Anda mendapatkan semua alat afl keren, dimulai dengan layar yang nyaman dengan informasi tentang sesi saat ini dan berakhir dengan hal-hal canggih seperti analisis afl. Namun perlu diingat bahwa Anda juga mendapatkan batasan qemu. Juga, misalnya, jika file dibuat oleh toolchain yang menggunakan fitur perangkat keras SoC, di mana binar diluncurkan dan yang tidak didukung oleh qemu, fuzzing akan pecah segera setelah instruksi khusus ditemui, atau, misalnya, MMIO tertentu digunakan.
Ada juga garpu yang menarik dari mode qemu, di mana kecepatannya meningkat 3x-4x kali karena instrumentasi kode TCG dan caching.
GarpuPenampilan garpu AFL terutama terkait dengan perubahan, peningkatan dalam algoritma operasi AFL klasik itu sendiri.
- afl-cygwin adalah upaya untuk port AFL klasik ke Windows menggunakan Cygwin. Sayangnya, upaya ini cukup bazzy, lambat, dan pengembangan bisa dikatakan ditinggalkan.
- AFLFast (memperpanjang AFL dengan Jadwal Daya) - salah satu fork pertama AFL, semua jenis heuristik ditambahkan, berkat itu bisa lebih banyak cara dalam waktu singkat.
- FairFuzz adalah ekstensi AFL yang tujuannya adalah mencoba menghabiskan lebih banyak waktu di cabang yang lebih jarang.
- AFLGo adalah ekstensi untuk AFL, yang terutama ditujukan untuk pencapaian target bagian kode tertentu, daripada cakupan umum kode program. Ini dapat digunakan untuk menguji tambalan atau bagian kode yang baru ditambahkan.
- PerfFuzz adalah ekstensi AFL yang mencari kasus uji yang dapat memperlambat program sebanyak mungkin.
- Pythia adalah ekstensi untuk AFL yang bertujuan untuk menambahkan elemen prediksi ke proses pentahapan sehubungan dengan kesulitan menemukan jalur baru.
- Angora adalah salah satu fuzzer yang paling baru dirilis, ditulis dengan karat. Menggunakan strategi barunya untuk mutasi dan untuk meningkatkan cakupan.
- Neuzz - suatu upaya untuk fuzz menggunakan jaringan saraf.
- UnTracer-AFL - integrasi afl dengan UnTracer, untuk penelusuran yang efisien.
- Qsym - Mesin Eksekusi Konsolik Praktis Disesuaikan untuk Fuzzing Hibrid. Bahkan, itu adalah mesin eksekusi simbol (komponen utama diimplementasikan sebagai plug pin intel), yang, dalam kombinasi dengan afl, mengimplementasikan fuzzing hybrid. Ini adalah evolusi lebih lanjut dalam topik fuzzing berdasarkan umpan balik dan layak untuk diskusi terpisah. Kelebihan utamanya adalah bahwa ia dapat dengan sangat cepat (relatif terhadap yang lain) melakukan eksekusi konsolik. Ini terjadi karena eksekusi perintah asli tanpa presentasi kode yang sedang, menyingkirkan mekanisme snapshot dan sejumlah heuristik. Ia menggunakan pin Intel lama (karena sejumlah masalah dukungan antara libz3 dan DBT lainnya), dan saat ini dapat bekerja dengan arsitektur elf x86 dan x86_64.
Perlu dikatakan bahwa ada sejumlah besar karya akademis terkait dengan penerapan pendekatan baru, teknik fuzzing, di mana AFL diambil dan dimodifikasi. Selain whitepaper, tidak ada lagi yang tersedia, jadi kami bahkan tidak menyebutkan implementasi seperti itu. Jika Anda tertarik, maka mereka mudah untuk google. Sebagai contoh, yang terakhir adalah
CollAFL: Path Sensitive Fuzzing ,
EnFuzz ,
Smart Greybox Fuzzing ,
ML untuk afl.
Modifikasi berdasarkan Qemu- TriforceAFL - AFL / QEMU fuzzing dengan emulasi sistem lengkap. Fork dari nccgroup. Mengizinkan mengaburkan seluruh sistem operasi dalam mode qemu. Diimplementasikan melalui instruksi khusus (aflCall (0f 24)), yang ditambahkan ke CPU QEMU x64. Sayangnya, tidak lagi didukung, versi terbaru afl di dalamnya adalah 2.06b.
- TriforceLinuxSyscallFuzzer - Fuzzing panggilan sistem Linux.
- afl-qai adalah proyek demo kecil dengan QEMU Augmented Instrumentasi (qai).
Modifikasi berdasarkan KLEEkleefl - untuk menghasilkan kasus uji dengan cara eksekusi simbolis (sangat lambat pada program besar).
Modifikasi berdasarkan Unicornafl-unicorn - memungkinkan Anda untuk fuzz potongan kode, meniru itu di
Unicorn Engine . Kami juga berhasil menggunakan variasi AFL ini dalam praktik kami, yaitu, di bagian kode dari satu RTOS, yang dieksekusi pada SOC, dan tidak mungkin untuk menggunakan mode QEMU. Dianjurkan untuk menggunakan modifikasi ini ketika tidak ada sumber (Anda tidak dapat mengumpulkan biner yang berdiri sendiri untuk analisis parser) dan program tidak menerima data input secara langsung (misalnya, mereka dienkripsi atau mewakili sampel sinyal seperti dalam satu CGC binar), maka Anda dapat menggunakannya membalikkan dan menemukan fungsi-fungsi tempat yang diusulkan di mana data ini diproses dalam format yang nyaman untuk fuzzer dan yang dapat fuzzed. Ini adalah modifikasi AFL yang paling umum. Dalam arti bahwa itu memungkinkan Anda untuk benar-benar membingungkan segalanya. Artinya, itu tidak tergantung pada arsitektur, ketersediaan kode sumber, format data input dan format binar itu sendiri (contoh yang paling mencolok adalah bare-metal - hanya potongan kode dari memori controller). Pendahuluan peneliti memeriksa ini sangat binar dan menulis fuzzer yang meniru negara pada input prosedur parser, misalnya. Dapat dilihat bahwa, tidak seperti AFL, Anda perlu melakukan semacam riset tentang binar. Untuk firmware bare-metal, seperti Wi-Fi atau baseband, ada beberapa kelemahan yang perlu Anda ingat:
- Sangat penting untuk melokalkan cek checksum.
- Harus diingat bahwa status fuzzer adalah keadaan memori yang disimpan dalam memori dump, ini dapat mencegah pencapaian jalur tertentu untuk fuzzer.
- Tidak ada sanitasi akses ke memori dinamis, tetapi dapat diimplementasikan secara manual (juga telah menghabiskan upaya), dan itu akan tergantung pada RTOS (itu juga perlu diselidiki sebelumnya).
- Interaksi antar tugas RTOS tidak ditiru - Anda juga dapat mencegah fuzzer menemukan jalur tertentu.
Contoh bekerja dengan modifikasi ini adalah
"afl-unicorn: Fuzzing Binary Code Sewenang-wenang" dan
"Afl-unicorn: Bagian 2 - Membasahi 'Unfuzzable'" .
Sebelum kita beralih ke modifikasi berdasarkan kerangka kerja dinamik biner instrumentasi (DBI), kami segera ingat bahwa kerangka tercepat adalah DynamoRIO, kemudian DynInst, dan akhirnya PIN.
Modifikasi PIN- aflpin - AFL dengan Instrumentasi PIN Intel.
- afl_pin_mode - Instrumentasi AFL lain yang diterapkan melalui Intel PIN.
- afl-pin - AFL dengan PINtool.
- NaFl - Klon (dari inti dasar) fuzzer AFL.
- PinAFL - penulis alat mencoba mentransfer AFL ke Windows untuk fuzzing binari yang sudah dikompilasi. Rupanya, lebih banyak dilakukan pada kipas angin dalam satu malam, dan kemudian proyek tidak berkembang. Repositori tidak mengandung sumber, hanya binari dan instruksi yang dikumpulkan untuk memulai. Versi AFL yang menjadi dasar alat ini tidak ditentukan, dan hanya mendukung aplikasi 32-bit.
Seperti yang Anda lihat, ada banyak modifikasi berbeda, tetapi dalam praktiknya tidak banyak digunakan di dalamnya dalam kehidupan nyata.
Modifikasi Berdasarkan Dyninstafl-dyninst - American Fuzzy Lop + Dyninst == AFL blackbox fuzzing. Fitur dari versi ini adalah bahwa program yang dipelajari pada awalnya (tanpa kode sumber) secara statis diinstrumentasi (instrumentasi biner statis, penulisan ulang biner statis) menggunakan DynInst, dan kemudian dikaburkan oleh AFL klasik, yang mengira program tersebut dibangun menggunakan afl-gcc / afl -g ++ / afl-as;) Pada akhirnya, ini memberi kita kesempatan untuk bekerja tanpa kode sumber dan dengan kinerja yang sangat baik - Dulu berada pada kecepatan 0,25x dibandingkan dengan kompilasi asli. Ada keuntungan yang signifikan dibandingkan QEMU, yaitu kemampuan untuk instrumen perpustakaan yang terhubung secara dinamis. Sementara QEMU hanya dapat instrumen file yang dapat dieksekusi utama secara statis terhubung ke perpustakaan. Sayangnya, sekarang ini hanya relevan untuk sistem operasi Linux. Untuk mendukung Windows, perubahan diperlukan di DynInst sendiri dan
pekerjaan sedang
berlangsung di sana .
Anda juga dapat memperhatikan
garpu seperti itu di mana ia dipompa dengan baik atas berbagai kemampuan (dukungan untuk arsitektur AARCH64 dan PPC) dan kecepatan;)
Modifikasi berdasarkan DynamoRIO- drAFL - AFL + DynamoRIO = fuzzing tanpa sumber di Linux.
- afl-dr - satu lagi implementasi atas dasar DynamoRIO yang sudah sangat rinci dilukis di ruang terbuka Habr.
- afl-dynamorio - modifikasi dari vanhauser-thc (kipas untuk memompa dan menstabilkan AFL). dia mengatakan tentang versi ini: "jalankan AFL dengan DynamoRIO ketika normal afl-dyninst menabrak biner dan mode qemu -Q bukan opsi." Dari menyenangkan, dukungan untuk ARM dan AARCH64 ditambahkan di sini. Mengenai kinerja: DynamoRIO sekitar ~ 10 lebih lambat dari Qemu, ~ 25 lebih lambat dari dyninst - ~, 10 lebih cepat dari Pintool.
- WinAFL adalah garpu afl untuk Windows yang paling terkenal. (DynamoRIO, juga memiliki mode syzygy). Penampilan modifikasi ini hanya masalah waktu, karena keinginan untuk mencoba AFL di bawah Windows pada aplikasi yang tidak ada kode sumbernya banyak muncul. Saat ini, alat ini sedang difinalisasi secara aktif, dan meskipun menggunakan basis kode AFL yang sedikit tertinggal (2,43b pada saat penulisan), beberapa kerentanan telah ditemukan dengannya (CVE-2016-7212, CVE-2017-0073, CVE-2017- 0190, CVE-2017-11816). Perlu dicatat bahwa pengembang utama adalah spesialis dari tim Proyek Nol Google dan Tim Kerentanan dan Mitigasi MSRC, yang memberikan alasan untuk berharap untuk pengembangan proyek lebih lanjut secara aktif. Untuk mengimplementasikan fuzzer, pengembang telah beralih dari kompilasi instrumentasi waktu menjadi menggunakan instrumentasi dinamis (berdasarkan DynamoRIO), yang diharapkan memperlambat eksekusi perangkat lunak yang sedang dipelajari, tetapi overhead yang dihasilkan (dua kali) sebanding dengan AFL klasik dalam mode biner. Para pengembang juga memecahkan masalah permulaan proses yang panjang, menyebutnya mode fuzzing persisten, mereka memilih fungsi yang perlu dikaburkan (dengan mengimbangi dalam file atau dengan nama jika fungsi tersebut disajikan dalam tabel ekspor) dan memasukkannya sedemikian rupa sehingga dapat dipanggil dalam satu lingkaran, dengan demikian meluncurkan beberapa sampel data input tanpa memulai kembali proses. Sebuah artikel menarik baru-baru ini muncul di mana para peneliti menunjukkan bagaimana mereka menemukan ~ 50 kerentanan dengan ~ 50 hari menggunakan winafl. Selain itu, hampir sebelum publikasi artikel di WinAFL, mode Intel PT juga ditambahkan (lebih lanjut tentang ini nanti) - detail ada di sini .
Pembaca mahir / canggih mungkin mencatat bahwa ada modifikasi dengan semua kerangka kerja instrumentasi populer, dengan pengecualian
Frida - memang demikian. Satu-satunya penyebutan menggunakan Frida dengan AFL hanya ditemukan di
Chizpurfle: A Grey-Box Android Fuzzer untuk Kustomisasi Layanan Vendor . Versi AFL dengan Frida sangat berguna karena Frida juga mendukung sejumlah arsitektur RISC.
Banyak peneliti juga berharap untuk merilis kerangka kerja Scorpio DBI dari pencipta Capstone, Unicorne, Keystone. Berdasarkan kerangka kerja ini, penulis sendiri telah membuat fuzzer (Darko) dan, menurut mereka, telah berhasil menggunakannya untuk fuzzing embedded device. Untuk informasi lebih lanjut, lihat
Menggali Jauh: Menemukan 0hari di Sistem Tertanam dengan Fuzzing Panduan Cakupan Kode .
Modifikasi didasarkan pada kemampuan perangkat keras prosesorKetika datang ke modifikasi AFL dengan dukungan untuk kemampuan perangkat keras prosesor, ini terutama menunjukkan kemungkinan fuzzing kode kernel, dan kedua, kecepatan fuzzing yang lebih tinggi untuk aplikasi tanpa kode sumber.
Dan, tentu saja, pertama-tama kita berbicara tentang kemampuan perangkat keras dari prosesor seperti
Intel PT (Processor Tracing). Yang tersedia mulai dari prosesor generasi ke-6 (ini dari sekitar 2015). Biasanya, untuk menggunakan fuzzer berikut, Anda akan memerlukan perangkat keras dengan dukungan Intel PT yang sesuai.
- WinAFL-IntelPT adalah modifikasi WinAFL pihak ketiga di mana teknologi Intel PT sudah digunakan alih-alih DynamoRIO.
- kAFL adalah pengembangan akademik yang bertujuan untuk memecahkan masalah yang dipandu cakupan untuk pentahapan kernel dengan cara yang independen OS. Apa yang dipecahkan menggunakan teknologi hypervisor dan Intel PT. Anda dapat belajar lebih banyak dari whitepaper mereka “kAFL: Umpan Balik yang Dibantu dengan Perangkat Keras untuk OS Kernels” .
Kesimpulan
Seperti yang mungkin Anda perhatikan, topik ini sedang aktif dikembangkan. Pada saat yang sama, ada banyak ruang bagi kreativitas untuk membuat modifikasi AFL yang baru, menarik dan bermanfaat.
Terima kasih atas perhatian dan fuzzing sukses Anda!
Rekan penulis: Nikita Knizhov
PS Terima kasih kepada seluruh tim pusat penelitian untuk bantuan mereka dalam mempersiapkan materi ini, tanpa pengalaman dan bantuan mereka, mustahil untuk mempersiapkannya.