ABV.MEMBER

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

ABV.MEMBER はクラスまたは構造体での配列範囲違反をチェックします。このチェッカーは、この状況の結果としてバッファオーバーフローが発生するどのコードにもフラグを立てます。このチェッカーは ABV.GENERAL から抽出されたもので、コードの構造体でしばしばオーバーフローが発生するため、このチェッカーをオフにしたい場合など、特定のバッファオーバーフロー状況を個別に検出します。

脆弱性とリスク

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

脆弱コード例

コピー
   typedef struct Data {
     int kind;
     char name[8];
     char ext[3];
   } Data;

   void resetDefaults(Data *d) 
   {
     d->kind = 0;
    memset(d->name, 0, 11);
   }

Klocwork は 10 行目について、配列 'd->name' がオーバーフローすることを指摘する、ABV.MEMBER レポートを生成します。名前と拡張子をゼロにすることが設計の意図ならば、このコードに問題はありません。そうでない場合は、次の例のように変更するのがベストでしょう。

修正コード例

コピー
   typedef struct Data {
     int kind;
     char name[8];
     char ext[3];
   } Data;

   void resetDefaults(Data *d) 
   {
     d->kind = 0;
    memset(d->name, 0, 8);
    memset(d->ext, 0, 3);
  }

修正コード例では、配列のサイズが変更され、配列 'd->name' は、'name' と'ext' 両方のエイリアスとして使用されません。

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

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

拡張機能

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