バッファー オーバーランの回避
バッファー オーバーランは、セキュリティ リスクの最も一般的な原因の 1 つです。 バッファー オーバーランは、基本的に、オフになっている外部入力を信頼できるデータとして扱うことによって発生します。 CopyMemory、strcat、strcpy、wcscpy などの操作を使用してこのデータをコピーすると、予期しない結果が作成され、システムが破損する可能性があります。 最良のケースでは、アプリケーションはコア ダンプ、セグメント化エラー、またはアクセス違反で中止します。 最悪の場合、攻撃者はプロセス内で他の悪意のあるコードを導入して実行することで、バッファー オーバーランを悪用する可能性があります。 未チェックの入力データをスタック ベースのバッファーにコピーすることが、悪用可能なエラーの最も一般的な原因です。
バッファー オーバーランは、さまざまな方法で発生する可能性があります。 次の一覧では、いくつかの種類のバッファー オーバーランの状況について簡単に説明し、新しいリスクの作成を回避し、既存のリスクを軽減するために役立ついくつかのアイデアとリソースを提供します。
-
静的バッファー オーバーラン
-
静的バッファー オーバーランは、スタックで宣言されているバッファーが、保持するために割り当てられたデータよりも多くのデータで書き込まれる場合に発生します。 このエラーの見かけの少ないバージョンは、未確認のユーザー入力データが静的変数に直接コピーされ、スタックが破損する可能性がある場合に発生します。
-
ヒープ オーバーラン
-
ヒープ オーバーラン (静的バッファー オーバーランなど) は、メモリとスタックの破損につながる可能性があります。 ヒープ オーバーランはスタックではなくヒープ メモリで発生するため、深刻な問題を引き起こす可能性が低いと考える人もいます。ただし、ヒープ オーバーランには実際のプログラミングの注意が必要であり、静的バッファー オーバーランと同じようにシステム リスクを許容できます。
-
配列のインデックス作成エラー
-
配列インデックス作成エラーもメモリ オーバーランの原因です。 慎重な境界チェックとインデックス管理は、この種のメモリ オーバーランを防ぐのに役立ちます。
バッファー オーバーランの防止は、主に適切なコードを記述することです。 すべての入力を常に検証し、必要に応じて正常に失敗します。 セキュリティで保護されたコードの記述の詳細については、次のリソースを参照してください。
- Maguire, Steve [1993], Solid Code の記述, ISBN 1-55615-551-4, Microsoft Press, Redmond, Washington.
- ハワード、マイケル、LeBlanc、David [2003]、 Secure Code の記述、2d ed.、ISBN 0-7356-1722-8、Microsoft Press、Redmond、Washington。
Note
これらのリソースは、一部の言語や国では使用できない場合があります。
セーフ文字列処理は、優れたプログラミングプラクティスに従い、多くの場合、セキュリティで保護された文字列処理関数を使用して既存のシステムを使用して後付けすることで、引き続き対処され続ける長年の問題です。 Windows シェルのこのような一連の関数の例は、StringCbCat で始まります。