ABV.MEMBER

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

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

脆弱性とリスク

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

脆弱コード例

1   typedef struct Data {
2     int kind;
3     char name[8];
4     char ext[3];
5   } Data;
6
7   void resetDefaults(Data *d) 
8   {
9     d->kind = 0;
10    memset(d->name, 0, 11);
11   }

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

修正コード例

1   typedef struct Data {
2     int kind;
3     char name[8];
4     char ext[3];
5   } Data;
6
7   void resetDefaults(Data *d) 
8   {
9     d->kind = 0;
10    memset(d->name, 0, 8);
11    memset(d->ext, 0, 3);
12  }

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

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

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

拡張機能

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