Kebun binatang afl

gambar

Pada artikel ini, kita akan membahas bukan AFL klasik itu sendiri tetapi tentang utilitas yang dirancang untuk itu dan modifikasinya, yang, dalam pandangan kami, dapat secara signifikan meningkatkan kualitas fuzzing. Jika Anda ingin tahu cara meningkatkan AFL dan cara menemukan lebih banyak kerentanan lebih cepat - terus membaca!

Apa itu AFL dan Apa Manfaatnya?


AFL adalah fuzzer yang dipandu cakupan, atau berbasis umpan balik. Lebih lanjut tentang konsep-konsep ini dapat ditemukan dalam makalah keren, "Fuzzing: Seni, Sains, dan Teknik" Mari kita selesaikan informasi umum tentang AFL:

  • Ini memodifikasi file yang dapat dieksekusi untuk mencari tahu bagaimana itu mempengaruhi cakupan.
  • Memutasi data input untuk memaksimalkan jangkauan.
  • Ulangi langkah sebelumnya untuk menemukan di mana program macet.
    • Ini sangat efektif, yang dibuktikan dengan latihan.
      • Ini sangat mudah digunakan.


Berikut ini adalah representasi grafik:

gambar

Jika Anda tidak tahu apa itu AFL, berikut adalah daftar sumber daya yang bermanfaat untuk Anda mulai:

  1. Halaman resmi proyek .
  2. afl-training - pengantar singkat ke AFL.
  3. afl-demo - demo sederhana fuzzing program C ++ dengan AFL.
  4. afl-cve - koleksi kerentanan yang ditemukan dengan AFL (belum diperbarui sejak 2017).
  5. Di sini Anda dapat membaca tentang hal-hal yang ditambahkan AFL ke program selama pembuatannya.
  6. Beberapa tips bermanfaat tentang mengaburkan aplikasi jaringan.

Saat artikel ini sedang ditulis, AFL versi terbaru adalah 2.52b . Fuzzer sedang dalam pengembangan aktif, dan seiring waktu beberapa perkembangan sisi dimasukkan ke cabang AFL utama dan tumbuh tidak relevan. Hari ini, kita dapat menyebutkan beberapa alat aksesori yang berguna, yang tercantum dalam bab berikut.

Kompetisi Rode0day
Layak juga disebutkan kompetisi Rode0day bulanan - suatu peristiwa di mana fuzzers mencoba menemukan bug terbanyak dengan waktu lebih sedikit daripada lawan mereka di korporat pra-produksi baik dengan maupun tanpa akses ke kode sumber. Pada dasarnya, Rode0day adalah pertempuran antara modifikasi dan fork AFL yang berbeda.

Beberapa pengguna AFL mencatat bahwa penulisnya, Michal Zalewski, tampaknya telah meninggalkan proyek sejak tanggal modifikasi terakhir hingga 5 November 2017. Ini mungkin terhubung dengan dia meninggalkan Google dan mengerjakan beberapa proyek baru. Jadi, pengguna mulai membuat tambalan baru untuk versi 2.52b terakhir saat ini.

gambar

Ada juga variasi dan turunan berbeda dari AFL, yang memungkinkan fuzzing Python, Go, Rust, OCaml, GCJ Java, syscalls kernel, atau bahkan seluruh VM.

AFL untuk bahasa pemrograman lain

- python-afl - untuk Python.
- afl.rs - untuk program fuzzing yang ditulis di Rust.
- afl-fuzz-js - afl-fuzz untuk javascript.
- java-afl - AFL fuzzing untuk Java.
- kelinci - fuzzer lain untuk Java ( artikel tentang topik).
- javan-warty-pig - fuzzer seperti AFL untuk JVM.
- afl-swift - untuk program fuzzing yang ditulis di swift.
- ocamlopt-afl - untuk OCaml.
- sharpfuzz - fuzzer berdasarkan afl untuk .net

Alat aksesori


