[論文レビュー] Building Fast Fuzzers
本論文では、関数型プログラミングおよび仮想マシン実装の最適化技術を応用することで、Dharma などの既存の文法ベースのファズァーと比較して最大300倍高速な、高性能な文法ファズァー F1 を提示する。文法生成を関数型プログラムとしてモデル化し、それを独自の仮想マシンにコンパイルすることで、100 MB/s を超えるスループットを達成し、ランダムファズァーでさえも上回る。同時に、構文的に有効な入力を保証する。
Fuzzing is one of the key techniques for evaluating the robustness of programs against attacks. Fuzzing has to be effective in producing inputs that cover functionality and find vulnerabilities. But it also has to be efficient in producing such inputs quickly. Random fuzzers are very efficient, as they can quickly generate random inputs; but they are not very effective, as the large majority of inputs generated is syntactically invalid. Grammar-based fuzzers make use of a grammar (or another model for the input language) to produce syntactically correct inputs, and thus can quickly cover input space and associated functionality. Existing grammar-based fuzzers are surprisingly inefficient, though: Even the fastest grammar fuzzer Dharma still produces inputs about a thousand times slower than the fastest random fuzzer. So far, one can have an effective or an efficient fuzzer, but not both. In this paper, we describe how to build fast grammar fuzzers from the ground up, treating the problem of fuzzing from a programming language implementation perspective. Starting with a Python textbook approach, we adopt and adapt optimization techniques from functional programming and virtual machine implementation techniques together with other novel domain-specific optimizations in a step-by-step fashion. In our F1 prototype fuzzer, these improve production speed by a factor of 100--300 over the fastest grammar fuzzer Dharma. As F1 is even 5--8 times faster than a lexical random fuzzer, we can find bugs faster and test with much larger valid inputs than previously possible.
研究の動機と目的
- 文法ベースのファジングにおける重要な性能ボトルネックに対処する。既存のツールは、より高い有効性を示す一方で、ランダムファズァーと比較して数個のオーダーも遅く、性能に著しい劣化がある。
- 関数型プログラミングの最適化技術と仮想マシンコンパイル技術を組み合わせることで、高速かつ効果的なファジングを実現し、文法ベースの入力生成を加速する。
- 文法に依存する入力による有効性と、高速な生成による効率性のギャップを埋め、大規模かつ性能に敏感なテストにおいて文法ファジングを実用的なものにする。
- システムプログラミングの視点から実装スタックを再考することで、文法ベースのファジングが、純粋なランダムファジングと同等、あるいはそれ以上の速度で実行可能であることを実証する。
提案手法
- 文法ベースの入力生成を純粋な関数型プログラムとしてモデル化し、デファンクショナライゼーションやスーパーコンパイルなどの関数型プログラミング最適化を適用可能にする。
- 文法ファズァーを、直接実行およびコンテキストスレッド実行を併用する独自の仮想マシン(VM)にコンパイルすることで、インタプリタのオーバーヘッドを低減する。
- 乱数ストリームをVMのオペコード列として扱い、ファズァーの挙動とパス探索を決定論的かつ合成可能に制御する。
- メモ化や早期終了といった分野特化最適化を適用し、文法展開中の重複計算を削減する。
- 二段階のコンパイルパイプラインを採用する:まず、文法を関数型中間表現に変換し、次に最適化されたVMコードにコンパイルすることで、高速実行を実現する。
- 生成されたVMコードに対してスーパーオプティマイゼーション技術を適用し、命令数をさらに削減し、実行時パフォーマンスを向上させるが、これは今後の課題として残す。
実験結果
リサーチクエスチョン
- RQ1文法ベースのファジングは、構文的整合性を保ちながら、ランダムファジングと同等の性能を達成できるか?
- RQ2関数型プログラミングおよび仮想マシン実装の最適化技術は、文法ベースファズァー生成の速度をどの程度向上できるか?
- RQ3文法ファズァーを関数型プログラムとして再設計し、仮想マシンにコンパイルすることで、高いスループットを達成できるか?
- RQ4ファジングにおいて乱数ストリームをドメイン特化仮想マシンのオペコードとして扱うことで、どの程度のパフォーマンス向上が可能か?
- RQ5関数型プログラミングの抽象化とVMコンパイルの組み合わせにより、文法ファズァーとランダムファズァーの間の性能ギャップを埋められるか?
主な発見
- F1 は、最も高速な既存の文法ファズァーである Dharma と比較して、100~300倍の高速化を達成し、高性能な文法ファジングが実現可能であることを示した。
- F1 は 100 MB/s 以上の速度で入力を生成しており、これは表層的ランダムファズァーの5~8倍速く、構文的に有効な入力を生成するファズァーとして、現在知られている中で最も高速である。
- 文法に依存する生成の追加の複雑さにもかかわらず、F1 の性能はランダムファズァーを上回っており、効率性と有効性が互いに排他的ではないことを証明した。
- デファンクショナライゼーションやスーパーコンパイルといった関数型プログラミング技術の使用により、静的解析とコード変換によって顕著なパフォーマンス向上が達成された。
- 仮想マシン抽象化により、効率的な実行が可能になり、スーパーオプティマイゼーションによるさらなる最適化の道が開かれた。生成されたVMコードに対して、スーパーオプティマイゼーションが非常に適していることが示された。
- システム全体が自己完結型の Jupyter ノートブックとして実装されており、今後の研究やツール開発のための完全な再現可能性と拡張性を確保している。
より良い研究を、今すぐ始めましょう
論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。
クレジットカード登録不要
このレビューはAIが作成し、人間の編集者が確認しました。