Share via


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

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

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

ここでは、Visual C++ コンパイラおよびリンカーに組み込まれているセキュリティ機能について説明します。

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

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

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

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

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

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

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

SafeInt ライブラリ

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

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

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

チェックを行う反復子

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

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

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

  • ライブラリ デザイン

  • ローカリゼーション

  • 名前付け規則

  • パフォーマンス

  • セキュリティ

マネージ コードのコード分析は、Visual Studio アプリケーション ライフサイクル管理 に含まれています。また、https://www.gotdotnet.com/team/fxcop/ からダウンロードすることもできます。

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

Application Compatibility Toolkit の一部として使用できるApplication Verifier (AppVerifier) は、開発者がアプリケーションの互換性、安定性、および潜在的なセキュリティ上の問題を特定するためのツールです。

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

検証ツールを使用して、次の手順を実行することができます。

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

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

  • アプリケーションが、Windows 7 ソフトウェア ロゴ プログラム、Windows Server 2008 R2 ロゴ プログラムなど、現在のロゴ プログラムの要件に準拠しているかどうかをテストします。

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

Windows Application Compatibility Toolkit は、TechNet Web サイトの「アプリケーションの互換性」ページで入手できます。

.NET Framework のセキュリティ機能

セキュリティ ポリシーの設定」で、.NET Framework セキュリティ ポリシーを調整するためのガイドラインおよびツールについて説明しています。

Windows ユーザー アカウント

Administrators グループに属する Windows ユーザー アカウントを使用すると、開発者とユーザー (機能拡張により) がセキュリティ上の危険にさらされます。 詳細については、「ユーザー グループのメンバーとしての実行」を参照してください。

Windows Vista でユーザー アカウント制御 (UAC: User Account Control) を使用してセキュリティを向上させる

ユーザー アカウント制御 (UAC: User Account Control) は、限られた特権をユーザー アカウントに付与する Windows Vista の機能です。 詳細については、「ユーザー アカウント制御 (UAC: User Account Control) がアプリケーションに与える影響」を参照してください。

参照

参照

System.Security

概念

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

その他の技術情報

アプリケーションの保護