Tutorial Pengujian Fuzz (Fuzzing).

⚡ Ringkasan Cerdas

Fuzz Testing memasukkan data yang tidak valid, tidak terduga, atau acak ke dalam program dan mengamati terjadinya crash, hang, dan kesalahan memori, sehingga mengungkap celah keamanan yang hampir tidak pernah ditemukan oleh pengujian fungsional berbasis skrip.

  • 🔘 Asal: Barton Miller menciptakan istilah tersebut di Universitas Wisconsin–Madison, dan percobaan fuzz pertama pada tahun 1989 menyebabkan sekitar sepertiga dari utilitas UNIX yang diuji mengalami kerusakan.
  • ☑️ Siklus enam langkah: Identifikasi target, identifikasi input, hasilkan data fuzzing, eksekusi, pantau perilaku, lalu catat setiap cacat yang muncul.
  • ✅ Tiga strategi generasi: Fuzzer mutasi merusak sampel yang valid, fuzzer generasi membangun input dari sebuah model, dan fuzzer protokol bekerja berdasarkan spesifikasi.
  • 🧪 Umpan balik dari liputan mengubah bidang tersebut: Mesin pencari modern menyimpan setiap input yang mencapai kode baru, yang menemukan bug yang jauh lebih dalam daripada data acak semata.
  • ️ Teknologi perkakas telah berkembang: Peach Fuzzer dan WebScarab diarsipkan, sedangkan AFL++, libFuzzer, OSS-Fuzz, boofuzz ​​dan OWASP ZAP adalah opsi yang tetap dipelihara.
  • ⚙️ Batasan yang diketahui: Fuzzing menemukan kesalahan (crash), bukan kelemahan logika, sehingga melengkapi dan bukan menggantikan peninjauan kode (code review) dan pengujian penetrasi (penetration testing).

Tutorial Pengujian Fuzz (Fuzzing).

Apa itu Pengujian Fuzz?

Pengujian Fuzz atau Fuzzing Fuzz testing adalah teknik pengujian perangkat lunak yang melibatkan memasukkan data tidak valid atau acak yang disebut FUZZ ke dalam sistem perangkat lunak untuk menemukan kesalahan pengkodean dan celah keamanan. Tujuan dari fuzz testing adalah memasukkan data menggunakan teknik otomatis atau semi-otomatis dan menguji sistem untuk berbagai pengecualian seperti kerusakan sistem atau kegagalan kode bawaan.

Pengujian fuzz awalnya dikembangkan oleh Barton Miller di Universitas Wisconsin–Madison, yang menciptakan istilah tersebut setelah gangguan sinyal pada tautan modem menyebabkan program yang digunakannya mengalami crash. Mahasiswanya menjalankan fuzzer pertama pada tahun 1989 dan menemukan bahwa sekitar sepertiga dari utilitas UNIX yang mereka targetkan mengalami crash atau macet. Pengujian fuzz adalah sebuah pengujian perangkat lunak teknik, dan ini adalah jenis Pengujian Keamanan.

Diagram di bawah ini menunjukkan siklus fuzzing dasar, di mana data yang dihasilkan dimasukkan ke aplikasi yang sedang diuji dan responsnya diamati.

Alur kerja pengujian fuzz: sebuah fuzzer menghasilkan input yang salah format dan memasukkannya ke aplikasi yang sedang diuji.

Mengapa melakukan Pengujian Fuzz?

Fuzzing layak dimasukkan dalam rencana pengujian karena mengeksplorasi input yang tidak pernah terpikirkan untuk dibuatkan kasus uji. Alasan utama tim mengadopsinya tercantum di bawah ini.

  • Pengujian fuzzing biasanya menemukan kesalahan dan cacat keamanan yang paling serius, karena crash merupakan bukti langsung dari jalur input yang tidak ditangani.
  • Pengujian fuzz memberikan hasil yang lebih efektif bila digunakan dengan Black Box pengujian, Pengujian Beta, dan metode debugging lainnya.
  • Pengujian fuzz digunakan untuk memeriksa kerentanan perangkat lunak, dan ini adalah teknik pengujian yang sangat hemat biaya karena inputnya dihasilkan secara otomatis, bukan ditulis tangan.
  • Pengujian fuzz adalah salah satu teknik pengujian kotak hitam. Fuzzing juga merupakan salah satu metode paling umum yang digunakan peretas untuk menemukan kerentanan dalam suatu sistem, sehingga menjalankannya terlebih dahulu akan menghilangkan jalur termudah bagi penyerang untuk masuk.

