説明
ユーザー入力を配列のインデックスに使うと、配列の範囲外のメモリにアクセスするおそれがあります。
想定される影響
- 情報漏えい、メモリ破損、クラッシュ
対処方法
インデックスが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で変換エラーや末尾の余分な文字を確認します。負数や配列の長さ以上の値を拒否してから、インデックスに変換します。