Untuk bab ini, kami telah mengumpulkan berbagai skrip dan alat untuk AFL dan membaginya menjadi beberapa kategori:

Pemrosesan kerusakan

  • afl-utils - satu set utilitas untuk pemrosesan otomatis / analisis crash dan mengurangi jumlah test case.
  • afl-crash-analyzer - penganalisa kecelakaan lain untuk AFL.
  • fuzzer-utils - sekumpulan skrip untuk analisis hasil.
  • atriage - alat triase sederhana.
  • afl-kit - afl-cmin pada Python.
  • AFLize - alat yang secara otomatis menghasilkan paket-paket debian yang cocok untuk AFL.
  • afl-fid - seperangkat alat untuk bekerja dengan input data.

Bekerja dengan cakupan kode

  • afl-cov - menyediakan data ramah-manusia tentang cakupan.
  • count-afl-calls - penilaian rasio. Script menghitung jumlah blok instrumentasi dalam biner.
  • afl-sancov - seperti afl-cov tetapi menggunakan pembersih dentang.
  • covnavi - skrip untuk meliput kode dan analisis oleh Cisco Talos Group.
  • LAF LLVM Passes - sesuatu seperti kumpulan tambalan untuk AFL yang memodifikasi kode untuk memudahkan fuzzer menemukan cabang.

Beberapa skrip untuk meminimalkan kasus uji

  • afl-pytmin - pembungkus untuk afl-tmin yang mencoba mempercepat proses minimalisasi test case dengan menggunakan banyak core CPU.
  • afl-ddmin-mod - variasi afl-tmin berdasarkan algoritma ddmin.
  • halfempty - adalah utilitas cepat untuk meminimalkan kasus uji oleh Tavis Ormandy berdasarkan paralelisasi.

Eksekusi terdistribusi


Baru-baru ini, telah diterbitkan sebuah artikel yang sangat bagus berjudul "Scaling AFL to a 256 thread machine" .

Penempatan, manajemen, pemantauan, pelaporan

  • afl-other-arch - adalah satu set tambalan dan skrip untuk dengan mudah menambahkan dukungan untuk berbagai arsitektur non-x86 untuk AFL.
  • afl-trivia - beberapa skrip kecil untuk menyederhanakan pengelolaan AFL.
  • afl-monitor - skrip untuk memantau AFL.
  • afl-manager - server web di Python untuk mengelola multi-afl.
  • afl-tools - gambar buruh pelabuhan dengan afl-terbaru, afl-dyninst, dan Triforce-afl.
  • afl-remote - server web untuk manajemen jarak jauh instance AFL.

Modifikasi AFL


AFL memiliki dampak yang sangat kuat pada komunitas peneliti kerentanan dan mengelabui dirinya sendiri. Tidak mengherankan sama sekali bahwa setelah beberapa waktu orang mulai membuat modifikasi yang terinspirasi oleh AFL asli. Mari kita lihat mereka. Dalam situasi yang berbeda, masing-masing modifikasi ini memiliki pro dan kontra sendiri dibandingkan dengan AFL asli.

Hampir semua mod dapat ditemukan di hub.docker.com

Untuk apa

  • Meningkatkan kecepatan dan / atau jangkauan kode
    • Algoritma
    • Lingkungan
      • OS
      • Perangkat keras

  • Bekerja tanpa kode sumber
    • Emulasi kode
    • Instrumentasi kode
      • Statis
      • Dinamis

Mode standar operasi AFL

Sebelum melanjutkan dengan memeriksa berbagai modifikasi dan percabangan AFL, kita harus berbicara tentang dua mode penting, yang juga merupakan modifikasi di masa lalu tetapi akhirnya dimasukkan. Mereka adalah Syzygy dan Qemu.

Mode Syzygy - adalah mode bekerja di instrument.exe
instrument.exe --mode=afl --input-image=test.exe --output-image=test.instr.exe 
Syzygy memungkinkan untuk menulis ulang biner PE32 secara statis dengan AFL tetapi membutuhkan simbol dan dev tambahan untuk membuat kernel WinAFL sadar.

