ESSS adalah alat analisis statis untuk mendeteksi pemeriksaan kesalahan yang hilang dan salah dalam basis kode C dan C ++. Alat ini secara otomatis mendeduksi spesifikasi kesalahan untuk fungsi, tanpa memerlukan pengetahuan apriori, dan kemudian menemukan lokasi kode di mana pemeriksaan kesalahan hilang atau tidak konsisten dengan spesifikasi tersebut.
Repositori ini berisi kode sumber ESSS, serta skrip dan data untuk menjalankan alat dan EESI pada tolok ukur yang digunakan dalam makalah.
Evaluasi Artefak VM sudah berisi alat ESSS dan LLVM Toolchain Pre-Built. Versi LLVM yang digunakan adalah 14.0.6. Alasan kami melakukan build sendiri daripada versi yang disediakan distro adalah untuk memastikan reproduksibilitas hasil yang tepat tanpa memiliki patch spesifik distro yang berpotensi menginterfer.
Alat ini didukung pada distribusi Linux terbaru. Kami mengkonfirmasi bahwa itu berfungsi dengan pasti pada Ubuntu 22.04. Tidak diperlukan persyaratan perangkat keras khusus untuk menjalankan ESS, meskipun kami merekomendasikan setidaknya 8 GIB RAM. Meskipun alat ini dapat berjalan dengan lebih sedikit, mungkin membutuhkan hingga 2 Gib RAM untuk tolok ukur terbesar, meninggalkan lebih sedikit memori untuk proses lain.
Jika Anda ingin membangun alat ESSS secara manual dan/atau LLVM Toolchain, ikuti instruksi ini.
Ketergantungan berikut diperlukan untuk membangun alat ESSS:
$ cd /home/evaluation/ESSS/llvm
$ mkdir llvm-project
$ cd llvm-project
$ wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang-14.0.6.src.tar.xz
$ wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/llvm-14.0.6.src.tar.xz
$ tar xf llvm-14.0.6.src.tar.xz
$ tar xf clang-14.0.6.src.tar.xz
$ mv clang-14.0.6.src clang
$ mv llvm-14.0.6.src llvm
$ cd ..
$ ./build-llvm.sh$ cd /home/evaluation/ESSS/analyzer
$ make Ini akan membangun alat penganalisa dan menempatkan biner di direktori /home/evaluation/ESSS/analyzer/build/lib .
Saat menerapkan alat ke tolok ukur Anda sendiri, Anda harus menghasilkan file bitcode terlebih dahulu. Untuk melakukannya, Anda harus menggunakan WLLVM. Ikuti instruksi instalasi pada halaman ReadMe WLLVM.
Selain itu, kami juga mengandalkan Musl untuk menyimpulkan spesifikasi dari LIBC. Meskipun tidak sepenuhnya diperlukan agar alat bekerja, ini akan meningkatkan ketepatan spesifikasi yang disimpulkan. Versi yang digunakan dalam kertas adalah Musl 1.2.3, tetapi versi apa pun harus berfungsi. Ini adalah langkah -langkah untuk membangun Musl menjadi file bitcode:
cd musl
mkdir prefix
export CC=wllvm
./configure --prefix= " $( realpath prefix ) "
make -j4
make install
extract-bc prefix/lib/libc.soUntuk mengkompilasi program untuk digunakan dengan alat kami, Anda harus mengikuti instruksi build dari program tersebut, tetapi gunakan pembungkus WLLVM sebagai kompiler. Ini akan menghasilkan file bitcode yang dapat dianalisis dengan alat kami. Idealnya, Anda meneruskan semua file bitcode secara terpisah ke alat kami, karena memberikan seluruh program sekaligus (yang terjadi secara default oleh Extract-BC) akan lebih lambat untuk diproses daripada file terpisah.
Alat ini dapat dieksekusi secara langsung dengan mengeksekusi ./kanalyzer di dalam /home/evaluation/ESSS/analyzer/build/lib . Argumen adalah jalur ke file bitcode. Output ditulis ke stdout. Alat ini juga berisi beberapa argumen opsional yang dapat terdaftar menggunakan opsi --help .
Untuk menjalankan alat untuk menyimpulkan spesifikasi dan mendeteksi bug dalam suatu program, Anda dapat menggunakan perintah berikut:
./kanalyzer /path/to/mysl/libc.so.bc /path/to/bitcode1.bc /path/to/bitcode2.bc ...Output akan ditulis ke stdout, ini termasuk spesifikasi yang disimpulkan dan bug.
Alat ini mendukung opsi konfigurasi yang dapat diatur menggunakan argumen baris perintah.
Opsi konfigurasi yang paling penting adalah:
--missing-ct : Ambang batas untuk cek yang hilang. Hanya laporan dengan skor yang setidaknya nilai ini akan dilaporkan. Nilai defaultnya adalah 0,725.--incorrect-ct : Ambang batas untuk spesifikasi yang salah. Hanya laporan dengan skor yang setidaknya nilai ini akan dilaporkan. Nilai defaultnya adalah 0,725.Pilihan berguna lainnya termasuk:
--refine-vsa : Ini memungkinkan mengambil persimpangan antara set nilai kesalahan dan kemungkinan nilai pengembalian konstan fungsi untuk meningkatkan ketepatan spesifikasi kesalahan. Default ke true.--st : Kepercayaan analisis asosiasi antara [0, 1]. Semakin tinggi semakin percaya diri asosiasi itu. Default ke 0,925.--interval-ct : ambang kepercayaan antara [0, 1]. Semakin tinggi semakin mirip interval kesalahan yang seharusnya.-c <number> : Mengatur jumlah utas ke <number> . Tidak diuji secara menyeluruh untuk nilai selain 1.Ada beberapa opsi debugging juga:
--print-random-non-void-function-samples <number> : Berapa banyak nama fungsi non-void acak untuk dicetak, berguna untuk fungsi pengambilan sampel untuk menghitung penarikan. Default ke 0.--ssc : Mencetak kesalahan yang terdeteksi memeriksa secara terpisah. Default ke false. Kami memberikan contoh minimal dalam direktori example . Ada beberapa kode mainan sederhana dalam example/example.c yang dapat Anda jalankan melalui penganalisa menggunakan skrip example/build_and_run.sh . Setelah berjalan, Anda harus mendapatkan output berikut:
Function error return intervals (3, pre-libc-pruning 3):
Function: func {return index 0}
[0, 0]
Function: generate_error {return index 0}
[-2147483648, -1] U [1, 2147483647]
Function: malloc {return index 0}
[0, 0]
Repositori disusun sebagai berikut. File yang diadaptasi dari Crix ditandai seperti itu.
? ESSS
│ ├── ? analyzer [the ESSS tool source code]
│ │ │ ├── ? Makefile [adapted from Crix]
│ │ │ └── ? src
│ │ │ │ ├── ? ...
│ │ │ │ └── ? src
│ │ │ │ │ ├── ? Analyzer.{cc, h} [Entry point of the application, adapted from Crix]
│ │ │ │ │ ├── ? CallGraph.{cc, h} [MLTA component from Crix]
│ │ │ │ │ ├── ? ClOptForward.h [Forward declarations of command line options]
│ │ │ │ │ ├── ? Common.{cc, h} [Common utility functions, adapted from Crix]
│ │ │ │ │ ├── ? DataFlowAnalysis.{cc, h} [Dataflow analysis helpers]
│ │ │ │ │ ├── ? DebugHelpers.{cc, h} [Debugging helpers]
│ │ │ │ │ ├── ? EHBlockDetector.{cc, h} [Specification inference component]
│ │ │ │ │ ├── ? ErrorCheckViolationFinder.{cc, h} [Bug detection component]
│ │ │ │ │ ├── ? FunctionErrorReturnIntervals.{cc, h} [Data structure file]
│ │ │ │ │ ├── ? FunctionVSA.{cc, h} [Value set analysis of return values component]
│ │ │ │ │ ├── ? Helpers.{cc, h} [Common utility functions]
│ │ │ │ │ ├── ? Interval.{cc, h} [Interval data structure]
│ │ │ │ │ ├── ? Lazy.h [Lazy execution utility class]
│ │ │ │ │ ├── ? MLTA.{cc, h} [MLTA component from Crix]
│ │ │ │ │ └── ? PathSpan.h [Data structure to store (parts of) paths]
│ └── ? evaluation [Scripts and data to run the tool on the benchmarks]
│ │ ├── ? benchmark-instructions [Instructions to compile each benchmark into bitcode files]
│ │ ├── ? ...
│ │ ├── ? eesi-<program>-output [Our EESI output for <program>]
│ │ ├── ? eesi-<program>-precision [Random sample from EESI's output for <program> for precision calculation]
│ │ ├── ? run-eesi-<program>.sh [Runs EESI for <program> (e.g. openssl)]
│ │ ├── ? my-<program>-output [Our ESSS output for <program>]
│ │ ├── ? run-my-<program>.sh [Runs ESSS for <program> (e.g. openssl)]
│ │ ├── ? <program>-bugs [Bug categorisations for <program> (e.g. openssl)]
│ │ ├── ? <program>-recall-sample [Random sample from error-returning functions in <program> for recall calculation]
│ │ ├── ? <program>-precision-ground-truth [Ground truth for precision evaluation for ESSS]
│ │ ├── ? <program>-random-functions-for-precision-my-tool [Random sample from ESSS's output for <program> for precision calculation]
│ │ ├── ? compute_my_stats.py [Computes stats for ESSS for a program]
│ │ └── ? compute_eesi_stats.py [Computes stats for EESI for a program]
Secara khusus, inferensi spesifikasi diimplementasikan dalam ehblockdetector.cc dan deteksi bug di errorCheckViolationFinder.cc.
Instruksi untuk menjalankan setiap benchmark disediakan di direktori evaluation/benchmark-instructions . Untuk menjalankan salah satu tolok ukur, jalankan skrip yang sesuai di direktori evaluation (seperti yang dijelaskan dalam ikhtisar struktur repositori di atas).
compute_my_stats.py : Script ini menghitung skor presisi, penarikan, dan F1 dari alat ESSS untuk tolok ukur yang diberikan.compute_eesi_stats.py : Script ini menghitung skor presisi, penarikan, dan F1 dari alat EESI untuk tolok ukur yang diberikan.run-eesi-<program>.sh : Skrip ini menjalankan alat EESI pada tolok ukur yang diberikan.run-my-<program>.sh : skrip ini menjalankan alat ESSS pada tolok ukur yang diberikan. Untuk memudahkan evaluasi, kami menyediakan untuk setiap tolok ukur skrip run untuk menjalankan alat. Ini dapat ditemukan di /home/evaluation/ESSS/evaluation :
run-my-openssl.shrun-my-openssh.shrun-my-php.shrun-my-zlib.shrun-my-libpng.shrun-my-freetype.shrun-my-libwebp.sh Artefak evaluasi disediakan sebagai gambar VirtualBox VM di Zenodo. Untuk membangun gambar VM, kami mulai dari instalasi Ubuntu 22.04 LTS (x86-64). Kami kemudian dapat menggunakan skrip yang disediakan di vm/build-vm.sh untuk menginstal dan mengatur segala yang diperlukan untuk evaluasi.
Alat ini didasarkan pada alat CRIX dari University of Minnesota. Secara khusus, kami menggunakan kembali komponen MLTA CRIX. ESS didistribusikan di bawah lisensi yang sama.
Tautan ke halaman publikasi USENIX Paper: https://www.usenix.org/conference/usenixsecurity24/presentation/dossche
Tautan ke publikasi akhir PDF: https://www.usenix.org/system/files/usenixsecurity24-dossche.pdf
Tautan ke lampiran artefak akhir PDF (tersedia, fungsional, lencana yang direproduksi): https://www.usenix.org/system/files/usenixsecurity24-apendix-dossche.pdf
@inproceedings {dossche2024inferenceoferrorspecifications,
author = {Niels Dossche and Bart Coppens},
title = {Inference of Error Specifications and Bug Detection Using Structural Similarities},
booktitle = {33rd USENIX Security Symposium (USENIX Security 24)},
year = {2024},
isbn = {978-1-939133-44-1},
address = {Philadelphia, PA},
pages = {1885--1902},
url = {https://www.usenix.org/conference/usenixsecurity24/presentation/dossche},
publisher = {USENIX Association},
month = aug
}