/guard (制御フロー ガードを有効にする)

制御フロー ガードのセキュリティ チェックのコンパイラ生成を有効にします。

構文

/guard:cf
/guard:cf-

解説

/guard:cf オプションを指定すると、コンパイラはコンパイル時に間接呼び出し先の制御フローを分析し、実行時にターゲットを検証するコードを挿入します。 既定では、/guard:cf は無効になっており、明示的に有効にする必要があります。 このオプションを明示的に無効にするには、/guard:cf- を使用します。

Visual Studio 2017 以降: このオプションにより、ジャンプ テーブルを生成する switch ステートメントにガードが追加されます。

/guard:cf制御フロー ガード (CFG) オプションを指定すると、コンパイラとリンカーは、コードの侵害の試行を検出するために追加のランタイム セキュリティ チェックを挿入します。 コンパイルとリンク中に、コードのすべての間接的な呼び出しが分析され、コードを正常に実行したときに到達可能なすべての場所が検索されます。 この情報は、バイナリのヘッダーの追加の構造に格納されます。 また、コンパイラは、コード内の間接的な各呼び出しの前に、ターゲットが検証済みの場所のいずれかにあることを確認するチェックを挿入します。 CFG 対応オペレーティング システム上の実行時にチェックに失敗した場合、オペレーティング システムはプログラムを閉じます。

ソフトウェアに対する一般的な攻撃は、極端なまたは予期しない入力の処理のバグを利用します。 アプリケーションに対する入念に作成された入力が、実行可能コードへのポインターを含む場所を上書きする能性があります。 この手法を使用して、攻撃者によって制御されるコードに制御フローをリダイレクトできます。 CFG ランタイム チェックでは、実行可能ファイルのデータ破損のバグは修正されません。 代わりに、攻撃者がそれらを使用して、任意のコードを実行することを難しくします。 CFG は、コード内の関数のエントリ ポイント以外の場所への呼び出しを防止する対応策ツールです。 これは、データ実行防止 (DEP)、 /GS スタック チェック、 /DYNAMICBASE/HIGHENTROPYVA アドレス空間レイアウトランダム化 (ASLR) によって、コードが悪用ベクトルになる可能性が低くなるのと似ています。

CFG エクスプロイト軽減手法を使用するコードをビルドするには、 /guard:cf オプションをコンパイラとリンカーの両方に渡す必要があります。 1 つの cl コマンドを使用してバイナリが作成されている場合、コンパイラはリンカーにオプションを渡します。 コンパイルとリンクを分けて実行する場合は、コンパイラとリンカーの両方のコマンドで、オプションを設定する必要があります。 /DYNAMICBASE リンカー オプションも必要です。 バイナリが CFG データを持っていることを確認するには、 dumpbin /headers /loadconfig コマンドを使用します。 CFG が有効なバイナリが EXE または DLL の特性のリストに Guard を持っている場合、ガード フラグに CF InstrumentedFID table presentを使用します。

/guard:cf オプションは、/ZI (デバッグ情報の編集と続行) または/clr (共通言語ランタイム コンパイル) と互換性がありません。

/guard:cfを使用してコンパイルされたコードは、オプションを使用してコンパイルされないライブラリおよびオブジェクト ファイルにリンクできます。 このコードのみが、 /guard:cf オプションを使用してリンクし、CFG 対応オペレーティング システムで実行する場合、CFG 保護を備えています。 オプションなしでコンパイルされたコードは攻撃を停止しないため、コンパイルするすべてのコードでこのオプションを使用することをお勧めします。 CFG チェックの実行時コストは小さくなりますが、コンパイラ分析では、安全であることが証明できる間接ジャンプのチェックを最適化しようとします。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「コンパイラとビルドのプロパティを設定する」をご覧ください。

  2. [構成プロパティ]>[C/C++]>[コード生成] プロパティ ページを選択します。

  3. [制御フロー ガード] プロパティを選択します。

  4. ドロップダウン コントロールで、制御フロー ガードを有効にするには [はい] を選択し、無効にするには [いいえ] を選択します。

関連項目

MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文