CXX.SUSPICIOUS_INDEX_CHECK.CALL

CXX.SUSPICIOUS_INDEX_CHECK.CALL チェッカーは、別の関数の配列にアクセスする前に不審なインデックスチェックが存在する場合に、欠陥を検出します。

脆弱性とリスク

配列がそのサイズを超えるインデックスにアクセスされる場合、データの破損、誤動作、またはクラッシュが発生する可能性があります。

軽減と防止

特定のインデックスの配列にアクセスする前に、適切な境界チェックを実行してください。

脆弱コード例

コピー
int get_index();
  
void set(int* arr, int index) {
    arr[index] = 0;
}
  
int main() {
    int SIZE = 15;
    int arr[10];
    int index = get_index();
    
    if (index >= SIZE) {  
        return 0;
    }
    set(arr, index);
}

Klocwork は 15 行目で CXX.SUSPICIOUS_INDEX_CHECK.CALL を報告し、12 行目の不審なインデックスチェックについてユーザーに警告します。

別の関数セットでは、4 行目の「インデックス」範囲が 10 ~ 14 の場合、配列逆参照に到達して、それによりバッファオーバーフローが発生する可能性があります。

修正コード例

コピー
int get_index();
  
void set(int* arr, int index) {
    arr[index] = 0;
}
  
int main() {
    int SIZE = 10;
    int arr[10];
    int index = get_index();
    
    if (index >= SIZE) {  
        return 0;
    }
    set(arr, index);
}

12 行目の制約「index >= SIZE」により不正な動作がすべて排除されるため、バッファオーバーフローは発生しません。

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

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