私は最近、EJ Schwartz 博士による「Dynamic taint Analysis と Forward Symbolic Execution について知りたいことすべて (ただし、質問することを恐れていた可能性があります)」というタイトルの論文を読みました。論文では、彼は主にバイナリ レベルのセキュリティ コンテキストでのアプリケーションについて話しました。
動的汚染分析と前方シンボリック実行の正確な違いに興味があります。
私が見る限り、汚染分析は、x に格納されている情報がオブジェクト y に転送されるたびに、オブジェクト x(ソース) からオブジェクト y(シンク) への情報の流れを追跡します。したがって、主な関心事は、どのオブジェクトがソースによって推移的に影響を受ける可能性があるかということです。シンボリック実行では、一部の入力をシンボリック値として扱い、他の変数をシンボリック値で表現しようとします。それにより、シンボリック入力が後続のプログラムに影響を与える条件について答えます。
バイナリ レベルでは、リターン アドレスの上書きによって引き起こされる脆弱性とともに、テイント分析が頻繁に言及されていることがわかります。一方、シンボリック実行は、整数オーバーフロー、ランタイム アサーション エラー、リソース リーク(メモリ リーク、ファイルのオープン/クローズなど)、バッファ オーバーフローなど、より多くのタイプの脆弱な問題に対処できます。
しかし、最新の汚染分析にはデータ フロー分析だけが含まれているわけではないようです。それらのほとんどは、制御フローの状態を追跡します。また、いくつかの脆弱性検出シナリオでは、汚染された入力もシンボリック値として表され、シンボリック実行と同様に伝播されます。一方、シンボリック実行エンジンは、基礎となる制約ソルバーと実行/解釈ランタイムの制限により、異なるパス条件で区切られたシンボリック値を完全に使用することはできません。そのため、期待どおりの高い分岐またはパスカバレッジを実現できません。
では、一般的なケースでは、汚染分析は一種の粗いシンボリック実行であると言えますか、それともシンボリック実行は一種の正確な汚染分析であると言えますか?