バッファーオーバーランの回避Avoiding Buffer Overruns

バッファーオーバーランは、セキュリティリスクの最も一般的な原因の1つです。A buffer overrun is one of the most common sources of security risk. バッファーオーバーランは、基本的に、未確認の外部入力を信頼できるデータとして扱うことによって発生します。A buffer overrun is essentially caused by treating unchecked, external input as trustworthy data. Copymemorystrcatstrcpywcscpy などの操作を使用してこのデータをコピーすると、予期しない結果が発生し、システムが破損する可能性があります。The act of copying this data, using operations such as CopyMemory, strcat, strcpy, or wcscpy, can create unanticipated results, which allows for system corruption. 最善のケースでは、アプリケーションはコアダンプ、セグメンテーションフォールト、またはアクセス違反で中止されます。In the best of cases, your application will abort with a core dump, segmentation fault, or access violation. 最悪の場合、攻撃者は、プロセス内で他の悪意のあるコードを導入して実行することで、バッファーオーバーランを悪用する可能性があります。In the worst of cases, an attacker can exploit the buffer overrun by introducing and executing other malicious code in your process. チェックを行わない、スタックベースのバッファーへの入力データのコピーは、悪用可能な障害の最も一般的な原因です。Copying unchecked, input data into a stack-based buffer is the most common cause of exploitable faults.

バッファーオーバーランは、さまざまな方法で発生する可能性があります。Buffer overruns can occur in a variety of ways. 次の一覧では、いくつかの種類のバッファーオーバーランの状況を簡単に紹介し、新しいリスクを避けて既存のリスクを軽減するのに役立ついくつかのアイデアとリソースを提供します。The following list provides a brief introduction to a few types of buffer overrun situations and offers some ideas and resources to help you avoid creating new risks and mitigate existing ones:

静的バッファーオーバーランStatic buffer overruns

静的バッファーオーバーランは、スタック上で宣言されているバッファーが、保持するために割り当てられたよりも多くのデータを使用して書き込まれた場合に発生します。A static buffer overrun occurs when a buffer, which has been declared on the stack, is written to with more data than it was allocated to hold. 未確認のユーザー入力データが静的変数に直接コピーされ、スタックが破損する可能性がある場合、このエラーの明白でないバージョンが発生します。The less apparent versions of this error occur when unverified user input data is copied directly to a static variable, causing potential stack corruption.

ヒープオーバーランHeap overruns

ヒープオーバーランは、静的バッファーオーバーランと同様に、メモリやスタックの破損につながる可能性があります。Heap overruns, like static buffer overruns, can lead to memory and stack corruption. ヒープオーバーランはスタックではなくヒープメモリで発生するため、一部のユーザーは、重大な問題を引き起こす可能性が低いことを検討しています。それにもかかわらず、ヒープオーバーランには実際のプログラミング上の注意が必要であり、システムのリスクを静的バッファーオーバーランとして許可するだけです。Because heap overruns occur in heap memory rather than on the stack, some people consider them to be less able to cause serious problems; nevertheless, heap overruns require real programming care and are just as able to allow system risks as static buffer overruns.

配列のインデックス作成エラーArray indexing errors

配列インデックス作成エラーは、メモリオーバーランの原因でもあります。Array indexing errors also are a source of memory overruns. 境界のチェックとインデックスの管理は、この種のメモリオーバーランを防ぐのに役立ちます。Careful bounds checking and index management will help prevent this type of memory overrun.

バッファーオーバーランを回避することは、主に適切なコードを記述することです。Preventing buffer overruns is primarily about writing good code. 常にすべての入力を検証し、必要に応じて適切に失敗します。Always validate all your inputs and fail gracefully when necessary. セキュリティで保護されたコードの記述の詳細については、次のリソースを参照してください。For more information about writing secure code, see the following resources:

  • Maguire、上田 [ 1993 さん、 ] 完全なコードの 作成、ISBN 1-55615-551-4、Microsoft Press、レドモンド、ワシントン州。Maguire, Steve [1993], Writing Solid Code, ISBN 1-55615-551-4, Microsoft Press, Redmond, Washington.
  • Howard、Michael と Leblanc 著、David [ 2003 ] 、 セキュリティで保護されたコードの作成、2d ed、ISBN 0-7356-1722-8、Microsoft Press、レドモンド、ワシントン州。Howard, Michael and LeBlanc, David [2003], Writing Secure Code, 2d ed., ISBN 0-7356-1722-8, Microsoft Press, Redmond, Washington.

注意

これらのリソースは、一部の言語および国では利用できない場合があります。These resources may not be available in some languages and countries.

安全な文字列処理は、継続的な問題であり、優れたプログラミング手法に従うことによって、また多くの場合、安全な文字列処理関数を使用して既存のシステムを改良することによって解決されます。Safe string handling is a long-standing issue that continues to be addressed both by following good programming practices and often by using and retrofitting existing systems with secure, string-handling functions. Windows シェルのこのような一連の関数の例は、 Stringcbcatで始まります。An example of such a set of functions for the Windows shell starts with StringCbCat.