Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
fuzzilli — JavaScriptエンジンファザー | Kitploit
ツール/GitHubGitHub/googleprojectzero/fuzzilli
脆弱性分析ファジングバイナリ解析論文と研究学習と教育
GitHubgoogleprojectzero/fuzzilli

fuzzilli

JavaScriptエンジンファザー

リポジトリを見る
2.3k366836日前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Fuzzilli

動的言語インタプリタのための(カバレッジガイド付き)ファザーで、カスタム中間言語("FuzzIL")に基づいており、これを変異させてJavaScriptに変換できます。

使用法

このファザーを使用する基本的な手順は次のとおりです:

  1. サポートされているJavaScriptエンジンのソースコードをダウンロードします。サポートされているJavaScriptエンジンの一覧については、Targets/ディレクトリを参照してください。
  2. ターゲットのディレクトリから対応するパッチを適用します。そのディレクトリのREADME.mdも参照してください。
  3. READMEの説明に従って、カバレッジ計測を含めてエンジンをコンパイルします(clang >= 4.0が必要)。
  4. ファザーをコンパイル: swift build [-c release]。
  5. ファザーを実行: swift run [-c release] FuzzilliCli --profile=<profile> [other cli options] /path/to/jsshell。swift run FuzzilliCli --helpも参照してください。

Docker内およびGoogle Compute Engine上でのFuzzilliとサポートされているJavaScriptエンジンのビルドと実行もサポートされています。

改造

main.swiftをチェックして、Fuzzilliライブラリの使用例を確認し、さまざまな設定オプションを試してみてください。次に、Fuzzer.swiftを見て、高レベルのファジングロジックを理解してください。そこから、興味のある部分に飛び込んでください。

このプロジェクトへのパッチ、追加、その他のコントリビューションを大歓迎します!ただし、コントリビューター向け注意事項をひと通り確認してください。FuzzilliはおおよそGoogleのSwiftコードスタイルガイドに従っています。

このプロジェクトの助けを借りて発見された脆弱性について、[email protected]に簡単なメモ(できればCVE番号を含めて)を送っていただくか、プルリクエストを開いていただけると、バグショーケースセクションに含めることができ、大変ありがたく思います。それ以外にも、脆弱性に対するバグ報奨金やCVEクレジットなどを申請していただいてももちろん構いません:)

コンセプト

JITコンパイラなどのコアインタプリタのバグをファジングする場合、生成されたプログラムの意味的正確性が問題になります。これは、ランタイムAPIのファジングなど他のほとんどのシナリオとは対照的で、その場合は生成されたコードをtry-catch構文でラップすることで意味的正確性を簡単に回避できます。意味的に正しいサンプルを許容可能な割合で生成するにはいくつかの方法があり、その1つがコーパス内の全サンプルが意味的にも有効である変異的アプローチです。その場合、各変異によって有効なサンプルが無効になる可能性は低くなります。

変異ベースのJavaScriptファザーを実装するには、JavaScriptコードに対する変異を定義する必要があります。プログラムのASTや他の構文要素を変異させる代わりに、カスタム中間言語(IL)を定義し、その上でプログラムの制御フローやデータフローに対する変異をより直接的に実行します。このILは後で実行のためにJavaScriptに変換されます。中間言語はおおよそ次のようになります:

v0 <− LoadInteger '0'
v1 <− LoadInteger '10'
v2 <− LoadInteger '1'
v3 <− LoadInteger '0'
BeginFor v0, '<', v1, '+', v2 −> v4
   v6 <− BinaryOperation v3, '+', v4
   Reassign v3, v6
EndFor
v7 <− LoadString 'Result: '
v8 <− BinaryOperation v7, '+', v3
v9 <− LoadGlobal 'console'
v10 <− CallMethod v9, 'log', [v8]

これは例えば、次のJavaScriptコードに簡単に変換できます:

const v0 = 0;
const v1 = 10;
const v2 = 1;
let v3 = 0;
for (let v4 = v0; v4 < v1; v4 = v4 + v2) {
    const v6 = v3 + v4;
    v3 = v6;
}
const v7 = "Result: ";
const v8 = v7 + v3;
const v9 = console;
const v10 = v9.log(v8);

または、中間式をインライン化して次のJavaScriptコードに変換することもできます:

let v3 = 0;
for (let v4 = 0; v4 < 10; v4++) {
    v3 = v3 + v4;
}
console.log("Result: " + v3);

FuzzILにはいくつかの特性があります:

  • FuzzILプログラムは単に命令のリストです。
  • FuzzIL命令は、入力変数と出力変数、場合によっては1つ以上のパラメータ(上記の表記では一重引用符で囲まれています)を持つ操作です。
  • 命令への入力は常に変数であり、即値はありません。
  • 命令の出力はすべて新しい変数であり、既存の変数はReassign命令などの専用操作を通じてのみ再代入できます。
  • すべての変数は使用前に定義されます。

