このリポジトリは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で発表されました。

| このリポジトリの引用方法: |
@inproceedings{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]) and Stefan Nagy ([email protected]) |
| ライセンス: | MITライセンス |
| 免責事項: | このソフトウェアは無保証で提供されます。 |
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]
例えば、48時間のファジングキャンペーンの最初の試行をBinvariantsのルートディレクトリから実行する場合:
./Example/2-fuzz.sh $PWD 48h 1
以下は、Binvariantsの潜在的な拡張機能です。
現在、Binvariantsはファジング前に不変条件を学習し、その後ファジングを個別に実行します。考えられる拡張として、ファジング中に不変条件を学習し、違反が発生したときに更新することで、フィードバックを経時的に進化させることができます。
考えられる設計上の考慮事項:
FSRV_RUN_OK)にのみコミットすることです。Binvariantsは現在、単一ブロックの不変条件に焦点を当てています。潜在的な拡張として、クロスブロック不変条件のサポートがあります。これには、ブロック境界を越えてレジスタ値を追跡する新しいデータ構造と、制御がブロック間を移動する際の違反をチェックするための追加のインストルメンテーションが必要です。
Binvariantsを使用して他のバグを発見した場合は、ぜひお知らせください!
この研究は、米国国立科学財団(NSF)の助成金番号2419798、および国防高等研究計画局(DARPA)の助成金番号FA8750-24-2-0002、サブアワード番号GR105409-SUB00001384の支援を受けて行われました。
| cpdf | https://github.com/johnwhitington/camlpdf/issues/75 |
| sfconvert | https://github.com/mpruett/audiofile/issues/73 |