힙 오버플로우(Heap Overflow)란?
힙 오버플로우(Heap Overflow)는 동적 메모리 할당 영역(힙)에서 할당된 메모리의 범위를 초과하여 데이터를 덮어쓰는 버그 또는 취약점을 말합니다.
이러한 문제는 프로그램이 예상치 못한 동작을 하거나, 심각한 경우 악의적인 코드 실행(Exploit)로 이어질 수 있습니다.
힙 오버플로우의 원인
할당된 메모리 크기보다 큰 데이터를 씀
잘못된 포인터 연산으로 인한 메모리 손상
동적 메모리 해제 후 사용(Use-After-Free)와 결합될 경우 취약점 발생 가능
C++ 힙 오버플로우 예제
아래는 new 연산자를 사용하여 동적으로 할당된 메모리에서 버퍼 크기를 초과해 데이터를 쓰는 코드입니다.
#include <iostream>
#include <cstring> // strcpy 사용을 위해 필요
int main() {
// 8바이트 크기의 힙 메모리 할당
char* buffer = new char[8];
// 버퍼 크기(8바이트)를 초과하여 데이터 복사 (힙 오버플로우 발생)
strcpy(buffer, "This is a long string");
// 결과 출력
std::cout << "Buffer: " << buffer << std::endl;
// 메모리 해제
delete[] buffer;
return 0;
}
설명
new char[8]을 통해 8바이트 크기의 힙 메모리를 할당합니다.
strcpy(buffer, "This is a long string");에서 8바이트를 초과하는 문자열을 복사하여 힙 오버플로우가 발생합니다.
프로그램이 예기치 않은 동작을 하거나 충돌할 수 있습니다.
힙 오버플로우 방지 방법
배열 크기를 초과하는 데이터 쓰기 방지
strncpy, std::string, std::vector 같은 안전한 데이터 구조 활용
메모리 검증 도구 사용
AddressSanitizer, Valgrind 같은 도구를 사용해 메모리 오류 탐지
동적 메모리 할당 시 크기 검증
항상 올바른 크기만큼 할당하고, 접근할 때 범위를 체크
이런 힙 오버플로우는 보안 취약점을 유발할 수 있으니, 항상 조심해야 합니다!