syzkaller - カバレッジガイド付きカーネル ファザー チートシート
syzkallerはGoogleの監視されていない、カバレッジガイド付きカーネル ファザーです。宣言型言語(syzlang)で記述されたシーケンスのsyscallを生成し、VM内で実行し、カーネル カバレッジ(KCOV)を使用して変異をコード未検査に操舵し、カーネル サニタイザーを介してクラッシュを検出します。入力なしで継続的に実行し、数千のLinuxカーネル バグを検出した—syzbot連続ファジング システムはそれに構築されています。また、BSD、Fuchsia、Windowsを含む他のカーネルもサポートします。
ファジングはデザインでカーネルをクラッシュさせます。常に使い捨てVM内で実行し、気にかけるマシンでは決して実行しないでください。
前提条件
| Requirement | Note |
|---|
| Go toolchain | syzkallerをビルド |
| Kernel source | KCOV、KASAN、デバッグ情報でビルド |
| VM support | QEMU/KVM、GCE、またはフィジカル ボード |
| Disk image | ゲスト用の最小ルートfs |
ビルド
git clone https://github.com/google/syzkaller
cd syzkaller && make
| Binary | Role |
|---|
syz-manager | VM、コーパス、レポートを オーケストレーション |
syz-fuzzer | ゲスト内で実行、プログラム生成 |
syz-executor | ゲスト内で syscall プログラムを実行 |
syz-repro | クラッシュを再ジューサーに最小化 |
syz-prog2c | syzプログラムをCに変換 |
必須カーネル設定
| Option | Purpose |
|---|
CONFIG_KCOV=y | カバレッジ フィードバック(エッセンシャル) |
CONFIG_KASAN=y | メモリー エラー検出 |
CONFIG_DEBUG_INFO=y | シンボル化レポート |
CONFIG_KASAN_INLINE=y | より高速なKASAN |
CONFIG_FAULT_INJECTION=y | エラー パス探索 |
CONFIG_DEBUG_KMEMLEAK=y | リーク検出(オプション) |
KCOVなしでファザーはブラインド—カバレッジ フィードバックはそれを有効ではなくランダムより使用します。
マネージャー設定
{
"target": "linux/amd64",
"http": "127.0.0.1:56741",
"workdir": "/home/user/syzkaller/workdir",
"kernel_obj": "/home/user/linux",
"image": "/home/user/image/bullseye.img",
"sshkey": "/home/user/image/bullseye.id_rsa",
"syzkaller": "/home/user/syzkaller",
"procs": 8,
"type": "qemu",
"vm": { "count": 4, "kernel": "/home/user/linux/arch/x86/boot/bzImage", "cpu": 2, "mem": 2048 }
}
./bin/syz-manager -config my.cfg
| Field | Purpose |
|---|
target | テスト下のOS/arch |
kernel_obj | カーネル ビルド ディレクトリー(シンボル化用) |
image / sshkey | ゲスト rootfs およびアクセス |
procs | VM当たり並列ファジング プロセス |
vm.count | 同時VM数 |
http | Web ダッシュボード アドレス |
Webダッシュボード
| View | Shows |
|---|
| Crashes | ユニーク クラッシュ タイトル +カウント |
| Corpus | カバレッジに寄与するプログラム |
| Coverage | 到達されるカーネル ファイル/ライン |
| Stats | Exec レート、VM ヘルス |
カバレッジは監視する数字です:プラトーの場合、ファザーは syscall 説明が到達できるものを枯渇してきました。
syzlang(Syscall説明)
# 簡略化された例:syscall の引数構造を説明
open(file ptr[in, filename], flags flags[open_flags], mode flags[open_mode]) fd
read(fd fd, buf buffer[out], count len[buf])
優れた説明はファザーが十分に有効なプログラムをビルドし、深いコード に到達することができます。sys/linux/*.txtを拡張して、テスト不足のサブシステムはしばしば最高値の貢献です。
クラッシュを再現
| Command | Purpose |
|---|
| Automatic | マネージャーは新しいクラッシュでsyz-reproを実行 |
syz-repro -config my.cfg crash.log | 手動で最小化 |
syz-prog2c -prog repro.syz | スタンドアロンC再ジューサーを発行 |
| C reproducer | バグ レポートに添付する内容 |
syzkaller対他のファザー
| Aspect | syzkaller | AFL++ | libFuzzer |
|---|
| Target | OSカーネル(syscall) | ユーザースペース バイナリー | インプロセス ライブラリー |
| Input | Syscallプログラム | ファイル/stdin | バイト バッファー |
| Feedback | KCOV | エッジ カバレッジ | SanitizerCoverage |
| Best for | カーネル バグ狩り | 一般的なバイナリー ファジング | ライブラリー API |
ユーザースペース ターゲット用にAFL++またはhonggfuzzを使用;syzkallerはカーネル syscall 境界向けに特別に構築されています。
リソース