このリポジトリは Binvariants のソースコードを提供します。Binvariants は、バイナリのファジングにレジスタレベルの「可能性の高い不変条件」の違反を活用するプロトタイプのファジングフレームワークです。
本研究は、2026年 ACM International Conference on the Foundations of Software Engineering (FSE'26) に採録された論文 Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants | スライド で発表されています。

| このリポジトリの引用: |
@article{yang:binvariants, title = {Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants}, author = {Zao Yang and Stefan Nagy}, year = {2026}, issue_date = {July 2026}, publisher = {Association for Computing Machinery}, address = {New York, NY, USA}, volume = {3}, number = {FSE}, journal = {Proc. ACM Softw. Eng.}}
|
| 開発者: | Zao Yang ([email protected]) および Stefan Nagy ([email protected]) |
| ライセンス: | MIT License |
| 免責事項: | 本ソフトウェアは現状のまま提供され、いかなる保証も伴いません。 |
Binvariants は AFL++ と QEMU-AFL の上に構築されています。 Binvariants をセットアップする前に、これらのプロジェクトが必要とする依存関係をインストールしてください:
sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake cmake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools cargo libgtk-3-dev
# try to install llvm-18 and install the distro default if that fails
sudo apt-get install -y lld-18 llvm-18 llvm-18-dev clang-18 || sudo apt-get install -y lld llvm llvm-dev clang
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/\..*//'|sed 's/.* //')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/\..*//'|sed 's/.* //')-dev
sudo apt-get install -y meson ninja-build # for QEMU mode
Binvariants は次の 2 つのコンポーネントで構成されています:
それぞれをビルドするには、対応するディレクトリに移動して次のコマンドを実行します:
./1_patch.sh
./2_build.sh
Example/ には、Binvariants を使用して nconvert バイナリをファジングするためのサンプルスクリプトとテストケースが含まれています。スクリプトを変更することで、他のバイナリをファジングできます。
Binvariants を使用する前に、ASLR を無効化してください。不変条件の学習とファジングの間で一貫した基本ブロックアドレスが必要となるためです:
sudo sysctl -w kernel.randomize_va_space=0
不変条件を学習するには、次を実行します:
./Example/1-learn_invs.sh [Binvariants_Root]
推論されたRLIは、1-learn_invs.sh 内の BINV_TRACES_DIR で指定されたディレクトリに、[PROGRAM]_trace_qemu_invs という名前で保存されます。
Binvariants でファジングを開始するには、次を実行します:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
例えば、Binvariantsのルートディレクトリから48時間のファジングキャンペーンの第1回試行を実行します:
./Example/2-fuzz.sh $PWD 48h 1
以下はBinvariantsに対する潜在的な機能強化です。
現在、Binvariantsはファジングの前に不変条件を学習し、その後ファジングを別途実行します。考えられる機能強化として、ファジング中に不変条件を学習し、違反が発生するたびにそれらを更新することで、フィードバックを時間の経過とともに進化させることが挙げられます。
考えられる設計上の検討事項:
FSRV_RUN_OK)にのみコミットすることです。Binvariantsは現在、単一ブロックの不変条件に焦点を当てています。潜在的な機能強化として、ブロック横断的な不変条件のサポートが挙げられます。これには、ブロック境界を越えてレジスタ値を追跡するための新しいデータ構造と、制御がブロック間を移る際に違反をチェックするための追加の計装が必要です。
Binvariantsを使用して他のバグを見つけた場合は、ぜひお知らせください!
この資料は、National Science Foundation(NSF)のAward No. 2419798、およびDefense Advanced Research Projects Agency(DARPA)のAward No. FA8750-24-2-0002、Subaward No. GR105409-SUB00001384による支援を受けた成果に基づいています。