コンテンツにスキップ

Out-of-Bounds Read (境界外読み取り)

ルール ID

MI108

定義

ソフトウェアは、意図されたバッファーの終端を越えたデータ、または先頭より前のデータを読み取っています。

サンプル

次のコードは、CWE の該当コード サンプルの 1 つです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
int getValueFromArray(int *array, int len, int index) {

int value;

// check that the array index is less than the maximum

// length of the array
if (index < len) {

  // get the value at the specified index of the array
  value = array[index];
}
// if array index is invalid then output error message

// and return value indicating error
else {
  printf("Value is: %d\n", array[index]);
  value = -1;
}

return value;
}

このサンプルでは、メソッドは配列から入力パラメーターとして指定されたインデック位置の値を読み取っています。しかし、メソッドは指定された配列インデックスが配列の最大長より小さいことだけをチェックしており、最小値のチェックは行っていません (CWE-839)。そのため、入力配列インデックスとして負値が許され、境界外読み取り (CWE-125) が発生し、機密情報を格納したメモリにアクセスされる可能性があります。入力配列インデックスが配列に要求される最大と最小の範囲内にあることを検証するべきです。このサンプルの場合、次のように、if 文に最小範囲のチェックを含めるよう修正するべきです。

参考資料

  • Common Weakness Enumeration: CWE-125