Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

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

fuzzilli

JavaScriptエンジンファザー

リポジトリを見る
2.3k36617日前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に変換されます。中間言語はおおよそ次のようになります:

root@kitploit:~
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コードに簡単に変換できます:

root@kitploit:~
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コードに変換することもできます:

root@kitploit:~
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ベースのプロトコルでインスタンスを同期します。

この設計により、ファザーは1台のマシン上の多数のコアや、複数の異なるマシンにスケールできます。1つの親ノードにあまりにも多くのインスタンスがプログラムを送信するとすぐに過負荷になる可能性があるため、複数レベルのインスタンスを設定することが可能です。例えば、1つのルートインスタンス、ルートに接続された16の中間ノード、中間ノードに接続された256の「リーフ」インスタンスなどです。分散ファジングの詳細については、Cloud/ディレクトリを参照してください。

リソース

  • Offensive Con 2019で行われたFuzzilliに関するプレゼンテーション。
  • 初期実装が行われた修士論文。
  • Sensepostによる、Fuzzilliを使用してv8のバグを見つけたことに関するブログ記事。
  • Doyensecによる、Fuzzilliを使用したJerryScriptエンジンのファジングに関するブログ記事。
  • NDSS Symposium 2023の、Fuzzilliと他のファザーとの比較に関する論文。

バグショーケース

以下は、Fuzzilliの助けを借りて発見されたバグの一部のリストです。このリストには、影響を受けるソフトウェアの少なくともベータリリースに存在していたセキュリティ影響のあるバグのみを含めるべきです。Fuzzilliは開発中の継続的なファズテストによく使用されるため、Fuzzilliによって発見された多くの問題は、脆弱なコードがベータリリースに達する前に発見されることが多いため、このリストには含まれていません。ただし、Fuzzilliによって最近V8で発見されたすべての問題のリストはこちらにあります。

Fuzzilliによって発見されたバグを報告してくれたすべてのユーザーに感謝します!

WebKit/JavaScriptCore

  • Issue 185328: DFGコンパイラがNumberIsInteger操作に誤った出力レジスタを使用
  • CVE-2018-4299: performProxyCallが内部オブジェクトをスクリプトに漏洩
  • CVE-2018-4359: compileMathICが誤ったマシンコードを生成
  • CVE-2019-8518: LICMが境界チェックの前に配列アクセスを移動したため、FTL JITでOOBアクセスが発生
  • CVE-2019-8558: ダングリングWatchpointによるCodeBlockのUse-after-Free
  • CVE-2019-8611: AIRの最適化が誤ってレジスタへの代入を削除
  • CVE-2019-8623: DFG JITのループ不変コード移動(LICM)がスタック変数を未初期化のままにする
  • CVE-2019-8622: DFGのdoesGC()がStringObjectに対するHasIndexedProperty操作の動作について誤っている
  • CVE-2019-8671: DFG: ループ不変コード移動(LICM)がオブジェクトプロパティアクセスを保護せずに残す
  • CVE-2019-8672: ValueProfilesにおけるJSValueのUse-after-Free
  • CVE-2019-8678: JSCが一部のプロトタイプが変更されたときにhaveABadTime()を実行できず、型混乱が発生
  • CVE-2019-8685: JSPropertyNameEnumeratorが誤った構造体IDを使用
  • CVE-2019-8765: DFGコンパイル中のGetterSetter型混乱
  • CVE-2019-8820: 引数オブジェクト再構築時のベイルアウト中に型混乱が発生
  • CVE-2019-8844: ObjectAllocationSinkingPhaseが有効でなくなったアロケーションに対してヒントを挿入すべきではない
  • CVE-2020-3901: FTL JITコードにおけるGetterSetter型混乱(常に安全ではないLICMが原因)
  • CVE-2021-30851: 並行HashTableルックアップ中のロック欠落

Gecko/Spidermonkey

  • CVE-2018-12386: IonMonkeyのレジスタ割り当てバグが型混乱を引き起こす
  • CVE-2019-9791: IonMonkeyの型推論がOSR経由で入力されたコンストラクタに対して誤っている
  • CVE-2019-9792: IonMonkeyがJS_OPTIMIZED_OUTのマジック値をスクリプトに漏洩
  • CVE-2019-9816: ObjectGroupDispatch操作で予期しないObjectGroup
  • CVE-2019-9813: IonMonkeyコンパイルコードが推論されたプロパティ型の更新に失敗し、型混乱を引き起こす
  • CVE-2019-11707: IonMonkeyがArray.prototype.popの戻り値の型を誤って予測し、型混乱を引き起こす
  • CVE-2020-15656: IonMonkeyでの特別な引数に対する型混乱
  • CVE-2021-29982: 誤ったレジスタ割り当て(JIT-Pickerにより発見)
  • CVE-2021-29984: 予期しないGCとの組み合わせによる命令の並べ替えがメモリ破損を引き起こす可能性
  • CVE-2022-28285: MLoadTypedArrayElementHoleのエイリアスセットが寛容すぎる
  • CVE-2022-31745: 増分GCでのエラー
  • CVE-2022-42928: 一部のBigInt操作に対するKeepAlive注釈の欠落がメモリ破損を引き起こす可能性
  • CVE-2022-45406: JavaScript RealmのUse-after-Free
  • CVE-2023-4577: GCと正規表現の相互作用によるメモリ破損
  • CVE-2023-5171: コンパイル中にGCがUse-after-Free状態を引き起こした
  • CVE-2023-25735: コンパートメント不一致による潜在的Use-after-Free
  • CVE-2023-25751: JITコードの破損

