C++ のセキュリティ推奨事項

ここでは、セキュリティ ツールおよびセキュリティ対策について説明します。 これらを使用しても、アプリケーションを攻撃から完全に防御できるわけではありませんが、攻撃が成功する可能性を低減できます。

Visual C++ セキュリティ機能

Microsoft C++ コンパイラおよびリンカーには、次のセキュリティ機能が組み込まれています。

/guard (制御フロー ガードを有効にする)
コンパイラは、コンパイル時に間接的な呼び出しのターゲットに関する制御フローを分析し、実行時に、ターゲットを確認するコードを挿入します。

/GS (バッファーのセキュリティ チェック)
利用される危険性がある関数に、オーバーラン検出コードがコンパイラによって挿入されます。 オーバーランが検出されると、実行が停止します。 このオプションの既定値はオンです。

/SAFESEH (安全な例外ハンドラーを含むイメージ)
各例外ハンドラーのアドレスを格納したテーブルが、リンカーによって出力イメージに含められます。 実行時に、オペレーティング システムはこのテーブルを使用して適切な例外ハンドラーのみが実行されるようにします。 これにより、実行時に悪意のある攻撃を受けて例外ハンドラーが実行されることを回避できます。 既定では、このオプションはオフになっています。

/NXCOMPAT, /NXCOMPAT (データ実行防止との互換性) これらのコンパイラ オプションとリンカー オプションを使用すると、データ実行防止 (DEP: Data Execution Prevention) との互換性を有効にできます。 DEP は、CPU で非コード ページが実行されないようにします。

/analyze (コード分析)
このコンパイラ オプションを使用すると、潜在的なセキュリティ上の問題 (バッファー オーバーラン、非初期化メモリ、null ポインターの逆参照、メモリ リークなど) を報告するコード解析がアクティブになります。 既定では、このオプションはオフになっています。 詳細については、「C/C++ のコード分析の概要」を参照してください。

/DYNAMICBASE (アドレス空間配置のランダム化を使用)
このリンカー オプションにより、実行開始時にメモリ内の個別の場所で読み込むことができる実行可能イメージをビルドできます。 また、このオプションを使用すると、メモリ内のスタックの位置を予測することが非常に難しくなります。

セキュリティが拡張された CRT

C ランタイム ライブラリ (CRT) が強化され、セキュリティ上のリスクをもたらす関数 (チェックが適用されない文字列コピー関数 strcpy など) の安全なバージョンが導入されました。 このようなセキュリティが万全ではない以前の関数は非推奨とされるため、これらの関数を使用すると、コンパイル時に警告が表示されます。 コンパイル時に警告が表示されないようにするのではなく、これらの CRT 関数の安全なバージョンを使用することをお勧めします。 詳細については、「CRT のセキュリティ機能」を参照してください。

SafeInt ライブラリ

SafeInt ライブラリを利用することで、アプリケーションで算術演算を実行するときに、整数オーバーフローおよびその他の攻撃に利用される可能性のあるエラーが発生するのを防止できます。 SafeInt ライブラリには、SafeInt クラスSafeIntException クラス、および複数の SafeInt 関数が含まれます。

SafeInt クラスを使用することで、整数オーバーフローおよびゼロ除算による攻撃を防止できます。 型が異なる値の比較を処理するために使用できます。 2 種類のエラー処理ポリシーが用意されています。 SafeInt クラスの既定のポリシーは、SafeIntException クラス例外をスローして、数値演算を完了できない理由を報告することです。 SafeInt クラスの 2 番目のポリシーは、プログラムの実行を停止することです。 カスタム ポリシーも定義できます。

SafeInt 関数は、対応する 1 つの数値演算で、攻撃に利用される可能性のあるエラーが発生しないようにします。 種類の異なる 2 つのパラメーターを使用できます。これらを同じ型に変換する必要はありません。 複数の数値演算を保護するには、SafeInt クラスを使用します。

Checked Iterators

チェックを行う反復子は、コンテナー境界を強制します。 既定では、チェックを行う反復子が境界の外側にあると、例外が生成され、プログラムの実行が終了します。 チェックを行う反復子は、_SECURE_SCL_THROWS_ITERATOR_DEBUG_LEVEL など、プリプロセッサ定義に割り当てられた値に基づき他のレベルの応答を提供します。 たとえば、_ITERATOR_DEBUG_LEVEL=2 の場合、チェックを行う反復子は、デバッグ モードで正確性を包括的にチェックします。この機能は、アサートを使用することで利用できます。 詳細については、Checked Iterators_ITERATOR_DEBUG_LEVEL を参照してください。

マネージド コードのコード分析

マネージド コードのコード分析は FxCop とも呼ばれ、.NET Framework デザイン ガイドラインに準拠するためにアセンブリをチェックします。 FxCop は各アセンブリ内のコードとメタデータを解析して、次の点に不備がないかどうかを検証します。

  • ライブラリ デザイン

  • ローカライズ

  • 名前付け規則

  • パフォーマンス

  • Security

Windows アプリケーション検証ツール

アプリケーション検証ツール (AppVerifier) は、アプリケーションの互換性、安定性、およびセキュリティ上の問題を特定するのに役立ちます。

AppVerifier は、アプリケーションがどのようにオペレーティング システムを使用するのかを監視します。 AppVerifier は、アプリケーションの実行中に、ファイル システム、レジストリ、メモリ、および API を監視し、AppVerifier がカバーしない問題については、ソース コードの修正を推奨します。

AppVerifier は、次の用途で使用できます。

  • 一般的なプログラミング上の誤りが原因で発生する潜在的なアプリケーションの互換性エラーがないかどうかをテストします。

  • アプリケーションにメモリ関連の問題がないかどうかを調べます。

  • アプリケーションの潜在的なセキュリティ上の問題を特定します。

Windows ユーザー アカウント

Administrators グループに属する Windows ユーザー アカウントを使用すると、開発者とユーザー (機能拡張により) がセキュリティ上の危険にさらされます。 詳細については、「Users グループのメンバーとしての実行」、および「ユーザー アカウント制御 (UAC: User Account Control) がアプリケーションに与える影響」を参照してください。

予測実行のサイド チャネルのガイダンス

C++ ソフトウェアの予測実行のサイド チャネル ハードウェアの脆弱性を特定して軽減する方法の詳細については、「予測実行のサイド チャネルの C++ 開発者向けガイダンス」を参照してください。

関連項目

System.Security
Security
ユーザー アカウント制御 (UAC: User Account Control) がアプリケーションに与える影響