今日の多くの悪用は、制御フローの整合性(CFI)によって防止できます。ただし、Heartbleedなどのデータのみの悪用、任意のデータ/キーの読み取りもあり、データフローの整合性(DFI)によって防止できます。
CFIとDFIはどのように相互依存しているのでしょうか。
DFIとCFIを持つことは理にかなっていますか?
番号。
DFIはCFIを意味しますか?
はい。制御フローのハイジャックは制御データの変更を意味し、DFIは制御に使用されているかどうかにかかわらず、データの整合性を保証します。
DFIしかない場合でも、制御フローグラフ(CFG)を変更するエクスプロイトを使用できますか?
いいえ、検出されます。
[〜#〜] dfi [〜#〜] は、実行時に監視されるデータフローにポリシーを適用します。これにより、コンパイル時に静的分析を介して生成されたデータフローグラフをプログラムが追跡する必要があります。プログラムの計測パスは、各読み取り命令の前にチェックを追加して、破損したデータを読み取らないようにします。
静的分析は 到達定義分析 を使用します。これは、変数を読み取る各読み取り命令、この変数を最後に定義した可能性のある命令のセットを提供するデータフロー分析です。
読み取り命令ごとに分析が実行され、変数を定義する書き込み命令ごとに一意の識別子が割り当てられます。
次に、計測パスは、各書き込み命令の前にチェックを追加して、書き込まれるアドレスとそのアドレスに値を書き込んだ最後の識別子をマッピングするテーブルを更新します。
さらに、インストルメンテーションは各読み取り命令の前にチェックを追加します。値を読み取っているアドレスにマップされた識別子をフェッチし、静的分析により、識別子が到達した定義のセットに含まれるようにします。
たとえば、攻撃者がスタック上の戻りアドレスを破壊した場合、それを破壊するために使用された書き込み命令は、その識別子でテーブルを更新しました。したがって、戻りアドレスの変更に使用された最後の識別子が許可された識別子のセットに含まれていないため、ret
命令の直前のインスツルメンテーションは破損に気づくでしょう。
これが、DFIが非制御データ攻撃と制御データ攻撃の両方を防止する理由です。また、冗長であるため、両方を使用しても意味がない理由についても説明します。