ABV.STACK

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

ABV.STACK は、呼び出された関数内部でのバッファオーバーフローを検出するプロシージャ間チェッカーです。関数に渡される引数は、バッファのどの要素がアクセスされるかを制御します。このチェッカーは、通常は関数内のローカル変数か、またはグローバル変数であるバッファが関数に渡されないときの欠陥を検出します。

脆弱性とリスク

範囲外のローカル配列へのインデックス付けは、アプリケーションの不安定性、注意深く練られた攻撃、データ開示脆弱性、コード挿入、その他の脆弱性につながることがあります。

脆弱コード例

コピー
  void foobar(int x)
  {
      int local_array[7];
      local_array[x] = 0;
  }
  
  int main() {
      foobar(15);
      return 0;
 }

この例では、関数 'foobar' は 'local_array' へアクセスするインデックスで使用される値を取得します。Klocwork は 8 行目で、呼び出しメソッド 'foobar' がパラメーター 15 のため有効な値 (0 ~ 7) を超えていることを示す指摘レポートを生成します。この場合は、関数 'foobar' 内部で見つかったバッファ内の欠陥を検出しました。

修正コード例

コピー
  void foobar(int x)
  {
      int local_array[7];
      // verify the parameter is in range
      if (x >= 0 && x < 7)
      {
          local_array[x] = 0;
      }
  }
 
 int main() {
     foobar(15);
     return 0;
 }

修正コード例では、ローカル配列 'local_array' へのインデックスが 7 行目で使用される前に、パラメーター 'x' の値が 5 行目で検証されます。これ以外の場合、類似コードの修正では、呼び出し関数内で値をチェックするのがベストでしょう。

拡張機能

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