EN JP CN

ABV.UNKNOWN_SIZE

ABV.UNKNOWN_SIZE

バッファ オーバーフロー - サイズの不明な配列インデックスが範囲外

バッファオーバーフローは、オーバーランとも呼ばれ、データをバッファに書き込むプログラムがバッファの境界でオーバーランし、近くのメモリに上書きする異常な状態を指します。通常、この問題は、プログラムが文字列をバッファにコピーするときに発生します。

C および C++ では、データへのアクセスまたはメモリの任意の場所へのデータの上書きに対する組み込み保護が用意されていません。また、配列 (その言語の組み込みバッファタイプ) に書き込まれたデータが配列の境界内にあるかを自動的にチェックしません。

ABV.UNKNOWN_SIZE チェッカーは、配列のサイズが不明な場合の配列範囲違反を検出します。

脆弱性とリスク

バッファオーバーフローは、コードを実行するように設計された、またはプログラムの動作方法の変更のために設計された入力によりトリガーされることがあります。これにより、メモリアクセスエラー、不正確な結果、クラッシュ、またはシステムセキュリティ違反など、異常なプログラムの動作を引き起こすことがあります。

バッファオーバーフローの結果には、有効なデータの上書きや、恣意的および潜在的な悪意のあるコードの実行も含まれます。たとえば、バッファオーバーフローによって、以下に示すように、プログラムが操作されることがあります。

  • メモリ内のバッファの近くにあるローカル変数を上書きし、攻撃者の都合の良いようにプログラムの動作を変更する
  • スタックフレームの戻りアドレスを上書きし、攻撃者が指定した戻りアドレス (通常はユーザー入力を格納しているバッファ) から実行が再開されるようにする
  • 関数ポインターまたは例外ハンドラーを上書きして、後で実行する

脆弱コード例

 
    1  extern char buf[];
    2
    3  void foo(const char* pbuf)
    4  {
    5    int n = -1;
    6    if (pbuf) {
    7       n = strlen(pbuf);
    8       // more code
    9    }
   10    buf[n] = '\0';
   11  }

Klocwork は、バッファのサイズが正確にわからないためにバッファオーバーフローが生じると判断できる場合に、欠陥をレポートします:不明なサイズの配列 'buf' がインデックス値 -1 を使用する可能性があるためです。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。