Control Flow Guard

提供: セキュリティ
移動: 案内検索
スポンサーリンク

WindowsEnhanced Mitigation Experience Toolkit 5.2 (EMET) は、Control Flow Guard (CFG)に対応しました。CFG は、「関数が信頼されたアドレスから呼び出されているか」をチェックする機能を提供します。

読み方

Control Flow Guard
こんとろーる ふろぅ がーど
CFG
しーえふじー

概要

Control Flow Guardは、「関数が信頼されたアドレスから呼び出されているか」をチェックします。コンパイラがバイナリに情報を埋め込んでおくことで、コードのハイジャックの検出と阻止が可能になります。

  1. コンパイル時にレジスタやメモリに格納されたアドレスを呼び出すコードを探します。
  2. 間接呼び出し(indirect call)の前に CFG 用の呼び出し先アドレス検査関数を挿入します。
  3. 検査関数は、プログラムのリンク時に作成される「間接呼び出しされる関数一覧」(CFG Function Table)に「呼び出し先アドレス」が存在するかチェックし、エラーの場合には、セキュリティ例外を発生し、プログラムを停止し、レポーティングします。

Windowsのランタイム ntdll が 検査関数と「間接呼び出しされる関数一覧」の管理を担当します。


リンカは、PE/COFFヘッダに 間接呼び出しされる関数一覧や loadconfig 情報を格納します。

利用の条件

CFGを利用する条件は、以下の通りです。

  • Visual Studio 2015 で導入される新しいオプションを利用してコンパイルしていること。
  • CFG を有効化されたバイナリを Windows 8.1 / Windows 10で実行した場合に有効になります。

Visual Studio 2015 のオプション

Preview 版では、以下のオプションを使用します。

cl /d2guard4 test.cpp /link /guard:cf

CFGの防御範囲

  • CFG は、 call 命令のみを対象としています。

間接ジャンプ命令やreturn命令で制御を奪う攻撃は成立します。間接呼び出し関数は、どの call からでも呼び出し可能であるため、 code-reuse 攻撃には、限定的にしか対応できません。

関連項目




スポンサーリンク