버퍼 오버 플로우
버퍼 오버플로우(Buffer Overflow)는 프로그램이 할당된 버퍼의 크기를 넘어선 데이터를 메모리에 쓸 때 발생하는 결함이다. 단순한 충돌부터 임의 코드 실행까지 일으키는 고전적이고 강력한 보안 취약점이다.
공격 흐름
- 공격자가 의도적으로 버퍼보다 큰 입력을 보낸다.
- 인접한 메모리 영역(스택의 리턴 주소 등)이 덮어써진다.
- 함수가 종료될 때 변경된 리턴 주소로 점프 → 공격자가 심어 둔 코드(셸코드) 실행.
[ 버퍼 ][ 다른 변수 ][ 리턴 주소 ]
↑
입력이 여기를 지나 리턴 주소까지 덮어씀
왜 발생하는가
- C/C++처럼 경계 검사 없이 메모리를 직접 다루는 언어
strcpy,gets,sprintf등 안전하지 않은 함수 사용- 길이를 검증하지 않고 외부 입력을 그대로 신뢰
종류
| 종류 | 위치 | 특징 |
|---|---|---|
| 스택 오버플로우 | 함수의 지역변수 영역 | 리턴 주소 변조가 흔함 |
| 힙 오버플로우 | 동적 할당 영역 | 메타데이터 변조, Use-After-Free 등과 결합 |
대응 방안
- 안전한 함수 사용:
strncpy,snprintf등 길이 제한 버전 - 컴파일러 보호: 스택 카나리(Canary), 시큐어 코딩 옵션
- OS 보호: ASLR(주소 무작위화), DEP/NX(실행 방지 비트)
- 언어 선택: 메모리 안전한 언어(Rust, Go, Java 등) 사용
- 코드 리뷰·정적 분석: 취약 패턴을 자동 검출
관련 노트
- 시큐어 코딩: 코드 단계의 보안 강화
- 크로스 사이트 스크립팅 · CSRF · SQL Injection: 다른 대표 취약점
- 기밀성 · 무결성 · 가용성: 버퍼 오버플로우가 동시에 위협하는 보안 원칙