ABV.ITERATOR

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

ABV.ITERATOR は、配列と反復のポインターを使用して、範囲外の配列要素へのアクセスをチェックします。このチェッカーは、この状況の結果としてバッファオーバーフローが発生する可能性のあるどのコードにもフラグを立てます。

脆弱性とリスク

バッファオーバーフローの結果には、有効なデータの上書きや、恣意的なコードや潜在的に悪意のあるコードの実行なども含まれます。

脆弱コード例 1

コピー
   int example1()
   {
       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
       int *p;
       for (p = a ; p < a + 10; p++)
       {
           if (bar(*p) < 5)
               break;
       }
       return *p;   // ABV.ITERATOR
   }

Klocwork は 10 行目について、ポインター 'p' の値が配列 'a' の範囲を超える可能性を指摘する、バッファオーバーフローレポートを生成します。ポインター 'p' は 'a' に割り当てられ、5 行目で反復されています。この場合は反復により配列 'a' がその上限 10 を超える可能性があります。

修正コード例 1

コピー
   int example1()
   {
       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
       int *p;
       for (p = a ; p < a + 10; p++)
       {
           if (bar(*p) < 5)
               break;
       }
      if (p < a + 10)
        return *p;
      return 0;
   }

修正コード例では、10 行目で配列 'a' がオーバーフローしないことを確認するチェックが行われます。

脆弱コード例 2

コピー
   int example2(int x)
   {
       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
       int *p = bar (a, x); //function returns a pointer to some element in "a"
       if (p < a + 5)
            return *p;
   
       return p[5]; // DEFECT: p[5] points to a[11] or beyond 
   }

Klocwork は 8 行目について、配列 'a' が反復後にオーバーフローすることを指摘する、ABV.ITERATOR レポートを生成します。

修正コード例 2

コピー
   int example2(int x)
   {
       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
       int *p = bar (a, x); //function returns a pointer to some element in "a"
       if (p >= a + 5)
            return *p;
   
       return p[5];  
   }

修正コード例では、5 行目の構文が修正され、バッファオーバーフローが防止されています。

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。

拡張機能

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