honggfuzzの概要
honggfuzzは、Googleが開発したコードカバレッジに基づくファザーで、aflやlibfuzzerに対応しています。また、非常に効率的なフィードバック駆動のファズツールでもあります。
プロジェクト | ホンファズ |
---|---|
プロジェクトの住所 | https://github.com/google/honggfuzz |
開発者 | グーグル |
更新するかどうか | 更新を続ける |
honggfuzzの機能
- マルチプロセスとマルチスレッドなので、ファズは非常に高速です
- 永続的なファズ(Persistent Fuzzing)をサポートします。これは、APIを呼び出して長期間にわたってファジングを繰り返すプロセスです。
- 使いやすく、シンプルなコーパスカタログに提供します(フィードバック駆動のファズテストでは空の場合もあります)。徐々に進化し、フィードバックベースのカバレッジメトリックを使用して拡張します
- 使用のプロセスを監視するための低レベルのインターフェース、クラッシュからの信号を見つけて報告する可能性が高いハイジャック、無視
- 複数のファズモードをサポート(ハードウェアベース(CPU:分岐/命令カウント、Intel BTS、Intel PT)およびソフトウェアベースのフィードバック駆動ファジーモード)(カバレッジに基づく他のフィードバック駆動ファザーよりも多い)
プロジェクトをダウンロード
$ git clone https://github.com/google/honggfuzz
コンパイルしてインストール
$ make
$ sudo make install
実用的な分析
テストデモは次のとおりです(aflと比較できます:クラシックFuzzerツールAFLファジーテストガイド)。ここでは、aflのインストルメンテーション関数を反映します。ブランチの深さで具体的にいくつか書いており、ブランチのオーバーフローでスタックオーバーフローが発生します
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
int main(int argc, char const *argv[])
{
if(argc != 2)
{
printf("null args!\n");
return -1;
}
/* Get file state */
struct stat fstat;
if(stat(argv[1], &fstat))
{
printf("Failed ^_^\n");
return -1;
}
/* Open file */
FILE * fd = NULL;
fd = open(argv[1], O_RDONLY);
if(fd == -1)
{
printf("open file failed!\n");
return -1;
}
/* Select */
char buf[15];
if(read(fd, buf, 2) == -1)
{
printf("read failed!");
return -1;
}
if(buf[0] == 'a' && buf[1] == 'b')
{
if(read(fd, buf, 4) != -1)
{
if(buf[2] == 's')
{
read(fd, buf, fstat.st_size - 6);
printf("%s\n", buf);
}
}
}
return 0;
}
上記のコードが最も深いところまで行くと、スタックオーバーフローが発生する可能性が非常に高くなります。ユーザが入力した最初の文字がa、2番目の文字がb、5番目の文字がsの場合、条件を満たす。私たちの目標は、フォーマットに準拠した1つのユースケースのみを提供することです(元のシード。ここでは、プログラムの実行を許可するテストケース、つまり文字列です)。ファズツールは自動的に変化して他のテストケースを生成し、コードが別のブランチに移動できるかどうかを調べます(ブルートフォースと同様)。
ソースコードの計測
hfuzz-clang hfuzzDemo.c -o hfuzzDemo
各ifステートメントは各条件付きブランチを表し、IDAの逆アセンブリウィンドウに表示されるのは基本ブロックです。ifステートメントは新しいブランチです。以下に示すように、hfuz-clangを使用して逆アセンブリコードをコンパイルします。各ifステートメントでは、自動的にインストルメントされています。これ_sanitizer_cov_trace_const
は、汚染を記録するために使用されるインストルメンテーション関数です。これはLLVMコンパイラに付属する最適化オプションであり、コードカバレッジを大まかに計算できます。
コーパスを生成する
ディレクトリに新しいファイルを作成し、ディレクトリに新しいファイルを作成し、シードを書き込みます。ミューテーションアルゴリズムは、このシードミューテーションに基づいてさまざまなテストケースを生成し、プログラムにフィードします。たとえば、次の情報を書きます(コードに従って、最初の文字がa、2番目の文字の場合)。文字はb、5番目の文字はs、オーバーフローが発生する可能性があります)
hello world
ファジングを開始
honggfuzz -e txt -u -z -Q -i ./in -W ./result -- ./hgfuzzDemo ___FILE___
パラメータ分析
- eはテストケースの拡張を指定します
- uすべてのテストケースを保存する
- zソースコードのインストルメンテーション
- Qテスト中のプログラムの出力を印刷します
- iコーパス、つまり、元のテストケースであるシード
- W作業ディレクトリ
--
テスト中のプログラムからhonggfuzzを分離する___FILE___
テスト中のプログラムのパラメーターは、AFLの@@のように、ファイル名ではなくプレースホルダーを使用します。
スクリーンショットを実行
結果分析
含め、結果ディレクトリの結果を格納するHONGGFUZZ.REPORT.TXT
だけでなく、このようなクラッシュテストケースということ
Q&Aの問題
質問1:
linux/bfd.c:28:10: fatal error: bfd.h: No such file or directory
#include <bfd.h>
^~~~~~~
compilation terminated.
Makefile:259: recipe for target 'linux/bfd.o' failed
make: *** [linux/bfd.o] Error 1
これは、 binutils-dev
apt-get install binutils-dev
質問2:
linux/unwind.c:27:10: fatal error: libunwind-ptrace.h: No such file or directory
#include <libunwind-ptrace.h>
^~~~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:259: recipe for target 'linux/unwind.o' failed
make: *** [linux/unwind.o] Error 1
次のエラーが表示された場合、これは libunwind-dev
apt-get install libunwind-dev
質問3:
Ubuntu 18.0.4がクラッシュするため、テスト環境はKaliです
まとめ
従来のファズツールと比較して、honggfuzzの最大の利点は、ファジングが非常に高速であることです。マルチスレッド化とマルチプロセスの利点により、honggfuzzはCPUリソースを完全に利用し、クラッシュテストケースの発見率を大幅に向上できます。ここでは、我々が使用例、および作者の古典的なFuzzer AFLファジングツールガイドの言及の例では、しかし、同じです
ここで私は非常にカジュアルなコーパスhello worldを使用してすぐにクラッシュを発見しました。前述のaflと比較して、著者はプログラムクラッシュのテストケース *に非常に類似したテストケースを、元のコーパスとして故意にセットアップしましたが、時間がかかりましたクラッシュのみが見つかりました*。したがって、honggfuzzの効率は明らかです。