Jenis-jenis Pengujian Fuzz

Fuzzer biasanya dikelompokkan berdasarkan seberapa banyak yang mereka ketahui tentang program yang mereka serang. Semakin banyak yang diketahui fuzzer, semakin dalam ke dalam kode yang dapat mereka tembus.

Tipe Apa yang diketahui oleh si fuzzer Penggunaan khas
Pengujian fuzzing kotak hitam Tidak ada informasi tentang bagian internalnya; alat ini hanya melihat input dan output. Pengujian cepat terhadap endpoint biner atau endpoint aktif.
Kotak putih buram Kode sumber lengkap, sering dikombinasikan dengan eksekusi simbolik untuk menyelesaikan percabangan yang sulit dijangkau. Analisis mendalam terhadap komponen yang kode sumbernya tersedia.
Pengaburan kotak abu-abu Tidak ada peninjauan kode sumber, tetapi umpan balik saat runtime seperti cabang kode mana yang dicapai oleh input. Pengaturan default untuk mesin modern seperti AFL++ dan libFuzzer.

Perpecahan kedua, yang lebih lama, memisahkan pengaburan bodoh dari pengujian fuzzing cerdasFuzzer yang bodoh hanya membalik bit tanpa memahami format input, sehingga sebagian besar datanya ditolak oleh parser pertama yang ditemuinya. Fuzzer yang cerdas memahami checksum, field panjang, dan struktur pesan, sehingga inputnya lolos validasi dan mencapai logika di baliknya. Fuzzing yang dipandu oleh cakupan Penyempurnaan grey box inilah yang membuat fuzzing menjadi populer: mesin tersebut menginstrumentasi biner, menyimpan setiap input yang mencapai cabang baru, dan memutasi yang bertahan, sehingga korpus terus berkembang menuju kode yang belum dieksplorasi alih-alih memulai kembali dari noise acak.

Bagaimana melakukan Pengujian Fuzz

Langkah-langkah untuk pengujian fuzz meliputi langkah-langkah pengujian dasar:

Langkah 1) Identifikasi sistem target — pilih biner, pustaka, layanan, atau titik akhir protokol yang akan diserang, dan konfirmasikan bahwa Anda diizinkan untuk mengujinya.

Langkah 2) Identifikasi masukan — mencantumkan setiap titik masuk yang dibaca oleh target: file, argumen baris perintah, variabel lingkungan, paket jaringan, kolom formulir, dan muatan API.

Langkah 3) Hasilkan data Fuzzed — menghasilkan input yang cacat dengan memutasi sampel yang valid, dengan menghasilkannya dari model format, atau dengan menggabungkan keduanya.

Langkah 4) Lakukan pengujian menggunakan data fuzzy — Jalankan target terhadap input yang dihasilkan, idealnya dalam sebuah loop yang secara otomatis memulai ulang proses setelah setiap kegagalan.

Langkah 5) Pantau perilaku sistem — pantau kerusakan, macet, kegagalan pernyataan, penggunaan memori yang berlebihan, dan laporan sanitasi, alih-alih hanya memeriksa output yang tercetak.

Langkah 6) Catat cacat — simpan input persis yang memicu setiap kegagalan, perkecil hingga kasus reproduksi terkecil, dan arsipkan bersama tumpukan. tracterlampir.

Contoh Fuzzer

Fuzzer juga diklasifikasikan berdasarkan cara mereka membangun inputnya, dan tiga pendekatan di bawah ini adalah yang paling sering Anda temui.

  • Fuzzer Berbasis Mutasi Mengubah sampel data yang ada untuk membuat data uji baru. Ini adalah pendekatan yang sangat sederhana dan mudah: dimulai dengan sampel protokol yang valid dan terus mengubah setiap byte atau file.
  • Fuzzer Berbasis Generasi Mendefinisikan data baru berdasarkan input model. Mereka mulai menghasilkan input dari awal berdasarkan spesifikasi.
  • Fuzzer berbasis protokol Hal ini bergantung pada pengetahuan mendalam tentang format protokol yang sedang diuji, dan pemahaman tersebut berasal dari spesifikasi. Proses ini melibatkan penulisan serangkaian spesifikasi ke dalam alat, kemudian menggunakan teknik pembuatan uji berbasis model untuk menelusuri spesifikasi dan menambahkan ketidakberaturan dalam isi data, urutan, dan sebagainya. Ini juga dikenal sebagai pengujian sintaksis, pengujian tata bahasa, atau pengujian ketahanan. Fuzzer dapat menghasilkan kasus uji dari kasus uji yang sudah ada, atau dapat menggunakan input yang valid atau tidak valid.

