脆弱性マイニングにフィードバック駆動のファザーツールHonggfuzzを使用する

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の効率は明らかです。

元の記事52件を公開 30のような 50,000以上の訪問

おすすめ

転載: blog.csdn.net/song_lee/article/details/105230099