버퍼 오버플로우 공격이란?

2024. 12. 5. 00:00카테고리 없음

반응형

 

버퍼 오버플로우 (Buffer Overflow)


1. 버퍼 오버플로우의 개요

버퍼 오버플로우(Buffer Overflow)는 프로그램에서 메모리 버퍼에 저장할 수 있는 데이터의 크기보다 더 많은 데이터를 버퍼에 쓸 때 발생하는 문제입니다. 이로 인해 인접한 메모리 공간에 데이터를 덮어쓰게 되어, 예기치 않은 동작, 프로그램 충돌, 심지어 악성 코드 실행을 유발할 수 있습니다. 이는 컴퓨터 보안에서 중요한 취약점 중 하나로, 공격자는 이를 악용하여 원래 의도하지 않은 행동을 강제로 수행할 수 있습니다.

  • 버퍼: 데이터를 일시적으로 저장할 수 있는 메모리 영역.
  • 오버플로우: 버퍼의 용량을 초과하여 데이터를 덮어씌우는 현상.

2. 버퍼 오버플로우의 발생 원인

버퍼 오버플로우는 주로 배열(Array), 문자열 처리 또는 입력 데이터 처리에서 발생합니다. 개발자가 프로그램의 메모리 영역에 대한 크기 체크를 하지 않거나 잘못한 경우, 데이터를 버퍼에 할당한 용량보다 더 많이 저장하려고 할 때 발생합니다.

  • 고정된 크기의 배열에 입력 데이터가 너무 많을 때
  • 사용자가 입력하는 데이터 길이에 대한 유효성 검사 누락
  • 다양한 메모리 구조(스택, 힙 등)의 잘못된 관리

3. 버퍼 오버플로우의 작동 원리

버퍼 오버플로우가 발생하면, 주로 다음과 같은 방식으로 시스템에 영향을 미칩니다:

(1) 스택 기반 버퍼 오버플로우

  • 함수 호출 시, 지역 변수들이 스택에 저장됩니다.
  • 입력 데이터가 지역 변수 배열을 넘어서면, 함수의 반환 주소를 덮어쓸 수 있습니다.
  • 공격자는 이를 이용하여 함수의 반환 주소를 조작하고, 악의적인 코드로 리디렉션할 수 있습니다.

(2) 힙 기반 버퍼 오버플로우

  • 힙 메모리는 동적으로 할당되는 메모리입니다.
  • 힙에 할당된 메모리 버퍼의 크기가 초과되면, 버퍼 오버플로우가 힙 관리 정보를 덮어쓸 수 있습니다.
  • 이를 통해 공격자는 메모리 할당 시스템을 조작하거나, 악성 코드를 삽입할 수 있습니다.

4. 버퍼 오버플로우 공격의 종류

(1) 스택 버퍼 오버플로우 (Stack Buffer Overflow)

  • 가장 흔한 형태의 버퍼 오버플로우 공격.
  • 공격자는 스택에 저장된 반환 주소를 덮어쓰고, 악성 코드를 삽입해 시스템 제어를 탈취할 수 있습니다.
  • 예: Shellcode Injection — 악성 코드가 삽입되어 명령어가 실행됨.

(2) 힙 버퍼 오버플로우 (Heap Buffer Overflow)

  • 힙 영역에서 발생하는 버퍼 오버플로우로, 주로 메모리 할당 시스템을 공격합니다.
  • 이로 인해 힙 관리 구조를 변경하거나, 악성 코드로 리디렉션될 수 있습니다.

(3) 포맷 문자열 취약점 (Format String Vulnerability)

  • 프로그램이 사용자로부터 입력받은 데이터를 포맷 문자열 함수에 전달할 때 발생할 수 있는 취약점입니다.
  • 공격자가 %x 또는 %n 등을 사용하여 메모리 내용을 읽거나, 실행 흐름을 변경할 수 있습니다.

5. 버퍼 오버플로우의 공격 방법

