EN JP CN

ABV.ANY_SIZE_ARRAY

ABV.ANY_SIZE_ARRAY

バッファ オーバーフロー - サイズが指定されていない配列インデックスが範囲外

ABV.GENERAL と同様、ABV.ANY_SIZE_ARRAY チェッカーは配列範囲の違反配列の範囲外の配列要素へのアクセスを検出する汎用のチェッカーです。ABV.ANY_SIZE_ARRAY は、サイズが指定されていない配列 (通常は実行時に決定される) をコードが参照するときに欠陥をチェックします。

次の例で、配列定義で使用される別の C 標準のテクニックを示します。配列サイズを決定するときと、コード内でその後にメモリを割り当てるときに、C99 スタイルを使用します。このような状況では、Klocwork から ABV.ANY_SIZE_ARRAY フラグが立てられます。

1  struct OldStyle{
2  /* other fields */
3  unsigned char array[1];
4  };
5  struct GccStyle{
6  /* other fields */
7  unsigned char array[0];
8  };
9
10 struct C99Style{
11 /* other fields */
12 unsigned char array[];
13 };
14

ABV.ANY_SIZE_ARRAY は、C99 テクニックを使用している場合に、配列のサイズが指定されていない状況での欠陥をチェッカーの結果から除去するためにしばしば使用されます。この欠陥にフラグを立てない、または ABV 欠陥から除外する場合は、このチェッカーをオフにします。

脆弱性とリスク

バッファオーバーフローの結果には、有効なデータの上書きや、恣意的および潜在的な悪意のあるコードの実行も含まれます。しかし、任意サイズの配列を使用してそれらを丁寧に管理している場合は、ABV.ANY_SIZE_ARRAY チェッカーをオフにするのがベストな場合がよくあります。

コード例 1

1  typedef struct NumericData {
2      int           varlen;
3      char          n_data[1];
4  } NumericData;
5
6  #define MAX_LEN 2048
7  void init(char *data) {
8      if (strlen(data) > MAX_LEN) return;
9      NumericData *X = (NumericData*)malloc(sizeof(NumericData) + strlen(data));
10      X->varlen = strlen(data);
11      int k;
12      for (k = 0; k < strlen(data); k++) {X->n_data[k] = data[k];}
13      X->n_data[k-1] = '\0';
14  }

Klocwork は 13 行目について、変数の長さの配列 'n_data' のインデックスが範囲外になる可能性を指摘する、バッファオーバーフローレポートを生成します:サイズが指定されていない配列 'n_data' のインデックス値が -1 になる可能性があるためです。しかし、これは実際のコーディングテクニックとしては正しい用法であり、このような場合、通常、設計者はこの欠陥がレポートされることを望まず、ABV.ANY_SIZE_ARRAY チェッカーを無効にすることがあります。

コード例 2

1  #define MAXL 255
2  typedef struct info_t_{
3    unsigned char code;
4    unsigned char length[2];
5    unsigned char value[1];
6  } info_t;
7
8  int getshort(unsigned char *l);
9
10 void foo(info_t *id){
11   unsigned char buf[MAXL];
12   int len = getshort(id->length);
13   if ((len > 0) && (len <= MAXL)) {
14      memcpy(buf, &id->value[0], len);
15   }
16 }

これは正しい用法であるにもかかわらず、欠陥がレポートされるもう 1 つの例です。Klocwork は 14 行目について、変数の長さの配列 'id->value' のインデックスが範囲外になる可能性を指摘する、バッファオーバーフローレポートを生成します:サイズが指定されていない配列 '&id->value[0]' のインデックス値が 0..254 になる可能性があるためです。

拡張機能

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