정수 오버플로
더 많은 작업
정수 오버플로(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]
| 오류 | 일어나는 곳 | 원인이 되는 코드 |
|---|---|---|
| 정수 오버플로 | 정수 연산 결과 | 덧셈·곱셈 결과가 자료형 범위를 넘음 |
| 스택 버퍼 오버플로 | 스택의 지역 배열 | strcpy·gets 처럼 길이를 보지 않는 복사로 지역 배열을 넘침
|
| 힙 버퍼 오버플로 | malloc 으로 받은 힙 영역 |
할당 크기보다 많이 씀 |
| 메모리 접근 위반 | 할당되지 않았거나 권한 없는 주소 | 초기화하지 않은 포인터, 범위 밖 주소 접근(세그멘테이션 오류) |
- 예를 들어
char* p = malloc(32); char buf[32]; scanf("%s", p); strcpy(buf, p);같은 코드에는 산술 연산이 없으므로 정수 오버플로가 생기지 않는다. 길이 제한 없는scanf("%s")는 힙 버퍼를,strcpy는 스택 배열을 넘칠 수 있고,malloc의 반환값이 NULL 인지 확인하지 않아 접근 위반도 생길 수 있다 → 버퍼 오버플로우
- ↑ 1.0 1.1 「CWE-190: Integer Overflow or Wraparound」, MITRE, https://cwe.mitre.org/data/definitions/190.html, 확인일: 2026-11-05.
- ↑ 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.