ユーザー入力による配列インデックスの制御

ユーザー入力による配列インデックスの制御

説明

ユーザー入力を配列のインデックスに使うと、配列の範囲外のメモリにアクセスするおそれがあります。

想定される影響

  • 情報漏えい、メモリ破損、クラッシュ

対処方法

インデックスが0以上で、配列の長さ未満であることを確認します。

例

変更前

c
int idx = atoi(argv[1]);
return values[idx];

変更後

c
#include <errno.h>
#include <stdlib.h>

char *end = NULL;
errno = 0;
long parsed = strtol(argv[1], &end, 10);
if (errno == ERANGE || end == argv[1] || *end != '\0' ||
    parsed < 0 || (unsigned long)parsed >= VALUE_COUNT) {
    return -1;
}
size_t idx = (size_t)parsed;
return values[idx];

説明:

  • 変更前: 外部入力を境界チェックなしでインデックスとして使っています。
  • 変更後: strtol で変換エラーや末尾の余分な文字を確認します。負数や配列の長さ以上の値を拒否してから、インデックスに変換します。

参考資料