ESSSは、CおよびC ++コードベースで欠落しているエラーと誤ったエラーチェックを検出する静的分析ツールです。このツールは、アプリオリの知識を必要とせずに機能のエラー仕様を自動的に推測し、エラーチェックがそれらの仕様に欠落または矛盾しているコードの場所を見つけます。
このリポジトリには、ESSSソースコードと、ペーパーで使用されるベンチマークでツールとEESIを実行するスクリプトとデータが含まれています。
Artifact Evaluation VMには、ESSSツールとLLVMツールチェーンが事前に構築されたものが既に含まれています。使用されるLLVMバージョンは14.0.6です。ディストリビューションが提供するバージョンではなく、ビルドを実行する理由は、潜在的にインタル化するディストリビューション固有のパッチを持たずに正確な結果を再現可能にすることです。
このツールは、最近のLinux分布でサポートされています。 Ubuntu 22.04で確実に機能することを確認しました。 ESSを実行するには特別なハードウェア要件は必要ありませんが、少なくとも8つのGIBのRAMを推奨しています。ツールはより少なく実行できますが、最大のベンチマークには最大2ギブのRAMが必要になる場合があり、他のプロセスのメモリが少なくなります。
ESSSツールおよび/またはLLVMツールチェーンを手動で構築する場合は、次の指示に従ってください。
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これにより、アナライザーツールが構築され、 /home/evaluation/ESSS/analyzer/build/libディレクトリにバイナリを配置します。
自分のベンチマークにツールを適用する場合、最初にビットコードファイルを生成する必要があります。そのためには、wllvmを使用する必要があります。 WLLVM READMEページのインストール手順に従ってください。
さらに、LIBCからの仕様を推測するためにMUSLにも依存しています。ツールが動作するためには厳密に必要ではありませんが、これにより、推定された仕様の精度が向上します。論文で使用されているバージョンはMUSL 1.2.3でしたが、どのバージョンも機能するはずです。これらは、MUSLをビットコードファイルに組み込むための手順です。
cd musl
mkdir prefix
export CC=wllvm
./configure --prefix= " $( realpath prefix ) "
make -j4
make install
extract-bc prefix/lib/libc.soツールで使用するプログラムをコンパイルするには、上記のプログラムのビルド命令に従う必要がありますが、WLLVMラッパーをコンパイラとして使用する必要があります。これにより、ツールで分析できるビットコードファイルが作成されます。理想的には、すべてのビットコードファイルをツールに個別に渡すことができます。これは、プログラム全体を一度に提供する(デフォルトで発生することで発生すること)、ファイルを個別に処理するのが遅いためです。
このツールは./kanalyzer内/home/evaluation/ESSS/analyzer/build/lib実行することで直接実行できます。引数は、ビットコードファイルへのパスです。出力はstdoutに書き込まれます。このツールには、 --helpオプションを使用してリストできるオプションの引数も含まれています。
プログラムで仕様を推測し、バグを検出するためのツールを実行するには、次のコマンドを使用できます。
./kanalyzer /path/to/mysl/libc.so.bc /path/to/bitcode1.bc /path/to/bitcode2.bc ...出力はstdoutに書き込まれます。これには、推定された仕様とバグが含まれます。
このツールは、コマンドライン引数を使用して設定できる構成オプションをサポートしています。
最も重要な構成オプションは次のとおりです。
--missing-ct :欠落しているチェックのしきい値。少なくともこの値のスコアを持つレポートのみが報告されます。デフォルト値は0.725です。--incorrect-ct :誤った仕様のしきい値。少なくともこの値のスコアを持つレポートのみが報告されます。デフォルト値は0.725です。その他の便利なオプションは次のとおりです。
--refine-vsa :これにより、エラー値設定と関数の可能な一定の戻り値との交差点を取得して、エラー仕様の精度を高めることができます。デフォルトはtrueです。--st :[0、1]の間の関連分析の信頼。協会は自信が高いほどです。デフォルトは0.925です。--interval-ct :[0、1]の間の信頼のしきい値。エラー間隔はより高いほど類似しています。-c <number> :スレッドの数を<number>に設定します。 1以外の値については完全にテストされていません。いくつかのデバッグオプションもあります:
--print-random-non-void-function-samples <number> :リコールを計算するためのサンプリング関数に役立つ、印刷するランダムな非void関数名。デフォルトは0です。--ssc :検出されたエラーチェックを個別に印刷します。デフォルトはfalseになります。exampleディレクトリに最小限の例を提供します。 example/example.cにはexample/build_and_run.shスクリプトを使用してアナライザーを実行できる簡単な玩具コードがあります。実行すると、次の出力を取得する必要があります。
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]
リポジトリは次のように構成されています。 Crixから適合したファイルは、そのようにマークされています。
? 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]
特に、仕様推論はehblockdetector.ccに実装され、errorcheckviolationfinder.ccのバグ検出が実装されています。
各ベンチマークを実行するための手順はevaluation/benchmark-instructionsディレクトリで提供されます。ベンチマークの1つを実行するには、 evaluationディレクトリで対応するスクリプトを実行します(上記のリポジトリ構造の概要で説明してください)。
compute_my_stats.py :このスクリプトは、特定のベンチマークのESSSツールの精度、リコール、およびF1スコアを計算します。compute_eesi_stats.py :このスクリプトは、特定のベンチマークのEESIツールの精度、リコール、およびF1スコアを計算します。run-eesi-<program>.sh :このスクリプトは、指定されたベンチマークでEESIツールを実行します。run-my-<program>.sh :このスクリプトは、特定のベンチマークでESSSツールを実行します。 評価を容易にするために、各ベンチマークに対して、ツールを実行するための実行スクリプトを提供しました。これらは/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評価アーティファクトは、ZenodoのVirtualBox VM画像として提供されます。 VM画像を構築するために、Ubuntu 22.04 LTS(x86-64)のインストールから始めました。その後、 vm/build-vm.shで提供されるスクリプトを使用して、評価に必要なすべてをインストールおよびセットアップできます。
このツールは、ミネソタ大学のCrixツールに基づいています。特に、CrixのMLTAコンポーネントを再利用します。 ESSSは同じライセンスの下で配布されます。
Usenixの紙の出版ページへのリンク:https://www.usenix.org/conference/usenixsecurity24/presentation/dossche
最終出版物へのリンクPDF:https://www.usenix.org/system/files/usenixsecurity24-dossche.pdf
最終的なアーティファクトへのリンク付録PDF(利用可能、機能、複製バッジ):https://www.usenix.org/system/files/usenixsecurity24-appendix-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
}