Kerangka kerja untuk mengotomatisasi penemuan target fuzzable dengan analisis statis
Peneliti kerentanan yang melakukan penilaian keamanan pada perangkat lunak akan sering memanfaatkan kemampuan cakupan yang dipandu melalui alat-alat yang kuat seperti AFL ++ dan LibFuzzer. Ini penting karena mengotomatiskan proses bughunting dan mengungkapkan kondisi yang dapat dieksploitasi dalam target dengan cepat. Namun, ketika bertemu dengan basis kode besar dan kompleks atau biner sumber tertutup, para peneliti harus dengan susah payah mendedikasikan waktu untuk mengaudit secara manual dan merekayasa baliknya untuk mengidentifikasi fungsi-fungsi di mana eksplorasi berbasis fuzzing dapat berguna.
Fuzzable adalah kerangka kerja yang mengintegrasikan baik dengan kode sumber C/C ++ dan binari untuk membantu peneliti kerentanan dalam mengidentifikasi target fungsi yang layak untuk fuzzing. Ini dilakukan dengan menerapkan beberapa heuristik berbasis analisis statis untuk menunjukkan perilaku berisiko dalam perangkat lunak dan fungsi-fungsi yang mengeksekusinya. Para peneliti kemudian dapat memanfaatkan kerangka kerja untuk menghasilkan templat harness dasar, yang kemudian dapat digunakan untuk berburu kerentanan, atau diintegrasikan sebagai bagian dari pipa fuzzing yang berkelanjutan, seperti proyek Fuzz OSS Google.
Selain berjalan sebagai alat mandiri, Fuzzable juga diintegrasikan sebagai plugin untuk Disassembler Ninja biner, dengan dukungan untuk cadangan pembongkaran lainnya yang sedang dikembangkan.
Lihatlah posting blog asli yang merinci alat di sini, yang menyoroti spesifikasi teknis heuristik analisis statis dan bagaimana alat ini terjadi. Alat ini juga ditampilkan di Black Hat Arsenal USA 2022.
Beberapa target biner mungkin memerlukan beberapa sanitasi (mis. Pencocokan tanda tangan, atau mengidentifikasi fungsi dari inlining), dan karenanya fuzzable terutama menggunakan ninja biner sebagai backend yang dibongkar karena kemampuannya untuk menyelesaikan masalah ini secara efektif. Oleh karena itu, dapat digunakan baik sebagai alat mandiri dan plugin.
Karena ninja biner tidak dapat diakses oleh semua dan mungkin ada permintaan untuk memanfaatkan penilaian keamanan dan berpotensi meningkatkan di cloud, backend Fallback ANGR juga didukung. Saya mengantisipasi untuk memasukkan pembongkar lain di jalan juga (prioritas: ghidra).
Jika Anda memiliki iklan ninja biner, pastikan untuk memasang API untuk penggunaan tanpa kepala mandiri:
$ python3 /Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py
Instal dengan pip :
$ pip install fuzzable
Kami menggunakan puisi untuk manajemen dan bangunan ketergantungan. Untuk melakukan build manual, klon repositori dengan modul pihak ketiga:
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
Untuk menginstal secara manual:
$ cd fuzzable/
# without poetry
$ pip install .
# with poetry
$ poetry install
# with poetry for a development virtualenv
$ poetry shell
Anda sekarang dapat menganalisis binari dan/atau kode sumber dengan alat ini!
# analyzing a single shared object library binary
$ fuzzable analyze examples/binaries/libbasic.so
# analyzing a single C source file
$ fuzzable analyze examples/source/libbasic.c
# analyzing a workspace with multiple C/C++ files and headers
$ fuzzable analyze examples/source/source_bundle/
Fuzzable dapat dengan mudah diinstal melalui pasar plugin ninja biner dengan pergi ke Binary Ninja > Manage Plugins dan mencarinya. Berikut adalah contoh dari plugin fuzzable yang berjalan, akurasi mengidentifikasi target untuk penilaian fuzzing dan kerentanan lebih lanjut:

Fuzzable hadir dengan berbagai opsi untuk membantu memperbaiki analisis Anda dengan lebih baik. Lebih banyak akan didukung dalam rencana mendatang dan permintaan fitur apa pun yang dibuat.
Untuk menentukan kemampuan kabur, fuzzable memanfaatkan beberapa heuristik untuk menentukan target mana yang paling layak untuk ditargetkan untuk analisis dinamis. Semua heuristik ini tertimbang secara berbeda menggunakan perpustakaan Scikit-Criteria, yang menggunakan analisis keputusan multi-kriteria untuk menentukan kandidat terbaik. Metrik ini dan apakah ada bobot dapat dilihat di sini:
| Heuristis | Keterangan | Berat |
|---|---|---|
| Nama ramah fuzz | Nama simbol menyiratkan perilaku yang menelan input file/buffer | 0.3 |
| Tenggelam berisiko | Argumen yang mengalir ke panggilan berisiko (yaitu memcpy) | 0.3 |
| Loop alami | Jumlah loop yang terdeteksi dengan perbatasan dominasi | 0,05 |
| Kompleksitas siklomatik | Kompleksitas target fungsi berdasarkan tepi + node | 0,05 |
| Kedalaman cakupan | Jumlah callees target melintasi | 0.3 |
Seperti yang disebutkan, lihat posting blog teknis untuk tampilan yang lebih mendalam tentang mengapa dan bagaimana metrik ini digunakan.
Banyak metrik sebagian besar terinspirasi oleh karya asli Vincenzo Iozzo dalam 0-Knowledge Fuzzing.
Setiap target yang ingin Anda analisis beragam, dan fuzzable tidak akan dapat memperhitungkan setiap perilaku Case Edge dalam target program. Dengan demikian, mungkin penting selama analisis untuk menyetel bobot ini dengan tepat untuk melihat apakah hasil yang berbeda lebih masuk akal untuk kasus penggunaan Anda. Untuk menyetel bobot ini di CLI, cukup tentukan argumen --score-weights :
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
Secara default, fuzzable akan memfilter target fungsi berdasarkan kriteria berikut:
static dan tidak terpapar melalui header. Untuk melihat panggilan yang disaring dengan fuzzable , atur bendera --list_ignored :
$ fuzzable analyze --list-ignored <TARGET>
Di Binary Ninja, Anda dapat mengubah pengaturan ini di Settings > Fuzzable > List Ignored Calls .
Dalam hal yang dapat disaring secara keliru memfilter panggilan penting yang harus dianalisis, disarankan untuk menggunakan --include-* argumen untuk memasukkannya selama menjalankan:
# include ALL non top-level calls that were filtered out
$ fuzzable analyze --include-nontop <TARGET>
# include specific symbols that were filtered out
$ fuzzable analyze --include-sym <SYM> <TARGET>
Dalam ninja biner, ini didukung melalui Pengaturan> Fuzzable> termasuk panggilan dan Symbols to Exclude Settings > Fuzzable > Include non-top level calls untuk dikecualikan.
Sekarang setelah Anda menemukan kandidat ideal Anda untuk fuzz, fuzzable juga akan membantu Anda menghasilkan harness fuzzing yang (hampir) siap untuk instrumen dan dikompilasi untuk digunakan dengan fuzzer berbasis file (mis. AFL ++, HongGFUZZ) atau fuzzer dalam memori (libfuzzer). Untuk melakukannya di CLI:
# generate harness from a candidate
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# make minimal and necessary modifications to the harness
$ vim target_some_unsafe_call_harness.cpp
# example compilation for AFL-QEMU, which is specified in the comments of the generated harness
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# create your base seeds, ideally should be more well-formed for input
$ mkdir in/
$ echo "seed" >> in/seed
# start black box fuzzing
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
Jika target ini adalah basis kode sumber, template sumber umum akan digunakan.
Jika target adalah biner, templat kotak hitam generik akan digunakan, yang idealnya dapat digunakan dengan mode emulasi fuzzing seperti AFL-QEMU. Salinan biner juga akan dibuat sebagai objek bersama jika simbol tidak diekspor secara langsung untuk dlopen menggunakan Lief.
Saat ini, fitur ini cukup belum sempurna, karena hanya akan membuat harness C ++ mandiri yang dihuni dengan parameter yang sesuai, dan tidak akan menghasilkan kode otomatis yang diperlukan untuk setiap perilaku runtime (yaitu. Namun, templat yang dibuat untuk fuzzable harus membuat Anda berjalan dengan cepat. Berikut adalah beberapa fitur ambisius yang ingin saya terapkan di ujung jalan:
dukungan fuzzable menghasilkan laporan dalam berbagai format. Yang saat ini didukung adalah JSON, CSV dan Markdown. Ini bisa bermanfaat jika Anda menggunakan ini sebagai bagian dari otomatisasi di mana Anda ingin menelan output dalam format serial yang dapat diserialkan.
Di CLI, cukup lulus argumen --export dengan nama file dengan ekstensi yang sesuai:
$ fuzzable analyze --export=report.json <TARGET>
Dalam Biner Ninja, buka Plugins > Fuzzable > Export Fuzzability Report > ... dan pilih format yang ingin Anda ekspor ke dan jalur yang ingin Anda tulis.
Alat ini akan terus dikembangkan, dan bantuan apa pun dari pelayan eksternal dihargai!
Fuzzable dilisensikan di bawah lisensi MIT.