버퍼 오버플로우를 악용하려면 공격자는 특정 절차를 따라야 합니다:

  1. 취약점 발견: 입력을 받을 때, 입력의 크기나 범위에 대한 제한이 제대로 설정되지 않은 부분을 찾습니다.
  2. 악성 코드 삽입: 버퍼의 끝을 넘어서는 데이터를 삽입하여 인접 메모리를 덮어씁니다.
    • 이때, 코드(예: 쉘코드)를 삽입하여 프로그램이 의도치 않게 해당 코드를 실행하도록 합니다.
  3. 실행 흐름 조작: 프로그램의 제어 흐름을 변경하여 악성 코드를 실행하거나, 권한 상승을 수행할 수 있습니다.
  4. 시스템 권한 탈취: 공격자가 시스템 권한을 얻고, 시스템을 완전히 제어할 수 있습니다.

6. 버퍼 오버플로우의 방어 방법

버퍼 오버플로우 공격을 방어하는 방법은 여러 가지가 있으며, 다음과 같은 기술들이 있습니다:

(1) 안전한 코딩 기법

  • 입력 검증: 사용자가 제공하는 입력값에 대해 길이, 형식 등의 유효성 검사를 수행합니다.
  • 버퍼 크기 검증: 버퍼에 데이터를 입력할 때, 그 크기가 버퍼의 크기를 초과하지 않도록 검사합니다.
  • 다양한 프로그래밍 언어 및 라이브러리 사용: 안전한 메모리 관리가 가능한 언어를 사용하거나, 입력 길이 제한을 지원하는 라이브러리 사용.

(2) 스택 보호 기법 (Stack Canaries)

  • 스택에 "카나리 값"을 추가하여, 버퍼 오버플로우가 발생할 경우 이를 감지하고 프로그램을 종료시킵니다.
    • 버퍼가 오버플로우되면 카나리 값이 변경되므로, 프로그램이 이를 확인하고 즉시 중단합니다.

(3) DEP (Data Execution Prevention)

  • 메모리 영역에서 데이터를 실행할 수 없도록 설정하여, 쉘코드와 같은 악성 코드 실행을 방지합니다.
  • 실행 가능한 메모리 영역을 분리하여 데이터만 저장되고 실행은 할 수 없게 설정합니다.

(4) ASLR (Address Space Layout Randomization)

  • 프로그램과 라이브러리의 메모리 주소를 랜덤화하여, 버퍼 오버플로우 공격이 특정 주소를 예측할 수 없게 만듭니다.
  • 이로 인해 공격자가 시스템을 제어하기 위해 필요한 정확한 메모리 주소를 알기 어려워집니다.

(5) 컴파일러 보호 기능

  • 최신 컴파일러에서는 Stack Smashing Protection (SSP)와 같은 보호 기능을 제공합니다.
  • 이를 통해 프로그램 실행 중 스택 오버플로우를 탐지하고 중단시킬 수 있습니다.

7. 버퍼 오버플로우와 관련된 역사적 사건

(1) Morris Worm (1988)

  • 최초의 대규모 버퍼 오버플로우 공격이었던 Morris Worm은 인터넷을 통해 확산되었으며, 여러 시스템에 버퍼 오버플로우를 이용해 침투했습니다.
  • 이 사건은 컴퓨터 보안의 중요성을 인식하게 만든 중요한 사건이었습니다.

(2) Slammer Worm (2003)

  • Slammer Worm은 MS SQL 서버의 버퍼 오버플로우 취약점을 악용하여, 인터넷을 통해 전파되었습니다.
  • 이 공격은 10분 만에 75,000대 이상의 컴퓨터를 감염시키며 대규모 네트워크 장애를 일으켰습니다.

 

버퍼 오버플로우는 프로그램에서 메모리 관리를 부주의하게 다룰 때 발생하는 심각한 보안 취약점입니다. 이 취약점은 해커가 악성 코드를 실행하거나, 시스템 권한을 탈취하는 데 사용될 수 있습니다. 따라서 안전한 프로그래밍 기법과 다양한 방어 기술을 적용하는 것이 중요합니다. 최신 보안 기술과 방어 메커니즘을 채택함으로써, 버퍼 오버플로우 공격을 최소화할 수 있습니다.

반응형