Ada dua batasan fuzzing berbasis protokol:

  1. Pengujian tidak dapat dilanjutkan sampai spesifikasinya matang.
  2. Banyak protokol berguna yang merupakan perpanjangan dari protokol yang diterbitkan. Jika pengujian fuzz didasarkan pada spesifikasi yang dipublikasikan, Cakupan tes untuk protokol baru akan dibatasi.

Bentuk teknik fuzzing yang paling sederhana adalah mengirimkan input acak ke perangkat lunak, baik sebagai paket protokol maupun sebagai suatu kejadian. Teknik pengiriman input acak ini sangat ampuh untuk menemukan bug di banyak aplikasi dan layanan. Teknik lain juga tersedia, dan sangat mudah untuk diimplementasikan. Untuk mengimplementasikan teknik-teknik ini, kita hanya perlu mengubah input yang ada, dan kita dapat mengubah input hanya dengan menukar bit-bitnya.

Jenis bug yang terdeteksi oleh Fuzz Testing

Karena fuzzing menilai eksekusi berdasarkan bagaimana program berperilaku, bukan berdasarkan nilai yang diharapkan, cacat yang ditemukannya terkelompok menjadi tiga kategori.

  • Kegagalan pernyataan dan kebocoran memori: Metodologi ini banyak digunakan untuk aplikasi besar di mana bug memengaruhi keamanan memori, yang merupakan kerentanan serius. Buffer Kesalahan overflow, use-after-free, dan out-of-bounds reads semuanya muncul di sini.
  • Masukan tidak valid: Dalam pengujian fuzzing, fuzzer digunakan untuk menghasilkan input yang tidak valid yang digunakan untuk menguji rutinitas penanganan kesalahan, dan ini penting untuk perangkat lunak yang tidak mengontrol inputnya. Fuzzing sederhana dapat dilihat sebagai cara untuk mengotomatisasi pengujian negatif.
  • Kesalahan kebenaran: Fuzzing juga dapat digunakan untuk mendeteksi beberapa jenis bug "kebenaran", seperti basis data yang rusak atau hasil pencarian yang buruk. Fuzzing diferensial, yang memberikan input yang sama ke dua implementasi dan membandingkan jawabannya, adalah cara yang biasa digunakan untuk mendeteksi bug-bug ini.

Alat Pengujian Fuzz

Alat-alat yang digunakan dalam keamanan web dapat digunakan secara luas dalam pengujian fuzz, seperti: Burp Suite dan Peach Fuzzer. Beberapa nama klasik di bawah ini sekarang sudah diarsipkan, jadi status terkini mereka dicantumkan di samping setiap entri.

  • Fuzzer PersikPeach Fuzzer menyediakan cakupan keamanan yang lebih kuat daripada pemindai. Alat pengujian lain hanya dapat mencari ancaman yang dikenal, sedangkan Peach Fuzzer memungkinkan pengguna untuk menemukan ancaman yang dikenal dan tidak dikenal. Peach Tech diakuisisi oleh GitLab, dan Community Edition v3 tidak lagi dipelihara; penerusnya yang dipelihara adalah GitLab Protocol Fuzzer Edisi Komunitas.
  • Proksi LonjakanSPIKE Proxy adalah alat tingkat profesional yang mencari kerentanan tingkat aplikasi pada aplikasi web. SPIKE Proxy mencakup hal-hal mendasar, seperti: SQL Injeksi dan cross-site scripting, pada sistem yang sepenuhnya terbuka. Python infrastruktur, dan tersedia untuk Linux ke WindowsIni sudah tidak dipelihara selama bertahun-tahun dan disertakan di sini untuk konteks historis.
  • WebScarabWebScarab ditulis dalam Java Oleh karena itu, framework ini dapat dipindahkan ke berbagai platform. Framework WebScarab berkomunikasi menggunakan protokol HTTP dan HTTPS dan berfungsi sebagai proxy pencegat: framework ini memungkinkan operator untuk meninjau dan memodifikasi permintaan yang dibuat oleh browser sebelum server menerimanya, dan untuk meninjau serta memperbarui respons yang dihasilkan oleh server sebelum browser menerimanya. Setiap celah keamanan yang ditemukan WebScarab akan ditambahkan ke daftar masalah yang dilaporkan. Repositori ini diarsipkan pada April 2024 dan sekarang hanya dapat dibaca.
  • OWASP WSFuzzerWSFuzzer adalah program berlisensi GPL yang ditulis dalam Python yang menargetkan layanan web, dan dalam versi terakhirnya berbasis HTTP. layanan sabun adalah target utama. Perangkat lunak ini dirilis sebagai bagian dari WebScarab dan dihentikan penggunaannya bersamaan; OWASP ZAP dan add-on Fuzzer-nya merupakan pengganti yang direkomendasikan.
  • Alternatif yang dipertahankan: AFL++ ke libFuzzer adalah mesin berbasis cakupan standar untuk kode asli, OSS-Fuzz menjalankannya secara terus menerus dan gratis untuk proyek-proyek sumber terbuka, dan boofuzz membahas tentang pengujian fuzzing protokol jaringan PythonDaftar yang lebih lengkap dikumpulkan dalam panduan untuk alat pengujian keamanan.