Mode Qemu - cara kerjanya di bawah QEMU dapat dilihat di β€œInternal fuzzer AFL - Instrumentasi QEMU” . Dukungan bekerja dengan binari dengan QEMU ditambahkan ke AFL hulu di Versi 1.31b. Mode AFL QEMU berfungsi dengan fungsionalitas tambahan instrumentasi biner ke dalam qemu tcg (generator kode kecil) mesin terjemahan biner. Untuk itu, AFL memiliki qemu skrip build, yang mengekstrak sumber dari versi qemu tertentu (2.10.0), menempatkannya ke beberapa tambalan kecil dan membangun untuk arsitektur yang ditentukan. Kemudian, sebuah file bernama afl-qemu-trace dibuat, yang sebenarnya adalah file emulasi mode pengguna (emulasi hanya file ELF yang dapat dieksekusi) qemu-. Dengan demikian, dimungkinkan untuk menggunakan fuzzing dengan umpan balik pada binari elf untuk banyak arsitektur berbeda yang didukung oleh qemu. Plus, Anda mendapatkan semua alat AFL keren, dari monitor dengan informasi tentang sesi saat ini untuk hal-hal canggih seperti analisis afl. Tetapi Anda juga mendapatkan batasan qemu. Juga, jika file dibuat dengan toolchain menggunakan fitur SoC perangkat keras, yang meluncurkan biner dan tidak didukung oleh qemu, fuzzing akan terputus segera setelah ada instruksi khusus atau MMIO tertentu digunakan.

Inilah garpu menarik lainnya dari mode qemu, di mana kecepatannya meningkat 3-4 kali dengan instrumentasi dan pencairan kode TCG.

Garpu

Penampilan garpu AFL pertama-tama terkait dengan perubahan dan peningkatan algoritma AFL klasik.

  • pe-afl - Sebuah modifikasi untuk fuzzing file PE yang tidak memiliki kode sumber di OS Windows. Untuk operasinya, fuzzer menganalisis program target dengan IDA Pro dan menghasilkan informasi untuk instrumentasi statis berikut. Versi yang diinstrumentasi kemudian fuzzed dengan AFL.
  • afl-cygwin - adalah upaya untuk port AFL klasik ke Windows dengan Cygwin. Sayangnya, ia memiliki banyak bug, sangat lambat, dan pengembangannya telah ditinggalkan.
  • AFLFast (memperpanjang AFL dengan Jadwal Daya) - salah satu garpu AFL pertama. Ia telah menambahkan heuristik, yang memungkinkannya melewati lebih banyak jalur dalam periode waktu yang singkat.
  • FairFuzz - ekstensi untuk AFL, yang menargetkan cabang langka.
  • AFLGo - adalah ekstensi untuk AFL yang dimaksudkan untuk mendapatkan bagian kode tertentu alih-alih cakupan program penuh. Ini dapat digunakan untuk menguji tambalan atau fragmen kode yang baru ditambahkan.
  • PerfFuzz - ekstensi untuk AFL, yang mencari kasus uji yang secara signifikan dapat memperlambat program.
  • Pythia - adalah ekstensi untuk AFL yang dimaksudkan untuk meramalkan betapa sulitnya menemukan jalur baru.
  • Angora - adalah salah satu fuzzer terbaru, ditulis dengan karat. Ini menggunakan strategi baru untuk mutasi dan meningkatkan cakupan.
  • Neuzz - fuzzing dengan jaring saraf.
  • UnTracer-AFL - integrasi AFl dengan UnTracer untuk penelusuran yang efektif.
  • Qsym - Mesin Eksekusi Konsolik Praktis Disesuaikan untuk Fuzzing Hibrid. Pada dasarnya, ini adalah mesin eksekusi simbolik (komponen dasar direalisasikan sebagai plugin untuk pin intel) yang bersama-sama dengan AFL melakukan fuzzing hybrid. Ini adalah tahap dalam evolusi fuzzing berbasis umpan balik dan panggilan untuk diskusi terpisah. Keuntungan utamanya adalah dapat melakukan eksekusi concolic relatif cepat. Ini karena eksekusi asli dari perintah tanpa representasi kode, snapshots, dan beberapa heuristik. Ia menggunakan pin Intel lama (karena mendukung masalah antara libz3 dan DBT lainnya) dan saat ini dapat bekerja dengan arsitektur elf x86 dan x86_64.
  • Superion - Greybox fuzzer, keuntungan yang jelas di antaranya adalah bahwa bersama dengan program yang diinstrumentasi, ia juga mendapatkan spesifikasi data input menggunakan tata bahasa ANTLR dan setelah itu melakukan mutasi dengan bantuan tata bahasa ini.
  • AFLSmart - fuzzer Graybox lainnya. Sebagai input, ia mendapatkan spesifikasi data input dalam format yang digunakan oleh fuzzer Peach.

