사용자 제어 버퍼 길이

사용자 제어 버퍼 길이

설명

사용자 입력이 복사, 읽기, 포맷팅 길이로 사용되면 목적지 버퍼 크기를 초과할 수 있습니다.

잠재적 영향

  • 버퍼 오버플로, 서비스 거부, 메모리 손상이 발생할 수 있습니다.

해결 방법

목적지 버퍼 크기 이하로 길이를 제한하고 검증된 크기만 사용합니다.

예시

변경 전

c
size_t n = atoi(argv[1]);
memcpy(dst, src, n);

변경 후

c
#include <errno.h>
#include <inttypes.h>
#include <stdint.h>

int copy_input(char *dst, size_t dst_capacity,
               const char *src, size_t src_length,
               const char *raw_length) {
    char *end = NULL;
    errno = 0;
    uintmax_t parsed = strtoumax(raw_length, &end, 10);
    if (errno == ERANGE || end == raw_length || *end != '\0' ||
        parsed > SIZE_MAX || parsed > dst_capacity || parsed > src_length) {
        return -1;
    }

    memcpy(dst, src, (size_t)parsed);
    return 0;
}

설명:

  • 변경 전: 외부 입력이 복사 길이를 직접 제어합니다.
  • 변경 후: 포인터에 sizeof를 적용하지 않고 호출자가 실제 목적지 용량과 소스 길이를 전달하게 합니다. 숫자 변환을 검증한 뒤 두 버퍼의 범위 안에 있는 길이만 memcpy에 사용합니다.

참조