これらのプログラムに対していくつかの変異を実行できます:

  • InputMutator: 命令の入力変数を別のものに置き換えて、プログラムのデータフローを変異させます。
  • CodeGenMutator: コードを生成し、それを変異プログラム内のどこかに挿入します。コードは、コードジェネレータを実行するか、コーパス内の別のプログラムからいくつかの命令をコピー(スプライシング)することで生成されます。
  • CombineMutator: コーパスからプログラムを取得し、変異プログラム内のランダムな位置に挿入します。
  • OperationMutator: 操作のパラメータを変異させます。例えば、整数定数を別のものに置き換えます。
  • など...

Fuzzilliの動作に関するより詳細な議論はこちらにあります。

実装

ファザーはSwiftで実装されており、一部の部分(カバレッジ計測、ソケット通信など)はCで実装されています。

アーキテクチャ

ファザーインスタンス(Fuzzer.swiftに実装)は、以下の中心的なコンポーネントで構成されています:

  • MutationFuzzer: 変異を適用して既存のプログラムから新しいプログラムを生成します。その後、生成されたサンプルを実行し評価します。
  • ScriptRunner: ターゲット言語のプログラムを実行します。
  • Corpus: 興味深いサンプルを保存し、コアファザーに提供します。
  • Environment: ランタイム環境の知識を持ちます。例えば、利用可能な組み込みオブジェクト、プロパティ名、メソッドなど。
  • Minimizer: クラッシュするプログラムや興味深いプログラムを最小化します。
  • Evaluator: サンプルが何らかの指標(例:コードカバレッジ)に従って興味深いかどうかを評価します。
  • Lifter: FuzzILプログラムをターゲット言語(JavaScript)に変換します。

さらに、オプションでいくつかのモジュールが利用可能です:

  • Statistics: さまざまな統計情報を収集します。
  • NetworkSync: ネットワーク経由で複数のインスタンスを同期します。
  • ThreadSync: 同じプロセス内で複数のインスタンスを同期します。
  • Storage: クラッシュするプログラムをディスクに保存します。

ファザーはイベント駆動型で、異なるクラス間のほとんどのやり取りはイベントを通じて行われます。イベントは、例えばクラッシュや興味深いプログラムの発見、新しいプログラムの実行、ログメッセージの生成などの結果としてディスパッチされます。イベントの完全なリストはEvents.swiftを参照してください。イベントメカニズムはファザーのさまざまなコンポーネントを効果的に疎結合し、追加のモジュールを簡単に実装できるようにします。

FuzzILプログラムはProgramBuilderインスタンスを使用して構築できます。ProgramBuilderは、新しい命令の作成と追加、別のプログラムからの命令の追加、既存の変数の取得、現在位置での実行コンテキストの照会(例:ループ内かどうか)などのメソッドを提供します。

実行

FuzzilliはREPRL (read-eval-print-reset-loop)と呼ばれるカスタム実行モードを使用します。そのために、ターゲットエンジンはパイプや共有メモリを介してスクリプト入力を受け入れ、実行し、内部状態をリセットして次のスクリプトを待つように変更されます。これにより、プロセス生成のオーバーヘッドと、大部分のエンジン初期化のオーバーヘッドが除去されます。

スケーラビリティ

ターゲットプロセスごとに1つのFuzzerインスタンスがあります。これにより、プログラムの同期実行が可能になり、連続変異や最小化などのさまざまなアルゴリズムの実装が簡素化されます。さらに、コーパスなどの内部状態へのスレッドセーフなアクセスを実装する必要がなくなります。各ファザーインスタンスは独自のDispatchQueueを持ち、概念的には1つのスレッドに対応します。経験則として、Fuzzerインスタンスとのすべてのやり取りは、そのインスタンスのディスパッチキュー上で行われなければなりません。これにより、キューがシリアルであるためスレッドセーフが保証されます。詳細はドキュメントを参照してください。

スケールするために、ファザーインスタンスはツリー階層を形成でき、その場合、新しく見つかった興味深いサンプルやクラッシュを親ノードに報告します。親ノードはそのコーパスを子ノードと同期します。ツリー内のノード間の通信はさまざまな方法で行われ、それぞれモジュールとして実装されています:

  • スレッド間通信: 他のファザーのDispatchQueueにタスクをエンキューすることで、同じプロセス内のインスタンスを同期します。
  • マシン間通信: シンプルなTCPベースのプロトコルでインスタンスを同期します。
ツールをダウンロード