본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

정수 오버플로(Integer Overflow)는 정수 연산의 결과가 그 자료형이 나타낼 수 있는 범위를 넘어서, 값이 아주 작은 수나 음수로 바뀌는(wraparound) 현상과 그로 인한 보안 약점이다.

C 의 int 가 32비트라면 표현 범위는 -2,147,483,648 ~ 2,147,483,647 이다. 2,147,483,647 에 1을 더하면 2의 보수 표현에서 최솟값 -2,147,483,648 이 된다. 부호 없는 정수는 최댓값을 넘으면 0 부근으로 돌아간다. MITRE 의 CWE-190 은 이 약점을 "결과가 원래 값보다 항상 크다고 가정하는 로직에서, 계산이 정수 오버플로나 랩어라운드를 일으킬 수 있는 것"으로 정의하고, 값이 저장 가능한 크기를 넘으면 아주 작은 수나 음수가 될 수 있다고 설명한다.[1]

C 표준에서 부호 있는 정수의 오버플로는 정의되지 않은 동작이다. 컴파일러는 이를 랩어라운드로 처리할 수도, 트랩을 일으킬 수도, 아예 일어나지 않는다고 가정하고 코드를 최적화할 수도 있다. SEI CERT C 코딩 표준 INT32-C 는 그래서 부호 있는 정수 연산이 오버플로를 일으키지 않도록 연산 전에 범위를 확인하라고 요구한다.[2]

어떻게 취약점이 되는가

편집 원본 편집

정수 오버플로 자체는 값이 틀리는 것이지만, 그 값이 메모리 크기나 배열 첨자로 쓰이면 메모리 손상으로 이어진다. CERT 는 특히 외부 입력에서 온 정수가 포인터 연산·배열 첨자, 가변 길이 배열의 크기, 메모리 할당 함수의 크기 인자로 쓰일 때를 위험한 경우로 든다.[2]

// 취약한 예
unsigned int n = read_count();          // 사용자가 준 개수
item_t *buf = malloc(n * sizeof(item_t)); // n 이 크면 곱셈이 넘쳐 작은 크기가 할당된다
for (unsigned int i = 0; i < n; i++)
    read_item(&buf[i]);                 // 할당보다 많이 써서 힙 오버플로

곱셈 결과가 넘쳐 작은 버퍼가 할당되고, 반복문은 원래의 큰 n 만큼 써서 힙 버퍼 오버플로가 된다. 이처럼 정수 오버플로는 버퍼 오버플로의 원인이 되는 경우가 많다. 길이 비교를 부호 있는 정수로 하다가 음수가 검사를 통과하는 것도 같은 계열이다. 금융 계산, 날짜·시각 계산처럼 메모리와 무관한 곳에서도 잘못된 결과를 낸다.[1]

  • 연산 전에 결과가 범위를 넘는지 확인한다(예: a > INT_MAX - b 이면 덧셈 거부)
  • 크기·개수·길이는 부호 없는 넉넉한 자료형(size_t)으로 다루고, 할당 크기 곱셈에는 넘침 검사를 넣는다
  • 외부 입력의 정수는 허용 범위를 먼저 검증한다 → 입력값 검증
  • 컴파일러 옵션(GCC -ftrapv)이나 정적 분석 도구로 넘침을 찾는다[2]

메모리 오류와 구별하기

편집 원본 편집
오류 일어나는 곳 원인이 되는 코드
정수 오버플로 정수 연산 결과 덧셈·곱셈 결과가 자료형 범위를 넘음
스택 버퍼 오버플로 스택의 지역 배열 strcpy·gets 처럼 길이를 보지 않는 복사로 지역 배열을 넘침
힙 버퍼 오버플로 malloc 으로 받은 힙 영역 할당 크기보다 많이 씀
메모리 접근 위반 할당되지 않았거나 권한 없는 주소 초기화하지 않은 포인터, 범위 밖 주소 접근(세그멘테이션 오류)
  • 예를 들어 char* p = malloc(32); char buf[32]; scanf("%s", p); strcpy(buf, p); 같은 코드에는 산술 연산이 없으므로 정수 오버플로가 생기지 않는다. 길이 제한 없는 scanf("%s") 는 힙 버퍼를, strcpy 는 스택 배열을 넘칠 수 있고, malloc 의 반환값이 NULL 인지 확인하지 않아 접근 위반도 생길 수 있다 → 버퍼 오버플로우
  1. ↑ 1.0 1.1 「CWE-190: Integer Overflow or Wraparound」, MITRE, https://cwe.mitre.org/data/definitions/190.html, 확인일: 2026-11-05.
  2. ↑ 2.0 2.1 2.2 「INT32-C. Ensure that operations on signed integers do not result in overflow」, SEI CERT C Coding Standard, Carnegie Mellon University, https://wiki.sei.cmu.edu/confluence/display/c/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow, 확인일: 2026-11-05.