버퍼 오버플로란 무엇입니까?

컴퓨터 프로그램에서 변수는 고정 크기 메모리 블록으로 할당됩니다. 이 메모리가 할당되면 프로그램은 이러한 위치에서 데이터를 저장하고 검색할 수 있습니다. 버퍼 오버플로는 이러한 메모리 블록 중 하나에 기록된 데이터의 양이 크기를 초과할 때 발생합니다. 결과적으로 다른 용도로 할당된 메모리를 덮어써서 프로그램에 다양한 영향을 미칠 수 있습니다.

Download the eBook 데모 요청하기

버퍼 오버플로란 무엇입니까?

버퍼 오버플로 공격

버퍼 오버플로 공격은 사용자 제어 데이터가 메모리에 기록되는 버퍼 오버플로 취약성을 의도적으로 악용하는 일반적인 사이버 공격 입니다. 할당된 메모리 블록에 들어갈 수 있는 것보다 더 많은 데이터를 전송하면 공격자는 메모리의 다른 부분에 있는 데이터를 덮어쓸 수 있습니다.

공격자는 중요한 코드나 데이터를 덮어써서 프로그램을 충돌시키거나, 프로그램에 실행할 악성 코드를 삽입하거나, 중요한 값을 수정하여 프로그램의 실행 흐름을 변경하는 등 다양한 이유로 버퍼 오버플로 공격을 수행할 수 있습니다.

버퍼 오버플로 위협

버퍼 오버플로 공격은 다음과 같은 다양한 목표를 달성하는 데 사용할 수 있습니다.

  • 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이 클라우드 애플리케이션 보안을 어떻게 향상시킬 수 있는지 직접 확인하십시오.

×
  피드백
본 웹 사이트에서는 기능과 분석 및 마케팅 목적으로 쿠키를 사용합니다. 웹 사이트를 계속 이용하면 쿠키 사용에 동의하시게 됩니다. 자세한 내용은 쿠키 공지를 읽어 주십시오.