Ada banyak makalah penelitian yang didedikasikan untuk penerapan pendekatan baru dan teknik fuzzing di mana AFL dimodifikasi. Hanya kertas putih yang tersedia, jadi kami bahkan tidak repot menyebutkannya. Anda dapat google mereka jika Anda mau. Sebagai contoh, beberapa yang terbaru adalah CollAFL: Path Sensitive Fuzzing , EnFuzz , "Pendekatan efisien untuk fuzzing interpreter" , ML untuk AFL.

Modifikasi berdasarkan Qemu

  • TriforceAFL - AFL / QEMU fuzzing dengan emulasi penuh sistem. Garpu oleh nccgroup. Mengizinkan menghapus seluruh OS dalam mode qemu. Direalisasikan dengan instruksi khusus (aflCall (0f 24)), yang ditambahkan dalam QEMU x64 CPU. Sayangnya, itu tidak lagi didukung; AFL versi terakhir adalah 2.06b.
  • TriforceLinuxSyscallFuzzer - fuzzing dari panggilan sistem Linux.
  • afl-qai - proyek demo kecil dengan QEMU Augmented Instrumentasi (qai).

Modifikasi berdasarkan KLEE

kleefl - untuk menghasilkan kasus uji dengan cara eksekusi simbolis (sangat lambat pada program besar).

Modifikasi berdasarkan Unicorn

afl-unicorn - memungkinkan fuzzing fragmen kode dengan meniru itu di Unicorn Engine . Kami berhasil menggunakan variasi AFL ini dalam praktik kami, pada area kode RTOS tertentu, yang dijalankan pada SOC, jadi kami tidak dapat menggunakan mode QEMU. Penggunaan modifikasi ini dibenarkan jika kami tidak dapat memiliki sumber (kami tidak dapat membangun biner yang berdiri sendiri untuk analisis parser) dan program tidak mengambil input data secara langsung (misalnya, data dienkripsi atau sampel sinyal seperti dalam biner CGC), maka kita dapat membalikkan dan menemukan fungsi tempat yang seharusnya, di mana data diproses dalam format yang nyaman untuk fuzzer. Ini adalah modifikasi AFL yang paling umum / universal, yaitu memungkinkan fuzzing apa saja. Tidak tergantung pada arsitektur, sumber, format data input, dan format biner (contoh paling mencolok dari bare-metal - hanya potongan-potongan kode dari memori pengontrol). Peneliti pertama kali memeriksa biner ini dan menulis fuzzer, yang mengemulasi keadaan pada input prosedur parser. Jelas, tidak seperti AFL, ini membutuhkan pemeriksaan biner tertentu. Untuk firmware bare-metal, seperti Wi-FI atau baseband, ada beberapa kekurangan yang perlu Anda ingat:

  1. Kita harus melokalkan cek jumlah kontrol.
  2. Perlu diingat bahwa keadaan fuzzer adalah keadaan memori yang disimpan dalam dump memori, yang dapat mencegah fuzzer mencapai jalur tertentu.
  3. Tidak ada sanitasi panggilan ke memori dinamis, tetapi dapat direalisasikan secara manual, dan itu akan tergantung pada RTOS (harus diteliti).
  4. Interaksi Intertask RTOS tidak ditiru, yang juga dapat mencegah menemukan jalur tertentu.

Contoh bekerja dengan modifikasi ini "afl-unicorn: Fuzzing Binary Code Sewenang-wenang" dan "afl-unicorn: Bagian 2 - Memburamkan 'Unfuzzable'" .

Sebelum kita melanjutkan ke modifikasi berdasarkan kerangka kerja instrumentasi biner dinamis (DBI), jangan lupa bahwa kecepatan tertinggi dari kerangka kerja ini ditunjukkan oleh DynamoRIO, Dynlnst dan, akhirnya, PIN.

Modifikasi berbasis PIN

  • aflpin - AFL dengan instrumentasi PIN Intel.
  • afl_pin_mode - instrumentasi AFL lain yang direalisasikan melalui Intel PIN.
  • afl-pin - AFL dengan PINtool.
  • NaFl - Klon (dari inti dasar) fuzzer AFL.
  • PinAFL - penulis alat ini mencoba untuk port AFL ke Windows untuk fuzzing binari yang sudah dikompilasi. Sepertinya itu dilakukan semalam hanya untuk bersenang-senang; proyek ini tidak pernah berjalan lebih jauh. Repositori tidak memiliki sumber, hanya binari yang dikompilasi dan instruksi peluncuran. Kami tidak tahu versi AFL mana itu didasarkan, dan itu hanya mendukung aplikasi 32-bit.

Seperti yang Anda lihat, ada banyak modifikasi berbeda, tetapi mereka tidak terlalu berguna dalam kehidupan nyata.

Modifikasi berbasis Dyninst

afl-dyninst - American Fuzzy Lop + Dyninst == AFL balckbox fuzzing. Fitur dari versi ini adalah bahwa pertama suatu program yang diteliti (tanpa kode sumber) diinstrumentasi secara statis (instrumentasi biner statis, penulisan ulang biner statis) dengan Duninst, dan kemudian dikaburkan dengan AFL klasik yang berpikir bahwa program tersebut dibuat dengan afl. gcc / afl-g ++ / afl-as;) Akibatnya, memungkinkan untuk bekerja dengan produktivitas yang sangat baik tanpa kode sumber - Dulu pada kecepatan 0,25x dibandingkan dengan kompilasi asli. Ini memiliki keuntungan yang signifikan dibandingkan dengan QEMU: memungkinkan instrumentasi pustaka terkait dinamis, sementara QEMU hanya dapat instrumen file dasar yang dapat dieksekusi secara statis terkait dengan pustaka. Sayangnya, sekarang ini hanya relevan untuk Linux. Untuk dukungan Windows, perubahan ke Dyninst sendiri diperlukan, yang sedang dilakukan .

Ada garpu lain dengan kecepatan ditingkatkan dan fitur tertentu (dukungan arsitektur AARCH64 dan PPC).

