설명
사용자 입력이 검증 없이 메모리 할당 크기로 사용되면 과도한 할당이나 후속 버퍼 오버플로가 발생할 수 있습니다.
잠재적 영향
- 서비스 거부, 메모리 압박, 메모리 손상으로 이어질 수 있습니다.
해결 방법
허용 가능한 최소/최대 범위를 검사하고 정수 오버플로도 함께 방지합니다.
예시
변경 전
c
size_t n = atoi(argv[1]);
char *buf = malloc(n);
변경 후
c
#include <errno.h>
#include <inttypes.h>
#include <stdint.h>
#define MAX_ALLOCATION (16U * 1024U * 1024U)
char *end = NULL;
errno = 0;
uintmax_t parsed = strtoumax(argv[1], &end, 10);
if (errno == ERANGE || end == argv[1] || *end != '\0' ||
parsed == 0 || parsed > MAX_ALLOCATION || parsed > SIZE_MAX) {
return;
}
size_t n = (size_t)parsed;
char *buf = malloc(n);
if (buf == NULL) { return; }
설명:
- 변경 전: 외부 입력이 할당 크기를 직접 결정합니다.
- 변경 후:
atoi대신 오류를 확인할 수 있는strtoumax로 전체 문자열을 파싱하고, 변환 오류·0·업무 상한·SIZE_MAX를 모두 검사한 값만size_t로 변환해 할당합니다.