
開始日: 2021年12月
これは、カスタム Just-In-Time コンパイラを利用してネイティブに近いパフォーマンスを実現する、カバレッジ誘導型・エミュレーションベースのグレーボックスファザーです。RISC-V ELF バイナリを中間表現にリフティングし、実行中に JIT コンパイルして x86 へ変換することで動作します。JIT コンパイル中にコードが計測され、カバレッジ追跡、asan、cmpcov、スナップショットベースのファジングなどのファジング改善機能が有効になります。

このプロジェクトの目的は、ファジングにエミュレーション環境を使用することの利点を強調することです。 これまでにもエミュレーションに基づくファザーは多数存在しますが、そのほとんど全てが基盤となるエミュレーションに qemu エミュレーションエンジンを使用しています。このエンジンはかなり成熟した ジャストインタイムコンパイラを備えて非常に良いコードを生成しますが、ファジング向けに設計されてはいません。ファジング中は、 同じプロセスを毎秒数千回実行することを意図しています。これにより、qemu が強く活用していない 特殊な最適化の余地が生まれます。例えば、各プロセス実行で同じメモリ空間を再利用し、 ダーティビット機構で限られた量のメモリのみをリセットするような最適化です。
多くの点で、これはコンパイラの内部を学び、さまざまなカバレッジメトリクス、シードスケジューラ、スナップショットベースのファジングといった多様なファジング技法を試すためのエミュレーションベースの遊び場を持つために私が取り組みたかった、概念実証(proof-of-concept)のようなものです。しかし、さらなる JIT 最適化と、最も重要なこととして mips や arm などのより一般的なアーキテクチャを対象に含める拡張があれば、再コンパイルによる計装を簡単には施せないクローズドソースのコードを効率的にファジングするためにも確実に使用できるでしょう。
これまでに行ったテストを考慮すると、sfuzz は他の多くの人気ファザーよりもオーバーヘッドが大幅に少なく、特に小さなファズケースでは非常に高速なパフォーマンスを実現します。
このファザーの特徴と選択した設計の詳細は、付属のブログ記事 (https://seal9055.com/blog/fuzzing/sfuzz) および以下にリストされたドキュメントファイルに記載されています。
このファザー全体は Rust で書かれています。リポジトリをクローンした後、cargo build --release を実行するだけでコンパイルできます。
現在、ファザーは RISC-V のみをサポートしているため、ターゲットは以下のツールチェーン(または類似のもの)を使用して RISC-V にコンパイルする必要があります。あるいは、すでに RISC-V バイナリを持っている場合も問題なく動作します。
これを設定したら、入力/出力ディレクトリを作成し、入力ディレクトリに初期シードファイルを追加して、ファザーを起動するだけです。
./sfuzz -i in -o out -- ./test_cases/simple_test @@
スレッド数の指定、スナップショットファジングの有効化、ミューテータへの辞書の追加など、追加フラグをコマンドラインオプションで渡すことができます。追加オプションは sfuzz を -h フラグで実行することで一覧表示できます。
さまざまな複雑さのターゲットに対してファザーをテストしたい場合は、tools/program_generator にある progrem_generator を使用して、さまざまな複雑さのプログラムを自動生成できます。その後、ターゲットをコンパイルするには RISC-V ツールチェーンが必要であることに注意してください。
これは、このプロジェクトでロード/使用できる RISC-V バイナリをコンパイルするためのツールチェーンを設定します。
Riscv compiler/tooling:
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev \
libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev \
libexpat-dev
git clone https://github.com/riscv/riscv-gnu-toolchain && cd riscv-gnu-toolchain
./configure --prefix=/opt/riscv --with-arch=rv64i
sudo make
Debugger:
gdb-multiarch
このリストは、今後実装予定の機能群を示しています。