ファジングは、現在のウィキペディアの定義に従って、次のように定義されています。
ファジングまたはファジングテストは、コンピュータプログラムへの入力として無効なデータ、予期しないデータ、またはランダムなデータを提供することを含む自動ソフトウェアテスト手法です。その後、プログラムは、クラッシュ、組み込みコードのアサーションの失敗、潜在的なメモリリークなどの例外について監視されます。通常、ファザーは、構造化入力を受け取るプログラムをテストするために使用されます。
対照的に、シンボリック実行は次のように定義され、同じくウィキペディアから引き出されます。
コンピュータサイエンスでは、シンボリック実行(シンボリック評価も)は、プログラムを分析して、プログラムの各部分を実行させる入力を決定する手段です。インタプリタはプログラムに従い、プログラムの通常の実行のように実際の入力を取得するのではなく、入力のシンボリック値を仮定します。これは抽象的な解釈の場合です。
私が理解しようとしているのは、これら2つの方法の機能的な違いです。シンボリック実行によって「プログラムの各部分が実行される原因となる入力は何か」を決定する行が表示されるので、セキュリティ研究者が念頭に置いている「目標」によって各方法を区別できます。最近読んだ論文は、シンボリック実行とファジングを区別するもので、前者の方がオーバーヘッドがはるかに大きい/実行速度が遅いと述べています。
私の観点から、シンボリック実行は、特定のシンボリック値に明確に当たる「ターゲットファジング」の形式を利用します。また、シンボリックな実行は単に「より高度なファジング」であると言ったと聞いています。
誰かが2つの間の実際の違いは何か、なぜ、またはいつ私たちが他の方法よりも優先すべきかを明確にできますか?
誰かが2つの本当の違いは何であるのか、そしてなぜまたはいつ私たちが他の方法よりも優先すべきかを明確にできますか?
(動的)シンボリック実行はホワイトボックスファジングと呼ばれることもあります。たとえば、 [〜#〜] sage [〜#〜] を参照してください。ファジングはカテゴリにグループ化できます。
誰かが2つの本当の違いは何であるのか、そしてなぜまたはいつ私たちが他の方法よりも優先すべきかを明確にできますか?
次の条件を持つ入力x
を持つプログラムを考えてみましょう:if (x > 5 && x < 10) abort();
x
が整数であると仮定します。つまり、そのドメインは2です。32。エラーをトリガーする入力x
をランダムに生成する確率は4/2です32。この確率は、巧妙なグレーボックスファジングでは少し高くなりますが、一般的には、この種の状態を吸収します。
一方、ホワイトボックスファジングは、シンボルx = X
を使用してプログラムを実行し、制約ソルバーを使用します。 Z 、制約を解決します。 Z3は、ミリ秒またはナノ秒でX> 5∧X <10を解くことができます。
しかし、無料の昼食はありません。この力は高価です。
現在の最新技術はhybrid fuzzingであり、greyboxとwhiteboxの両方を組み合わせています。アイデアは、global searchとしてgreybox fuzzerを使用して、状態空間をすばやくサンプリングすることです。行き詰まった場合は、重量級のホワイトボックスをlocal searchとして使用します。これは、 Cyber Grand Challenge ですべてのチームが使用しているテクニックです。控えめなマシンで実行されているハイブリッドフザー QSym は、クラウドで実行されているグレーボックスファザーではGoogleが見つけられなかったCVEを発見しました。
誰かが2つの本当の違いは何であるのか、そしてなぜまたはいつ私たちが他の方法よりも優先すべきかを明確にできますか?
野球のバットのように、違いはそれを持っている人の目標にあります-バリー・ボンズはそれを通りの犯罪者とは異なる方法で使用します。
ファジングとシンボリック実行は、何かを学ぶためにプログラムに入力を供給しています。その意味では、それらはまったく同じものです。同じツールの多くを使用してどちらでも実行できます。
誰かがそれをファジングと呼ぶとき、彼らは多種多様な合成入力に集中しており、乱用される可能性のある方法で物事を壊す入力を見つけることを目標としています。有効な入力が有効に処理されていることを確認することは、ファジングをしている人にとって興味がないので、「無効な」入力により重点を置いています。
誰かがそれをシンボリック実行と呼ぶとき、彼らはより小さく、より一貫した合成入力のセットを持っている可能性があります。それらの多くは「有効な」入力であり、プログラムが期待どおりに動作することを確認します。それらのいくつかは「無効な」入力であり、プログラムが失敗することなくそれらを処理したことを確認します。
ファジングは、プログラムが壊れる方法を見つけるために使用されます(利用するため、または修正するため)。
シンボリック実行は、プログラムの正確さを保証するために使用されます-プログラムが同じ入力を処理する方法を測定し、パフォーマンス/安定性が時間の経過とともに悪化するのではなく、改善することを確認します。