Post

시스템 보안 이론 7

버퍼 오버플로우

- 개념

  • 버퍼: 데이터를 일시적으로 저장하는 공간.
  • 버퍼 오버플로우:
    • 프로그램이 버퍼에 할당된 크기를 초과하는 데이터를 쓰거나 접근하려 할 때 발생.
    • 인접한 메모리 영역을 덮어쓰게 되어 프로그램 오류 또는 시스템 충돌 유발.
    • 공격자가 악의적인 코드를 실행하여 시스템을 제어할 수 있는 취약점으로 악용 가능.

- 원리

  • 메모리 구조
    • 프로그램이 실행될 때 메모리는 코드, 데이터, 스택, 힙 영역으로 나뉘어 사용
      1. 코드
        • 실행할 프로그램의 코드가 CPU에서 수행할 기계어로 변환되어 저장되는 영역.
        • 컴파일 타임에 결정되며 Read-Only 상태로 중간에 변경 불가. - 프로그램 실행 중 항상 메모리에 존재.
      2. 데이터
        • 전역변수와 정적(static) 변수가 저장되는 영역.
        • 프로그램 시작과 함께 할당되고 종료 시 소멸.
        • 변경 가능한 Read-Write 상태.
      3. 스택
        • 함수 호출 시 생성되는 리턴 주소, 지역변수, 매개변수 등이 저장.
        • 함수 실행 종료 시 해제.
        • 재귀 호출 또는 과도한 메모리 사용 시 스택 오버플로우 발생 가능.
        • 프로그래머가 동적으로 메모리를 할당(malloc, new) 및 해제(free, delete)하는 영역.
        • 런타임 시 크기가 결정됨.

          버퍼 오버플로우는 모든 메모리 영역에서 발생할 수 있으나, 스택에서의 발생 가능성이 높음.

  • 함수 호출 과정
    1. 함수가 호출되면 스택에 리턴 주소, 매개변수, 지역변수 등이 저장.
    2. 함수 실행 종료 시 스택에 저장된 리턴 주소로 되돌아감.
    3. 버퍼 오버플로우 발생 시 리턴 주소가 덮어써져 악성코드가 실행될 수 있음.

- 발생원인

  1. 취약한 함수 사용
    • 입력값의 길이를 검증하지 않는 함수 (gets, strcpy 등) 사용 시 취약.
  2. 악의적인 입력
    • 공격자가 버퍼 크기를 초과하는 입력값을 전달하여 버퍼 오버플로우 유발.
  3. 리턴 주소 조작
    • 넘친 데이터가 리턴 주소를 덮어쓰고, 악의적인 코드가 저장된 주소로 변경.
  4. 악성코드 실행
    • 조작된 리턴 주소로 인해 공격자가 원하는 코드를 실행.

- 종류

1. 힙 오버플로우 - : 메모리에서 낮은 주소부터 높은 주소로 할당. - 힙이 스택 영역을 침범할 때 힙 오버플로우 발생.

2. 스택 오버플로우 - 스택: 메모리에서 높은 주소부터 낮은 주소로 할당. - 스택이 힙 영역을 침범할 때 스택 오버플로우 발생.

- 예방법

  1. 안전한 코딩
    • 입력값 길이를 검증.
    • 안전한 함수(fgets, strncpy 등)를 사용.
  2. 컴파일러 보안
    • 스택 카나리, ASLR(주소 공간 배치 난수화) 등의 컴파일러 보안 옵션 활성화.
  3. 운영체제 보안
    • DEP(Data Execution Prevention) 등 메모리 실행 권한을 제한하는 운영체제 기능 활용.
  4. 최신 보안 업데이트
    • 알려진 취약점에 대한 보안 패치 적용.