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.

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.
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:
- Pengujian tidak dapat dilanjutkan sampai spesifikasinya matang.
- 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.