Modifikasi berdasarkan DynamoRIO

  • drAFL - AFl + DynamoRIO - fuzzing tanpa sumber di Linux.
  • afl-dr - implementasi lain berdasarkan DynamoRIO yang dijelaskan dengan sangat baik pada Habr .
  • afl-dynamorio - modifikasi oleh vanhauser-thc. Inilah yang dia katakan tentang itu: "jalankan AFL dengan DynamoRIO ketika normal afl-dyninst menabrak mode biner dan qemu -Q bukan opsi." Ini mendukung ARM dan AARCH64. Mengenai produktivitas: DynamoRIO sekitar 10 kali lebih lambat dari Qemu, 25 kali lebih lambat dari dyninst, tetapi sekitar 10 kali lebih cepat dari Pintool.
  • WinAFL - fork Windows garpu AFL paling terkenal. (DynamoRIO, juga mode syzygy). Hanya masalah waktu untuk mod ini muncul karena banyak yang ingin mencoba AFL pada Windows dan menerapkannya ke aplikasi tanpa sumber. Saat ini, alat ini sedang ditingkatkan secara aktif, dan terlepas dari basis kode AFL yang relatif usang (2,43b ketika artikel ini ditulis), alat ini membantu menemukan beberapa kerentanan (CVE-2016-7212, CVE-2017-0073, CVE- 2017-0190, CVE-2017-11816). Spesialis dari tim Proyek Nol Google dan Tim Kerentanan dan Mitigasi MSRC bekerja dalam proyek ini, sehingga kami dapat berharap untuk pengembangan lebih lanjut. Alih-alih kompilasi instrumentasi waktu, para pengembang menggunakan instrumentasi dinamis (berdasarkan DynamoRIO), yang secara signifikan memperlambat eksekusi perangkat lunak yang dianalisis, tetapi overhead yang dihasilkan (dua kali lipat) sebanding dengan AFL klasik dalam mode biner. Mereka juga memecahkan masalah peluncuran proses cepat, setelah menyebutnya mode fuzzing persisten; mereka memilih fungsi untuk fuzz (dengan offset di dalam file atau dengan nama fungsi yang ada di tabel ekspor) dan instrumen itu sehingga dapat dipanggil dalam siklus, sehingga meluncurkan beberapa sampel data input tanpa memulai kembali proses. Sebuah artikel keluar baru-baru ini, menggambarkan bagaimana penulis menemukan sekitar 50 kerentanan dalam sekitar 50 hari menggunakan WinAFL. Dan tidak lama sebelum diterbitkan, mode Intel PT telah ditambahkan ke WinAFL; detalis dapat ditemukan di sini .

Pembaca tingkat lanjut dapat melihat bahwa ada modifikasi dengan semua kerangka kerja instrumentasi populer kecuali untuk Frida . Satu-satunya penyebutan penggunaan Frida dengan AFL ditemukan di "Chizpurfle: A Grey-Box Android Fuzzer untuk Kustomisasi Layanan Vendor . " Versi AFL dengan Frida sangat berguna karena Frida mendukung beberapa arsitektur RISC.

Banyak peneliti juga menantikan rilis kerangka kerja DBI Scopio oleh pencipta Capstone, Unicorn, dan Keystone. Berdasarkan kerangka kerja ini, penulis telah membuat fuzzer (Darko) dan, menurut mereka, berhasil menggunakannya untuk fuzz perangkat tertanam. Lebih lanjut tentang ini dapat ditemukan di "Menggali Jauh: Menemukan 0 hari di Sistem Tertanam dengan Fuzzing Pemandu Kode Cakupan . "

Modifikasi, berdasarkan pada fitur perangkat keras prosesor

Ketika datang ke modifikasi AFL dengan dukungan fitur perangkat keras prosesor, pertama-tama, ini memungkinkan fuzzing kode kernel, dan kedua - memungkinkan fuzzing aplikasi lebih cepat tanpa kode sumber.

Dan tentu saja, berbicara tentang fitur perangkat keras prosesor, kami terutama tertarik pada Intel PT (Processor Tracing). Ini tersedia dari prosesor generasi ke-6 dan seterusnya (sekitar, sejak 2015). Jadi, untuk dapat menggunakan fuzzer yang tercantum di bawah ini, Anda memerlukan prosesor yang mendukung Intel PT.


Kesimpulan


Seperti yang Anda lihat, area modifikasi AFL secara aktif berkembang. Namun, masih ada ruang untuk eksperimen dan solusi kreatif; Anda dapat membuat modifikasi baru yang bermanfaat dan menarik.

Terima kasih telah membaca kami dan semoga sukses dengan fuzzing!

Rekan penulis: Nikita Knyzhov presler

PS Terima kasih kepada tim pusat penelitian, tanpanya artikel ini mustahil dilakukan.

Source: https://habr.com/ru/post/id449134/


All Articles