Kang IT
UAFuzz - Pencabutan Terarah Tingkat Biner Untuk Kerentanan Penggunaan Setelah Bebas
Directed Greybox Fuzzing (DGF) seperti AFLGo bertujuan untuk melakukan pengujian tekanan pada lokasi target berpotensi rentan yang telah dipilih sebelumnya, dengan aplikasi untuk konteks keamanan yang berbeda: (1) reproduksi bug, (2) pengujian patch atau (3) verifikasi laporan analisis statis . Baru-baru ini ada lebih banyak penelitian yang meningkatkan efektivitas dan efisiensi fuzzing terarah (lihat fuzzing terarah yang mengagumkan ).
Kami mengusulkan UAFuzz yang merupakan fuzzer terarah yang didedikasikan untuk bug Use-After-Free (UAF) pada tingkat biner dengan secara hati-hati menyetel komponen kunci dari fuzzing terarah untuk memenuhi karakteristik spesifik dari kelas bug ini. Bug UAF muncul ketika elemen heap digunakan setelah dibebaskan. Mendeteksi bug UAF itu sulit: (1) kompleksitas karena input Proof-of-Concept (PoC) perlu memicu urutan tiga peristiwa - alokasi, gratis, dan penggunaan - di lokasi memori yang sama, mencakup beberapa fungsi dari program yang diuji dan (2) diam tanpa kesalahan segmentasi.
Secara keseluruhan, UAFuzz memiliki alur kerja yang mirip dengan fuzzer yang diarahkan dengan modifikasi kami yang disorot dengan warna oranye di sepanjang proses fuzzing, seperti yang ditunjukkan pada gambar berikut. Karena kami fokus pada (1) reproduksi bug dan (2) aplikasi pengujian patch, kemungkinan besar kami memiliki (kebanyakan) jejak tumpukan lengkap dari semua peristiwa UAF terkait memori. Tidak seperti pendekatan diarahkan umum yang ada di mana target dapat dipilih secara independen, kami memperhitungkan hubungan di antara target (misalnya, urutan yang penting untuk UAF) untuk meningkatkan arah. Pertama, prakomputasi statis UAFuzz cepat pada level biner. Kedua, kami memperkenalkan metrik masukan sadar pemesanan baru untuk memandu fuzzer menuju target pada waktu proses. Akhirnya, kamitriase hanya input potensial yang mencakup semua target dalam jejak yang diharapkan dan pra-filter untuk input gratis yang cenderung tidak memicu bug.
Detail lebih lanjut dalam makalah kami di RAID'20 dan pembicaraan kami di Black Hat USA'20. Terima kasih juga kepada Sébastien Bardin, Matthieu Lemerre, Prof. Roland Groz dan terutama Richard Bonichon ( @rbonichon ) atas bantuannya di Ocaml.
Instalasi
- IDA Pro v6.9 (32-bit) dan Python v2.7 (kami bertujuan untuk mendukung lebih banyak pembongkaran biner sumber terbuka seperti Radare di masa mendatang).
- Graph-Easy v0.7.6 untuk mengubah grafik panggilan IDA ke dalam format titik.
- Alat pembuatan profil Valgrind .
- Kerangka analisis biner BINSEC .
- AFL v2.52b greybox dengan panduan cakupan dalam mode QEMU.
Lingkungan kami yang diuji adalah Ubuntu 16.04 64-bit.
# Install Ocaml and prerequisite packages for BINSEC via OPAM
sudo apt update
sudo apt install ocaml ocaml-native-compilers camlp4-extra opam
opam init
opam switch 4.05.0
opam install merlin ocp-indent caml-mode tuareg menhir ocamlgraph ocamlfind piqi zmq.5.0.0 zarith llvm.6.0.0
# Install Python's packages
sudo pip install networkx pydot
# Checkout source code
git clone https://github.com/strongcourage/uafuzz.git
# Environment variables
export IDA_PATH = /path/to/ida-6.9/idaq
export GRAPH_EASY_PATH=/path/to/graph-easy
cd uafuzz; export UAFUZZ_PATH=`pwd`
# Compile source code
./scripts/build.sh uafuzz
# Help for IDA/UAFuzz interface
./binsec/src/binsec -ida-help
./binsec/src/binsec -uafuzz-help
Struktur kode
Fuzzer kami dibangun di atas AFL v2.52b dalam mode QEMU untuk fuzzing dan BINSEC untuk analisis statis ringan (lihat uafuzz / README.md ). Saat ini kami menggunakan IDA Pro v6.9 untuk mengekstrak grafik aliran kontrol (CFG) dan grafik panggilan dari biner yang diuji (lihat ida / README.md ).
uafuzz
├── binsec/src
│ └── ida: a plugin to import and process IDA's CFGs and call graph
│ └── uafuzz: fuzzing code
│ │ └── afl-2.52b: core fuzzing built on top of AFL-QEMU
│ │ └── uafuzz_*.ml(i): a plugin to compute static information and communicate with AFL-QEMU
└── scripts: some scripts for building and bug triaging
Aplikasi 1: Reproduksi bug
Pertama-tama kami menganggap bug UAF sederhana . Baik AFL-QEMU dan bahkan AFLGo fuzzer yang diarahkan dengan target pada tingkat sumber tidak dapat mendeteksi bug ini dalam 6 jam, sementara UAFuzz dapat mendeteksinya dalam beberapa menit dengan bantuan laporan UAF dari Valgrind .
# Run AFL-QEMU
$UAFUZZ_PATH/tests/example.sh aflqemu 360
# Run AFLGo given targets at source-level
$UAFUZZ_PATH/tests/example.sh aflgo 360
# Run UAFuzz
$UAFUZZ_PATH/tests/example.sh uafuzz 360 $UAFUZZ_PATH/tests/example/example.valgrind
Untuk program dunia nyata, kami menggunakan UAF Fuzzing Benchmark untuk evaluasi kami.
# Checkout the benchmark
git clone https://github.com/strongcourage/uafbench.git
cd uafbench; export UAFBENCH_PATH=`pwd`
Kami menunjukkan secara detail cara menjalankan UAFuzz untuk aplikasi reproduksi bug CVE-2018-20623 dari readelf (Binutils). Jejak tumpukan bug UAF ini yang diperoleh oleh Valgrind adalah sebagai berikut:
// stack trace for the bad Use
==5358== Invalid read of size 1
==5358== at 0x40A9393: vfprintf (vfprintf.c:1632)
==5358== by 0x40A9680: buffered_vfprintf (vfprintf.c:2320)
==5358== by 0x40A72E0: vfprintf (vfprintf.c:1293)
[6] ==5358== by 0x80AB881: error (elfcomm.c:43)
[5] ==5358== by 0x8086217: process_archive (readelf.c:19409)
[1] ==5358== by 0x80868EA: process_file (readelf.c:19588)
[0] ==5358== by 0x8086B01: main (readelf.c:19664)
// stack trace for the Free
==5358== Address 0x4221dc0 is 0 bytes inside a block of size 80 free'd
==5358== at 0x402D358: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
[4] ==5358== by 0x8086647: process_archive (readelf.c:19524)
[1] ==5358== by 0x80868EA: process_file (readelf.c:19588)
[0] ==5358== by 0x8086B01: main (readelf.c:19664)
// stack trace for the Alloc
==5358== Bloc k was alloc'd at
==5358== at 0x402C17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
[3] ==5358== by 0x80AD97E: make_qualified_name (elfcomm.c:906)
[2] ==5358== by 0x8086350: process_archive (readelf.c:19435)
[1] ==5358== by 0x80868EA: process_file (readelf.c:19588)
[0] ==5358== by 0x8086B01: main (readelf.c:19664)
1. Pemrosesan awal
The Script preprocessing mengambil biner diuji di x86 dan jejak stack Valgrind sebagai masukan, kemudian menghasilkan UAF bug jejak yang merupakan urutan lokasi target dalam format (basic_block_address,function_name)
seperti berikut:
[0] (0x8086ae1,main) -> [1] (0x80868de,process_file) -> [2] (0x808632c,process_archive) ->
[3, alloc] (0x80ad974,make_qualified_name) -> [4, free] (0x808663a,process_archive) ->
[5] (0x808620b,process_archive) -> [6, use] (0x80ab86a,error)
2. Pengaburan
Kami menyediakan template skrip fuzzing dengan beberapa parameter input, misalnya fuzzer yang ingin kami jalankan, batas waktu dalam menit dan target yang telah ditentukan (misalnya, diekstrak dari laporan bug). Untuk contoh di atas, kami menggunakan skrip CVE-2018-20623.sh dan menjalankan UAFuzz sebagai:
# Run UAFuzz with timeout 60 minutes
$UAFBENCH_PATH/CVE-2018-20623.sh uafuzz 60 $UAFBENCH_PATH/valgrind/CVE-2018-20623.valgrind
3. Triaging
Setelah waktu fuzzing habis, UAFuzz dapat mengidentifikasi input mana yang mencakup secara berurutan semua lokasi target dari jejak bug UAF yang diharapkan (misalnya, nama input yang diakhiri dengan ',all'
). Dengan demikian, UAFuzz hanya melakukan triase jenis input yang mungkin memicu bug yang diinginkan dengan menggunakan alat profil yang ada seperti Valgrind atau AddressSanitizer.
Aplikasi 2: Pengujian patch
Kami menggunakan CVE-2018-6952 dari GNU Patch untuk mengilustrasikan pentingnya menghasilkan input pemicu bug unik yang berbeda untuk mendukung proses perbaikan. Ada double free di GNU Patch yang sudah diperbaiki oleh developer ( commit9c98635
). Namun, dengan menggunakan pelacakan tumpukan CVE-2018-6952, UAFuzz menemukan perbaikan bug CVE-2019-20633 yang tidak lengkap dari versi 2.7.6 (komit 76e7758
), dengan sedikit perbedaan jejak bug. Secara keseluruhan, prosesnya mirip dengan aplikasi reproduksi bug, kecuali bahwa beberapa pekerjaan manual mungkin diperlukan untuk mengidentifikasi jejak bug UAF target. Kami menggunakan masukan PoC dari bug yang ada dan file yang valid di fuzzing-corpus sebagai seed berkualitas tinggi.
# Fuzz patched version of CVE-2018-6952
$UAFBENCH_PATH/CVE-2019-20633.sh uafuzz 360 $UAFBENCH_PATH/valgrind/CVE-2018-6952.valgrind
Aplikasi 3: Verifikasi laporan analisis statis
Pendekatan hybrid yang mungkin adalah menggabungkan UAFuzz dengan GUEB yang merupakan satu-satunya penganalisis statis tingkat biner yang ditulis dalam Ocaml untuk UAF. Namun, GUEB menghasilkan banyak positif palsu dan saat ini tidak dapat berfungsi dengan baik dengan biner yang kompleks. Jadi saat ini kami meningkatkan dan mengintegrasikan GUEB ke BINSEC dan kemudian menggunakan target yang diambil dari laporan GUEB untuk memandu UAFuzz. Tetap disini!
Regards
Kang IT
No comments:
Post a Comment