설명
사용자 입력이 배열 인덱스로 사용되면 배열 경계를 벗어난 메모리에 접근할 수 있습니다.
잠재적 영향
- 정보 노출, 메모리 손상, 크래시가 발생할 수 있습니다.
해결 방법
인덱스가 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을 사용하고, 음수와 배열 길이 이상의 값을 모두 거부한 뒤 인덱스로 변환합니다.