버퍼 오버플로 공격
버퍼 오버플로 공격은 사용자 제어 데이터가 메모리에 기록되는 버퍼 오버플로 취약성을 의도적으로 악용하는 일반적인 사이버 공격 입니다. 할당된 메모리 블록에 들어갈 수 있는 것보다 더 많은 데이터를 전송하면 공격자는 메모리의 다른 부분에 있는 데이터를 덮어쓸 수 있습니다.
공격자는 중요한 코드나 데이터를 덮어써서 프로그램을 충돌시키거나, 프로그램에 실행할 악성 코드를 삽입하거나, 중요한 값을 수정하여 프로그램의 실행 흐름을 변경하는 등 다양한 이유로 버퍼 오버플로 공격을 수행할 수 있습니다.
버퍼 오버플로 위협
버퍼 오버플로 공격은 다음과 같은 다양한 목표를 달성하는 데 사용할 수 있습니다.
- Denial of Service (DoS) Attacks: 애플리케이션의 메모리 공간 내에는 포인터, 코드 및 프로그램의 실행 기능에 중요한 기타 데이터 조각이 있습니다. 이 데이터를 덮어쓰면 프로그램이 충돌하여 DoS 공격이 발생할 수 있습니다.
- 코드 실행: 버퍼 오버플로 익스플로잇의 일반적인 목표는 취약한 애플리케이션이 공격자 제공 코드를 실행하도록 강제하는 것입니다. 이를 통해 공격자는 악용된 애플리케이션과 동일한 액세스 및 권한으로 영향을 받는 시스템에서 코드를 실행할 수 있습니다.
- 액세스 제어 우회: 버퍼 오버플로를 악용하여 코드를 실행하면 대상 시스템에 대한 공격자의 액세스 권한이 높아질 수 있습니다. 그런 다음 이 확장된 액세스를 사용하여 후속 공격을 수행할 수 있습니다.
버퍼 오버플로 공격의 유형
버퍼 오버플로 공격은 몇 가지 다른 방법으로 수행할 수 있지만 가장 일반적인 예는 다음과 같습니다.
- 스택 기반 버퍼 오버플로: 프로그램 스택에는 함수 반환 포인터와 같은 애플리케이션에 대한 중요한 제어 흐름 데이터가 포함되어 있으며 버퍼 오버플로 공격의 일반적인 대상입니다. 반환 포인터를 덮어쓰면 프로그램이 공격자가 제어하는 데이터로 이동하여 코드로 실행할 수 있으므로 공격자가 애플리케이션과 동일한 권한으로 코드를 실행할 수 있습니다.
- 힙 기반 버퍼 오버플로: 프로그램 힙은 프로그램이 컴파일될 때 크기가 정의되지 않은 변수에 메모리를 동적으로 할당하는 데 사용됩니다. 공격자는 버퍼 오버플로 취약성을 악용하고 시스템 힙을 플러딩하여 중요한 애플리케이션 데이터를 덮어쓸 수 있습니다.
- 형식 문자열 공격: C/C++의 printf 패밀리에 있는 함수는 메모리를 읽고 쓸 수 있는 형식 문자열을 사용할 수 있습니다. 사용자가 제공한 데이터가 형식 문자열로 해석되는 경우 중요한 값을 유출하거나 수정하는 데 사용할 수 있습니다.
버퍼 오버플로 공격 예제
버퍼 오버플로 취약성은 C/C++에서 일반적이며 프로그램이 고정 크기의 메모리 청크를 할당한 다음 데이터를 안전하지 않게 복사할 때 발생합니다. 다음 코드 샘플 에는 버퍼 오버플로 취약성이 포함되어 있습니다.
숯 buf[BUFSIZE];
gets(buf)를 사용합니다.
이 코드 샘플에서 변수 buf 의 고정 크기는 BUFSIZE입니다. 그러나 gets 함수는 데이터를 읽고 null 종결자(0x00)에 도달할 때까지 buf 내에 저장합니다. 공격자는 이를 악용하여 buf의 끝을 넘어 데이터를 덮어쓸 수 있습니다.
형식 문자열 공격은 버퍼 오버플로의 특별한 경우입니다. 다음 코드 샘플에는 형식 문자열 취약성이 포함되어 있습니다.
#include <stdio.h>
무효 메인 (int argc, char ** argv)
{
printf(인수[1]);
}
이 예제에서 프로그램은 argv[1] 에서 사용자 제공 입력을 받아 터미널에 인쇄합니다. 그러나 사용자의 입력에 형식 문자열이 포함된 경우 공격자가 시스템의 메모리를 읽거나 편집할 수 있습니다.
버퍼 오버플로를 방지하는 방법
버퍼 오버플로 취약성은 다음을 통해 방지할 수 있습니다.
- 입력 유효성 검사 수행: 버퍼 오버플로 취약성은 프로그램이 이러한 가정을 검증하지 않고 사용자 제공 입력에 대한 가정을 할 때 발생합니다. 데이터 길이를 확인하거나 특정 바이트 수만 메모리 위치에 복사하면 버퍼 오버플로를 방지하는 데 도움이 될 수 있습니다.
- 런타임 메모리 보호 사용: 대부분의 컴퓨터에는 ASLR(Address Space Layout Randomization), DEP(데이터 실행 방지) 및 구조적 예외 처리 덮어쓰기 보호와 같은 버퍼 오버플로에 대한 보호 기능이 기본적으로 있습니다. 이러한 보호를 사용하도록 설정하면 버퍼 오버플로 공격을 수행하기가 훨씬 더 어려워집니다.
- 취약한 기능 방지: 버퍼 오버플로는 C/C++의 gets, scanf 및 strcpy와 같은 취약한 함수에 의해 가능합니다. 버퍼 오버플로 취약성은 이러한 함수의 안전한 버전을 적절하게 사용하여 방지할 수 있습니다.
- 메모리 안전 언어 사용: 버퍼 오버플로는 고정 크기 변수가 있고 메모리 보호가 없는 프로그래밍 언어에서 발생합니다. Python, Java 또는 C#과 같은 다른 프로그래밍 언어를 사용하면 버퍼 오버플로가 어렵거나 불가능합니다.
- 취약성 악용 방지: WAF(웹 애플리케이션 방화벽 ) 및 WAAP(Web Application and API Protection ) 솔루션은 버퍼 오버플로 취약성의 악용 시도를 식별하고 차단할 수 있습니다. 이렇게 하면 버퍼 오버플로 공격이 기업 애플리케이션 보안 (AppSec)에 미치는 위험을 줄일 수 있습니다.
CloudGuard AppSec을 통한 버퍼 오버플로 방지
버퍼 오버플로 취약성을 악용하면 조직 시스템에서 프로그램 충돌, 데이터 유출 또는 악성 코드 실행이 발생할 수 있습니다. 이 eBook 에서 CloudGuard AppSec 이 버퍼 오버플로 공격 및 기타 위협으로부터 보호하는 방법을 알아보십시오. 그런 다음 무료 데모에 등록 하여 CloudGuard AppSec이 클라우드 애플리케이션 보안을 어떻게 향상시킬 수 있는지 직접 확인하십시오.