ABV.GENERAL.MULTIDIMENSION

バッファオーバーフロー - 配列インデックスが範囲外

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

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

ABV.GENERAL.MULTIDIMENSION チェッカーは、多次元 (2 次元から N 次元) 配列に対して、配列範囲の違反、つまり配列の範囲外の配列要素へのアクセスを検出する汎用のチェッカーです。

脆弱性とリスク

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

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

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

脆弱コード例 1

コピー
    #include<iostream>
    using namespace std;

    int main()
    {
        // an array with 3 rows and 2 columns.
        int x[3][2] = {0,1,2,3,4,5};

        int *p = &x[0][0];
     cout<<"Array access: "<<*(p+9)<<endl;
     return 0;
   }

Klocwork は 10 行目について、多次元配列 'x' が範囲外である可能性を示す、バッファオーバーフローレポートを生成します。

修正コード例 1

コピー
   #include<iostream>
   using namespace std;

   int main()
   {
       // an array with 3 rows and 2 columns.
       int x[3][2] = {0,1,2,3,4,5};

       int *p = &x[0][0];
      cout<<"Array access: "<<*(p+2)<<endl;
      return 0;
  }

修正されたコード例では、多次元配列はインデックス範囲内でアクセスされます。

関連チェッカー

拡張機能

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