v1.4 Hak Cipta (C) 2020 Andrea Fioraldi [email protected]
Dirilis di bawah Lisensi Apache v2.0
Fuzzer eksperimental ini dimaksudkan untuk digunakan untuk fuzzing dalam memori API.
Desainnya sangat terinspirasi dan berdasarkan AFL/AFL++.
ATM mutatornya cukup sederhana, hanya tahap malapetaka dan penyambungan AFL.
Saya hanya menguji contoh di bawah pengujian/, ini adalah proyek WIP tetapi diketahui berfungsi setidaknya di GNU/Linux x86_64 dan Android x86_64.
Anda memerlukan Frida >= 12.8.1 untuk menjalankan ini ( pip3 install -U frida
) dan frida-tools untuk mengkompilasi harness.
Pustaka fuzz
harus diimpor ke harness khusus dan kemudian dikompilasi dengan frida-compile
untuk menghasilkan agen yang akan disuntikkan frida-fuzzer
ke dalam aplikasi target.
Mayoritas logika fuzzer ada di agen.
Harness memiliki format berikut:
var fuzz = memerlukan("./fuzz");var TARGET_MODULE = "test_linux64";var TARGET_FUNCTION = DebugSymbol.fromName("target_func").address;;var RET_TYPE = "void";var ARGS_TYPES = ['pointer', ' int'];var func_handle = NativeFunction baru(TARGET_FUNCTION, RET_TYPE, ARGS_TYPES, { jebakan: 'semua' });fuzz.target_module = TARGET_MODULE;var payload_mem = Memory.alloc(fuzz.config.MAX_FILE);fuzz.fuzzer_test_one_input = fungsi (/* Uint8Array */ payload) { Memory.writeByteArray(payload_mem , muatan, muatan.panjang); func_handle(payload_mem, payload.length);}
fuzz.fuzzer_test_one_input
wajib diisi. Jika Anda tidak menentukan fuzz.target_module
, semua kode yang dieksekusi akan diinstrumentasi.
Anda juga dapat menyetel fuzz.manual_loop_start = true
untuk memberi tahu fuzzer bahwa Anda akan memanggil fuzz.fuzzing_loop()
dalam panggilan balik sehingga ia tidak boleh memanggilnya untuk Anda (misalnya, untuk mulai melakukan fuzzing ketika tombol diklik di aplikasi Android).
Callback fuzz.init_callback
dapat diatur untuk mengeksekusi kode ketika fuzzer siap untuk memulai. Lihat tests/test_java.js
sebagai contoh.
fuzz.dictionary
adalah kamus fuzzer klasik, sebuah array di mana Anda dapat menambahkan item (tipe yang diterima adalah Array, ArrayBuffer, Uint8Array, String) yang digunakan sebagai nilai tambahan di mutator. Lihat tests/test_libxml2.js
sebagai contoh.
frida-fuzzer
menerima argumen berikut:
-i FOLDER | Folder dengan benih awal |
-o FOLDER | Folder keluaran dengan benih perantara dan macet |
-kamu | Hubungkan ke USB |
-menelurkan | Bertelur dan lampirkan, bukan hanya melampirkan |
-skrip skrip | Nama file skrip (defaultnya adalah fuzzer-agent.js) |
Jika Anda tidak menentukan folder keluaran, folder sementara dibuat di bawah /tmp. Jika Anda tidak menentukan folder dengan seed awal, seed yang tidak diberi informasi 0000
digunakan sebagai seed awal.
Jika Anda melakukan fuzz pada aplikasi lokal, Anda mungkin ingin menjalankan system-config
sebelum frida-fuzzer
untuk menyesuaikan parameter sistem Anda dan mempercepatnya.
Menjalankan ./frida-fuzzer -spawn ./tests/test_linux64
Anda akan melihat sesuatu seperti layar status berikut di terminal Anda:
Anda juga dapat dengan mudah menambahkan tahapan khusus di fuzz/fuzzer.js
dan menambahkannya ke daftar tahapan di fuzz/index.js
.
Untuk menyesuaikan fuzzer, edit fuzz/config.js
. Variabel yang mungkin ingin Anda ubah adalah MAP_SIZE (Jika kode yang Anda fuzzing kecil, Anda dapat menguranginya dan menambah sedikit kecepatan), MAX_FILE (ukuran maksimum input yang dihasilkan) dan QUEUE_CACHE_MAX_SIZE (menambah ukuran cache antrian untuk kecepatan lebih, terutama di Android).
Mari kita fuzz perpustakaan bersama asli dalam contoh aplikasi Android di tests
.
Pastikan Anda memiliki root pada perangkat virtual Anda:
host$ adb root
Unduh server frida Android x86_64 dari halaman rilis repo dan salin ke perangkat di bawah /data/local/tmp (gunakan adb push).
Mulai shell dan jalankan server frida:
device# cd /data/local/tmp device# ./frida-server
Sekarang instal aplikasi pengujian tests/app-debug.apk
menggunakan drag & drop ke jendela emulator.
Kemudian, buka aplikasinya.
Kompilasi skrip agen dengan kompilasi frida:
host$ frida-compile -x tests/test_ndk_x64.js -o fuzzer-agent.js
Buka aplikasi di emulator.
Hapus fungsi test_func
dari pustaka libnative-lib.so
yang dikirimkan bersama aplikasi pengujian dengan perintah:
host$ ./frida-fuzzer -U -o output_folder/ com.example.ndktest1
Kasus uji dan kerusakan yang menarik disimpan ke dalam folder_output.
Menikmati.
Hai komunitas OSS, TODO-nya banyak sekali jika ada yang ingin berkontribusi.
Fuzzing kode Java (menunggu metode tambahan yang diekspos di frida-java-bridge, seharusnya mudah, hampir selesai)
tahap splice (gabungkan dua testcase dalam antrian dan terapkan malapetaka di atasnya)
kamus dukungan (dan memodifikasi juga malapetaka)
pemilihan benih
instrumentasi sebaris untuk arm64
penilaian kinerja (jelajahi jadwal AFL)
mutator struktural (mutasi byte berdasarkan tata bahasa yang ditulis dalam JSON)
CompareCoverage (pembuatan profil sub-instruksi untuk melewati hambatan fuzzing)
tulis ulang frida-fuzzer di C dengan frida-core untuk dapat menjalankan semua hal di perangkat seluler
Jika Anda ragu dengan salah satu fitur ini, silakan DM saya di Twitter.
Untuk proposal fitur, ada bagian Masalah.