Chromium/v8* Issue 939316: TurbofanがReflect.constructを最適化する際に、Mapポインタを範囲外で読み取る可能性がある

  • Issue 944062: JSCallReducer::ReduceArrayIndexOfIncludesがMapチェックを挿入しない
  • CVE-2019-5831: V8におけるマップ処理の不具合
  • Issue 944865: V8における無効な値表現
  • CVE-2019-5841: インライン化ヒューリスティックのバグ
  • CVE-2019-5847: V8のsealed/frozen要素がクラッシュを引き起こす
  • CVE-2019-5853: 正規表現の長さチェックにおけるメモリ破損
  • Issue 992914: マップマイグレーションが要素種類を尊重せず、型混乱を引き起こす
  • CVE-2020-6512: V8における型混乱
  • CVE-2020-16006: DescriptorArrayにおけるハッシュ衝突の不適切な処理によるメモリ破損
  • CVE-2021-37991: 並行JITコンパイル中の競合状態
  • Issue 1359937: BigIntの逆シリアル化により無効な-0n値が生成される可能性がある
  • Issue 1377775: TurbofanでArray.prototype.atをインライン化する際の誤った型チェック

Duktape

  • Issue 2323: putpropにおける不安定なvalstackポインタ
  • Issue 2320: 文字列ビルトインにおけるMemcmpポインタオーバーフロー

JerryScript

  • CVE-2020-13991: スプレッド引数の不適切な解放
  • Issue 3784: 不正なプロパティ列挙によるメモリ破損
  • CVE-2020-13623: Proxyオブジェクトのプロパティキーによるスタックオーバーフロー
  • CVE-2020-13649 (1): OOM時のエラー処理によるメモリ破損
  • CVE-2020-13649 (2): OOM時のエラー処理によるメモリ破損
  • CVE-2020-13622: Proxyオブジェクトのプロパティキーの不適切な処理によるメモリ破損
  • CVE-2020-14163: キー/値ペア追加時のガベージコレクションによって引き起こされる競合状態によるメモリ破損
  • Issue 3813: SerializeJSONProperty関数における誤ったエラー処理
  • Issue 3814: ecma_op_function_has_instanceアサーションにおける予期しないProxyオブジェクト
  • Issue 3836: 誤ったTypedArray初期化によるメモリ破損
  • Issue 3837: getOwnPropertyDescriptorにおける誤ったメモリ処理によるメモリ破損

Hermes

  • CVE-2020-1912: 遅延コンパイルされた内部ジェネレータ関数の実行時に発生するメモリ破損
  • CVE-2020-1914: SaveGeneratorLong命令の処理におけるバイトコード破損

免責事項

これは公式にサポートされているGoogle製品ではありません。

ツールをダウンロード
  • CVE-2021-30818: DFG OSR Exit時の引数再構築における型混乱
  • CVE-2022-46696: JITコンパイルコード内の例外チェック欠落によるアサーション失敗
  • CVE-2022-46699: ICでの特殊プロパティの誤ったキャッシュによるアサーション失敗
  • CVE-2022-46700: Intl.Locale.prototype.hourCyclesが空のJSValueをスクリプトに漏洩
  • CVE-2025-43214: スタック反復中のJSToWasmEntryでのメモリ破損
  • CVE-2025-43213: NewRegExpUntyped操作の型付けの誤り
  • CVE-2023-29535: 弱参照マップのGC中のメモリ破損
  • CVE-2023-29543: Debugger内のメモリ破損
  • CVE-2023-29544: 並行マーキング中のメモリ破損
  • CVE-2023-29549: 誤ったレルムに割り当てられたオブジェクト
  • CVE-2024-0744: JITコンパイルコードがワイルドポインタ値を逆参照する可能性があった
  • CVE-2024-3854: JITがswitch文を誤って最適化し、範囲外読み取りを行うコードを生成
  • CVE-2024-3855: JITがMSubstr操作を誤って最適化し、範囲外読み取りを引き起こした
  • CVE-2024-3857: JITが誤ったコードを生成し、ガベージコレクション中にUse-after-Freeを引き起こした
  • CVE-2024-3858: GCトレース中にJavaScriptオブジェクトを変異させるとJITコードがクラッシュする
  • CVE-2024-6613: WASMスタックフレームの誤ったリスト表示
  • CVE-2024-6614: WASMスタックフレームの誤ったリスト表示
  • CVE-2024-7521: 不完全なWebAssembly例外処理
  • CVE-2024-7652: AsyncGeneratorPrototype仕様のバグ
  • CVE-2024-8381: "with"ブロック内でのプロパティ名検索時の型混乱
  • CVE-2024-9396: 特定のオブジェクトのクローン作成時にメモリ破損が発生する可能性
  • CVE-2025-0240: JavaScript JSONモジュール解析時のコンパートメント不一致
  • CVE-2025-0241: JavaScriptテキストセグメンテーション使用時のメモリ破損
  • CVE-2025-1012: 並行遅延化中のUse-after-Free
  • CVE-2025-1934: RegExpベイルアウト処理中の予期しないGC