[정의] 루트권한 SUID 프로그램 실행 시 버퍼 초과 데이터를 입력, 비정상 작동에 의한 복귀주소를 조작, 공격 Shell을 실행시키는 공격 기법.
[개념] 사용자가 프로그램에서 저장을 위해 할당한 것보다 더 많은 데이터를 입력하려는 시도.
[유형]
-Local Buffer Overflow : 루트권한 프로그램 취약점 이용
-Remote Buffer Overflow : RPC, FTPD 서비스 취약 이용
[버퍼 오버플로우의 불안전한 코드 사례]
불안전한 코드 | 안전한 코드 |
void manipulate_string(char* string) { char buf[24]; strcpy(buf, string); }} |
void manipulate_string(char* string) { char buf[24]; /* 복사하려는 buf와 길이를 비교. */ if (strlen(string < sizeof(buf)) strncpy(buf, string, sizeof(buf)-1); /* 문자열은 반드시 null로 종료 */ buf[sizeof(buf)-1] = '₩0'; …… } |
매개변수로 받은 문자열 크기가 지역버퍼에 복사가 되는지 확인하지 않고 strcpy() 함수를 이용 데이터를 복사 | 매개변수로 받은 변수와 복사하려는 buf의 크기를 비교하여 buf의 크기를 제한하고 마지막 문자에‘₩0’을 삽입 |
[사례]
#include <stdio.h>
void sample_function ( char* string )
{
char buffer[16];
strcpy (buffer, string);
return;
}
void main()
{
char big_buffer[256];
int i;
for (i=0; i<256; i++)
big_buffer[i] = 'A';
sample_function (big_buffer); // 큰 버퍼를 함수에 보냄
}
}
- 버퍼 오버플로우를 일으키고 운영체제의 스택이 크래시되게 하여 특정 코드가 실행되게 함.
[공격 종류]
-서비스 거부 공격: 메모리 스택에 많은 데이터를 대입하여 발생. 운영체제 데이터와 같은 중요한 정보를 덮어 써서 시스템 운영체제가 기능을 수행하지 못하게 함.
-접근 권한 획득: 스택에 적당한 크기의 정보를 입력하여 복귀 포인터를 덮어씀. 원래 실행되어야할 코드 대신 자신의 코드를 가리켜 실행시킴. 패스워드 해쉬 값을 출력하거나, 새로운 계정을 생산하는 것등을 할 수 있음.
[대응방안] 스택 영역 실행/쓰기제한 및 무결성 검사. 프로그램/서버의 신속한 패치, 보안 OS 도입, 시큐어코딩.
기본 예제 (위키피디아)
아래의 예제에서, 프로그램은 메모리에서 인접해 있는 두 아이템을 정의하였다: 8 바이트 길이 스트링 버퍼, A. 그리고 2 바이트 정수형, B. 우선, A 는 8바이트 모두 숫자 0값만 포함하고 B는 숫자 3을 포함한다. 문자들은 1바이트 크기이다.
A | B | ||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
이제, 프로그램은 문자열 "excessive"를 A 버퍼에 저장한다. 한 바이트짜리 0값이 스트링의 끝임을 알리기 위해 따라온다. 스트링의 길이를 확인하지 않음으로 B의 값을 덮어쓴다.
A | B | ||||||||
'e' | 'x' | 'c' | 'e' | 's' | 's' | 'i' | 'v' | 'e' | 0 |
비록 프로그래머가 B가 바뀌는 것을 전혀 의도하지 않았다 하더라도, B의 값은 문자열의 한 부분을 구성하는 숫자로 바뀌었다. 이 예제에서 ASCII를 사용하는 빅 엔디언 시스템에서 "e" "0"는 숫자 25856가 될 수 있다. B가 프로그램이 정의한 유일한 다른 변수였다면, B의 끝을 지나가는 긴 스트링을 쓰는 것은 세그멘테이션 오류, 프로세스 종료와 같은 오류를 발생시켰을 것이다.
'ITPE > 보안' 카테고리의 다른 글
Heap Overflow (0) | 2021.04.01 |
---|---|
IP Spoofing (0) | 2021.04.01 |
Slack Space 분석 (0) | 2021.03.30 |
DNSSEC (0) | 2021.03.28 |
IPSec(IP Security) (0) | 2021.03.28 |