시스템 보안 이론 7
버퍼 오버플로우
- 개념
- 버퍼: 데이터를 일시적으로 저장하는 공간.
- 버퍼 오버플로우:
- 프로그램이 버퍼에 할당된 크기를 초과하는 데이터를 쓰거나 접근하려 할 때 발생.
- 인접한 메모리 영역을 덮어쓰게 되어 프로그램 오류 또는 시스템 충돌 유발.
- 공격자가 악의적인 코드를 실행하여 시스템을 제어할 수 있는 취약점으로 악용 가능.
- 원리
- 메모리 구조
- 프로그램이 실행될 때 메모리는 코드, 데이터, 스택, 힙 영역으로 나뉘어 사용
- 코드
- 실행할 프로그램의 코드가 CPU에서 수행할 기계어로 변환되어 저장되는 영역.
- 컴파일 타임에 결정되며 Read-Only 상태로 중간에 변경 불가. - 프로그램 실행 중 항상 메모리에 존재.
- 데이터
- 전역변수와 정적(static) 변수가 저장되는 영역.
- 프로그램 시작과 함께 할당되고 종료 시 소멸.
- 변경 가능한 Read-Write 상태.
- 스택
- 함수 호출 시 생성되는 리턴 주소, 지역변수, 매개변수 등이 저장.
- 함수 실행 종료 시 해제.
- 재귀 호출 또는 과도한 메모리 사용 시 스택 오버플로우 발생 가능.
- 힙
- 프로그래머가 동적으로 메모리를 할당(
malloc
,new
) 및 해제(free
,delete
)하는 영역. - 런타임 시 크기가 결정됨.
버퍼 오버플로우는 모든 메모리 영역에서 발생할 수 있으나, 스택에서의 발생 가능성이 높음.
- 프로그래머가 동적으로 메모리를 할당(
- 코드
- 프로그램이 실행될 때 메모리는 코드, 데이터, 스택, 힙 영역으로 나뉘어 사용
- 함수 호출 과정
- 함수가 호출되면 스택에 리턴 주소, 매개변수, 지역변수 등이 저장.
- 함수 실행 종료 시 스택에 저장된 리턴 주소로 되돌아감.
- 버퍼 오버플로우 발생 시 리턴 주소가 덮어써져 악성코드가 실행될 수 있음.
- 발생원인
- 취약한 함수 사용
- 입력값의 길이를 검증하지 않는 함수 (
gets
,strcpy
등) 사용 시 취약.
- 입력값의 길이를 검증하지 않는 함수 (
- 악의적인 입력
- 공격자가 버퍼 크기를 초과하는 입력값을 전달하여 버퍼 오버플로우 유발.
- 리턴 주소 조작
- 넘친 데이터가 리턴 주소를 덮어쓰고, 악의적인 코드가 저장된 주소로 변경.
- 악성코드 실행
- 조작된 리턴 주소로 인해 공격자가 원하는 코드를 실행.
- 종류
1. 힙 오버플로우 - 힙: 메모리에서 낮은 주소부터 높은 주소로 할당. - 힙이 스택 영역을 침범할 때 힙 오버플로우 발생.
2. 스택 오버플로우 - 스택: 메모리에서 높은 주소부터 낮은 주소로 할당. - 스택이 힙 영역을 침범할 때 스택 오버플로우 발생.
- 예방법
- 안전한 코딩
- 입력값 길이를 검증.
- 안전한 함수(
fgets
,strncpy
등)를 사용.
- 컴파일러 보안
- 스택 카나리, ASLR(주소 공간 배치 난수화) 등의 컴파일러 보안 옵션 활성화.
- 운영체제 보안
- DEP(Data Execution Prevention) 등 메모리 실행 권한을 제한하는 운영체제 기능 활용.
- 최신 보안 업데이트
- 알려진 취약점에 대한 보안 패치 적용.