사용자 제어 할당 크기

사용자 제어 할당 크기

설명

사용자 입력이 검증 없이 메모리 할당 크기로 사용되면 과도한 할당이나 후속 버퍼 오버플로가 발생할 수 있습니다.

잠재적 영향

  • 서비스 거부, 메모리 압박, 메모리 손상으로 이어질 수 있습니다.

해결 방법

허용 가능한 최소/최대 범위를 검사하고 정수 오버플로도 함께 방지합니다.

예시

변경 전

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로 변환해 할당합니다.

참조