- 프로그램이 데이터를 버퍼(buffer)에 저장할 때, 버퍼가 가득 차 넘치게 되어 프로그래머가 지정한 부분 바깥에 덮어 씌워버리는 취약점, 버그, 이를 이용한 공격 방법을 말한다.
- 넘쳐난 데이터는 원래 데이터를 밀어내거나 이상한 곳에 저장하는 것이 아니라 덮어 씌우는 것이다. 덮어 씌워진 메모리에는 다른 데이터가 이미 포함되어 있을 수 있고, 이 때문에 메모리 접근 오류, 프로그램 종료, 시스템 보안 취약점 등이 발생할 수 있다.
- 버퍼 오버플로는 보통 데이터를 저장하는 과정에서 그 데이터를 저장할 메모리 위치가 유효한지를 검사하지 않아 발생한다. 이러한 경우 데이터가 담긴 위치 근처에 있는 값이 손상되고 그 손상이 프로그램 실행에 영향을 미칠 수도 있다. 특히, 악의적인 공격으로 인해 프로그램에 취약점이 발생할 수 있다.
- 흔히 버퍼 오버플로와 관련되는 프로그래밍 언어는 C와 C++로, 어떤 영역의 메모리에서도 내장된 데이터 접근 또는 덮어쓰기 보호 기능을 제공하지 않으며 어떤 배열에 기록되는 데이터가 그 배열의 범위 안에 포함되는지 자동으로 검사하지 않는다.
실행 시 인수로 받은 문자열을 버퍼에 옮기고 버퍼를 출력하는 간단한 C언어 코드이다.
#include <stdio.h>
#include <string.h>
int main(iint argc, char *argv[])
{
char buffer[16];
if(argc < 2)
return -1;
strcpy(buffer, argv[1]); // 여기서 발생
}
버퍼 오버런(Buffer Overrun)
- 메모리 공간에 할당된 공간보다 더 큰 데이터를 입력하면 프로그램의 오류를 유발할 수 있다. 즉 공격자는 프로그램의 오류를 유발하여 시스템을 장악하거나 Shellcode 등의 악성코드를 실행한다.
힙 버퍼 오버플로 공격(Heap Buffer Overflow Attack)
- 힙 영역은 하위 주소에서 상위주소로 메모리를 할당한다 .그러므로 경계 값을 검사하지 않고 메모리를 사용하면 경계를 초과하는 취약점이 발생한다.
버퍼 오버플로 대처
버퍼 오버플로 문제는 오래 전부터 문제되었기 때문에 이제는 파일러 레벨에서 오버플로를 막거나 사용자에게 안전한 함수를 사용하라고 경고한다.
위험한 함수 사용 자제
- 사용 자제를 권장하는 함수 : strcat(), strcpy(), gets(), scanf(), sscanf(), vscanf(), vsscanf(), sprintf(), vsprintf(), gethostbyname(), realpath()
- 대체 함수 : strncat(), strncpy(), fgets(), fscanf(), vfscanf(), snprintf(), vsnprintf()
안전한 라이브러리 사용
- Libsafe3와 같이 안전한 라이브러리를 사용한다.
- 수정된 라이브러리는 최소한 표준 라이브러리만큼 효율적이라 알려져 있으며, 기존의 프로그램에 대한 버퍼 오버플로 공격 예방을 도와준다.
스택 보호 매커니즘(Stack Guard)
스택 쉴드(Stack Shield)
경계 검사
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C] 복합 대입 / 증감 연산자 (0) | 2023.10.02 |
---|---|
[C++] Buffer Overflow (버퍼 오버플로우) 예시 (0) | 2023.09.27 |
[C++] 디버그 모드에서 변수의 메모리 차지 공간 (0) | 2023.09.27 |
[C/C++] 메모리 오류에 대하여 (0) | 2023.09.27 |
[골5] 27172 - 수 나누기 게임 (0) | 2023.09.26 |