Praktik Terbaik Pengujian Fuzz

Fuzzer yang diarahkan ke target dan dibiarkan begitu saja jarang menemukan banyak hal. Praktik-praktik di bawah ini membedakan kampanye yang menghasilkan cacat yang dilaporkan dari kampanye yang hanya menghabiskan waktu CPU.

  • Mulailah dari bibit yang berkualitas baik. Kumpulkan input nyata dan valid yang sudah diterima oleh aplikasi. Memodifikasi file asli akan mencapai kode parsing jauh lebih cepat daripada memodifikasi byte acak.
  • Tuliskan sebuah harness kecil dan cepat. Titik masuk (entry point) seharusnya hanya melakukan satu hal per eksekusi, menghindari panggilan jaringan dan penulisan ke disk, serta kembali dengan cepat, karena throughput diukur dalam eksekusi per detik.
  • Nyalakan alat pembersih tangan. Kerusakan memori yang terjadi secara diam-diam seringkali tidak menyebabkan crash. AddressSanitizer dan UndefinedBehaviorSanitizer mengubahnya menjadi kegagalan yang langsung dapat didiagnosis.
  • Berlarilah dalam jangka waktu lama, dan berlarilah terus menerus. Pengujian selama satu atau dua jam dapat mendeteksi bug yang dangkal; jalur bug yang dalam biasanya membutuhkan waktu berjam-jam, itulah sebabnya pengujian fuzzing sebaiknya dilakukan dalam pekerjaan CI malam hari daripada sesi manual.
  • Minimalkan dan hilangkan duplikasi setiap crash. Kecilkan input yang gagal ke bentuk terkecilnya dan kelompokkan kerusakan berdasarkan tumpukan. tracJika tidak, satu bug akan muncul sebagai ratusan tiket.
  • Pertahankan korpus regresi. Tambahkan setiap input yang menyebabkan masalah ke dalam kumpulan permanen yang dijalankan pada setiap proses build, sehingga cacat yang telah diperbaiki tidak dapat muncul kembali secara diam-diam.
  • Tentukan target secara legal. Melakukan pengujian fuzzing pada layanan pihak ketiga yang sedang berjalan tanpa izin tertulis tidak dapat dibedakan dari sebuah serangan.

Keuntungan Pengujian Fuzz

Jika digunakan dengan ekspektasi yang realistis, fuzzing memberikan nilai tambah yang sulit ditandingi oleh teknik lain.

  • Pengujian fuzzing meningkatkan pengujian keamanan perangkat lunak.
  • Bug yang ditemukan dalam pengujian fuzzing terkadang parah dan seringkali sama dengan bug yang digunakan oleh penyerang, termasuk crash, kebocoran memori, dan pengecualian yang tidak ditangani.
  • Jika ada bug yang gagal terdeteksi oleh penguji karena keterbatasan waktu dan sumber daya, bug tersebut juga ditemukan dalam pengujian fuzz.
  • Input dihasilkan oleh mesin, sehingga cakupan terus bertambah sepanjang malam tanpa upaya manual tambahan.

Kekurangan Pengujian Fuzz

Sifat-sifat yang membuat pengujian fuzzing menjadi murah juga membatasi apa yang dapat dibuktikannya.

  • Pengujian fuzz saja tidak dapat memberikan gambaran lengkap tentang ancaman keamanan secara keseluruhan atau serangkaian bug.
  • Pengujian fuzzing kurang efektif dalam menangani ancaman keamanan yang tidak menyebabkan program macet, seperti beberapa virus, worm, dan Trojan.
  • Pengujian fuzz hanya dapat mendeteksi kesalahan atau ancaman yang relatif sederhana, dan tidak akan menganalisis logika bisnis.
  • Agar dapat berfungsi secara efektif, hal ini membutuhkan waktu pengoperasian mesin yang signifikan.
  • Menetapkan kondisi nilai batas dengan input acak sangatlah bermasalah, meskipun penguji sekarang banyak mengatasi hal ini dengan algoritma deterministik yang didorong oleh input pengguna.

