버퍼 오버 플로우

버퍼 오버플로우(Buffer Overflow)는 프로그램이 할당된 버퍼의 크기를 넘어선 데이터를 메모리에 쓸 때 발생하는 결함이다. 단순한 충돌부터 임의 코드 실행까지 일으키는 고전적이고 강력한 보안 취약점이다.

공격 흐름

  1. 공격자가 의도적으로 버퍼보다 큰 입력을 보낸다.
  2. 인접한 메모리 영역(스택의 리턴 주소 등)이 덮어써진다.
  3. 함수가 종료될 때 변경된 리턴 주소로 점프 → 공격자가 심어 둔 코드(셸코드) 실행.
[ 버퍼 ][ 다른 변수 ][ 리턴 주소 ]
       ↑
입력이 여기를 지나 리턴 주소까지 덮어씀

왜 발생하는가

  • C/C++처럼 경계 검사 없이 메모리를 직접 다루는 언어
  • strcpy, gets, sprintf 등 안전하지 않은 함수 사용
  • 길이를 검증하지 않고 외부 입력을 그대로 신뢰

종류

종류위치특징
스택 오버플로우함수의 지역변수 영역리턴 주소 변조가 흔함
힙 오버플로우동적 할당 영역메타데이터 변조, Use-After-Free 등과 결합

대응 방안

  • 안전한 함수 사용: strncpy, snprintf 등 길이 제한 버전
  • 컴파일러 보호: 스택 카나리(Canary), 시큐어 코딩 옵션
  • OS 보호: ASLR(주소 무작위화), DEP/NX(실행 방지 비트)
  • 언어 선택: 메모리 안전한 언어(Rust, Go, Java 등) 사용
  • 코드 리뷰·정적 분석: 취약 패턴을 자동 검출

관련 노트