사용자 제어 배열 인덱스

사용자 제어 배열 인덱스

설명

사용자 입력이 배열 인덱스로 사용되면 배열 경계를 벗어난 메모리에 접근할 수 있습니다.

잠재적 영향

  • 정보 노출, 메모리 손상, 크래시가 발생할 수 있습니다.

해결 방법

인덱스가 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을 사용하고, 음수와 배열 길이 이상의 값을 모두 거부한 뒤 인덱스로 변환합니다.

참조