WIPIVERSE

스택 버퍼 오버플로

정의

스택 버퍼 오버플로(Stack Buffer Overflow)는 프로그램이 스택 메모리 영역에 할당된 버퍼보다 더 많은 데이터를 쓰려고 할 때 발생하는 메모리 오류이다. 이 과정에서 인접한 스택 프레임이나 제어 정보(예: 반환 주소, 프레임 포인터)가 덮어써지며, 결과적으로 프로그램 흐름이 비정상적으로 변한다.

발생 원인

  1. 입력 길이 검증 부재: 사용자 입력이나 외부 데이터가 사전에 정의된 버퍼 크기를 초과하도록 검증되지 않을 경우.
  2. 안전하지 않은 함수 사용: strcpy, sprintf, gets 등과 같이 대상 버퍼의 크기를 체크하지 않는 C/C++ 표준 라이브러리 함수가 이용될 때.
  3. 스택 보호 기능 비활성화: 컴파일 옵션이나 런타임 환경에서 스택 쿠키(Stack Canary), 주소 공간 레이아웃 랜덤화(ASLR) 등을 비활성화했을 경우.

주요 특징

  • 제어 흐름 변조: 오버플로에 의해 반환 주소가 변경되면, 공격자는 임의의 코드(예: 쉘코드)를 실행하도록 유도할 수 있다.
  • 메모리 손상: 버퍼 외부에 쓰인 데이터는 스택 프레임 구조를 파괴하고, 프로그램이 예기치 않게 종료하거나 비정상 동작을 일으킨다.
  • 정적·동적 분석 도구의 탐지 대상: 정적 분석(예: clang-tidy, CPPCheck) 및 동적 퍼징(fuzzing) 도구에서 흔히 식별되는 취약점 유형이다.

이용 사례

  • 1996년 ‘소닉스’(Sonic) 공격: 최초로 대규모 배포된 원격 코드 실행 공격 중 하나로, 스택 버퍼 오버플로를 이용해 원격 시스템에 쉘코드를 삽입하였다.
  • Morris Worm (1988): 초기 인터넷 웜 중 하나로, 특정 버전의 fingerd 서비스에 대한 스택 오버플로 취약점을 이용했다.

방어·완화 기법

기법 설명
스택 쿠키(Stack Canary) 함수 호출 시 스택에 임의값을 삽입하고 반환 직전에 검증하여 변조 여부를 확인한다.
주소 공간 레이아웃 랜덤화(ASLR) 실행 파일 및 라이브러리, 스택 등의 메모리 주소를 무작위로 배치해 정확한 반환 주소 추정을 어렵게 만든다.
실행 방지(DEP/NX) 메모리 페이지에 실행 권한을 부여하지 않아, 데이터 영역에 삽입된 쉘코드가 실행되지 않도록 한다.
안전한 함수 사용 strncpy, snprintf, strlcpy 등 버퍼 크기를 명시적으로 지정하는 함수로 대체한다.
컴파일러 보호 옵션 -fstack-protector, -D_FORTIFY_SOURCE=2 등 gcc/clang 컴파일 옵션을 활용한다.
정적·동적 분석 코드 리뷰와 정적 분석 도구, 퍼징 등으로 버퍼 오버플로 가능성을 사전에 탐지한다.

관련 표준·규격

  • C 언어 표준 (ISO/IEC 9899): 안전하지 않은 문자열 처리 함수의 위험성을 명시하고, 대체 함수 사용을 권장한다.
  • POSIX: read, write 등 시스템 콜 사용 시 버퍼 크기 검증을 요구한다.

참고 자료

  • Common Weakness Enumeration (CWE) – CWE-121: Stack-based Buffer Overflow
  • National Vulnerability Database (NVD) – 관련 CVE 목록
  • 《Computer Security: Art and Science》, Matt Bishop (학술 서적)

(본 내용은 현재까지 공개된 백과사전·학술 자료를 기반으로 작성되었으며, 최신 보안 연구에 따라 추가적인 세부 사항이 존재할 수 있다.)

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기