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