Pengujian Fuzz vs Pengujian Penetrasi

Kedua aktivitas tersebut bertujuan untuk menemukan celah keamanan, namun keduanya menjawab pertanyaan yang berbeda dan jarang dapat saling menggantikan.

Kriteria Pengujian Fuzz Pengujian Penetrasi
Didorong oleh Mesin otomatis yang menghasilkan input yang salah format Seorang penguji terampil yang bernalar tentang sistem tersebut.
Mencari Kerusakan, macet, dan kesalahan keamanan memori Kelemahan yang dapat dieksploitasi, termasuk kesalahan logika dan konfigurasi.
Kedalaman Cakupan masukan yang sangat luas, penalaran yang dangkal. Cakupan yang sempit, penalaran yang mendalam
Keluaran Mereproduksi input dan tumpukan traces Laporan temuan yang berisi jalur eksploitasi dan peringkat risiko.
Momen terbaik Secara terus menerus, dalam alur kerja pembangunan. Secara berkala, terhadap kandidat rilis.

Dalam praktiknya, keduanya saling mendukung: fuzzing menghilangkan kesalahan yang mudah dan dapat diotomatisasi sehingga waktu terbatas yang dimiliki penguji dapat difokuskan pada kekurangan yang hanya dapat ditemukan oleh manusia.

Pertanyaan Umum Demo Slot

Korpus awal adalah kumpulan input valid yang dimutasi oleh fuzzer. File nyata yang kecil dan bervariasi bekerja paling baik, karena setiap file sudah lolos parser dan memungkinkan mesin untuk mengalokasikan anggarannya pada kode yang lebih dalam daripada pemeriksaan validitas pertama.

Fuzz harness adalah fungsi kecil yang memberikan satu buffer byte yang telah di-fuzz ke kode yang sedang diuji. Fungsi ini harus menghindari akses ke status global, penulisan file, dan panggilan jaringan, sehingga mesin dapat menjalankannya ribuan kali per detik.

Satu atau dua jam sudah cukup untuk mengungkap bug-bug kecil. Kampanye serius berlangsung selama berjam-jam atau berhari-hari, karena liputan baru datang secara bergelombang. Titik stabil pada kurva liputan, bukan pembacaan jam, adalah sinyal jujur ​​bahwa suatu kampanye telah berhenti memberikan hasil.

AddressSanitizer mendeteksi buffer overflow dan use-after-free, UndefinedBehaviorSanitizer mendeteksi penyalahgunaan integer dan pointer, dan MemorySanitizer mendeteksi pembacaan memori yang belum diinisialisasi. Tanpa ketiganya, banyak kerusakan akan lolos tanpa terdeteksi dan fuzzer tidak melaporkan kegagalan sama sekali.

Reproduksikan, minimalkan input ke kasus kegagalan terkecil, kelompokkan dengan kerusakan yang memiliki tumpukan yang sama. trace, lalu ajukan satu tiket melalui prosedur biasa. proses manajemen cacat dan menambahkan input ke dalam korpus regresi.

Mereka memiliki kesamaan dalam hal keacakan tetapi tidak memiliki kesamaan dalam hal niat. Pengujian monyet Ia melemparkan tindakan pengguna secara acak ke antarmuka yang sedang berjalan, sementara fuzzing menargetkan parser input tertentu dan mengukur cakupan kode, sehingga dapat mengarahkan dirinya sendiri ke kode yang tidak pernah dijangkau oleh input sebelumnya.

Model bahasa digunakan untuk membuat kerangka kerja untuk API yang tidak diuji fuzzing, untuk mensintesis input awal untuk format yang eksotis, dan untuk mengelompokkan dan meringkas laporan kerusakan. Mesin tersebut masih menyediakan umpan balik cakupan; model tersebut terutama menghilangkan pekerjaan pengaturan manual.

Kopilot GitHub dapat membuat draf titik masuk libFuzzer, file build, dan generator seed dari tanda tangan API yang sudah ada. RevPerhatikan hasilnya dengan saksama, karena sistem yang secara diam-diam mengabaikan kesalahan tidak akan melaporkan adanya kerusakan.

Ringkaslah postingan ini dengan: