버퍼 오버플로우 편집하기
IT위키
편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
최신판 | 당신의 편집 | ||
1번째 줄: | 1번째 줄: | ||
프로세스 메모리 영역 중 버퍼에 초과값을 입력하여 시스템을 중지시키거나 원하는 동작을 하도록 조작할 수 있다. | |||
==종류== | == 종류 == | ||
===스택 버퍼 오버플로우=== | ===스택 버퍼 오버플로우=== | ||
Stack Buffer Overflow | |||
* 주로 SetUID가 설정된(루트 권한으로 실행되는) 프로그램들을 타겟으로 한다. | |||
* 입력값에 수용 가능한 버퍼보다 큰 값을 입력하여 임의의 공격코드를 루트 권한으로 실행시킨다. | |||
*주로 SetUID가 설정된(루트 권한으로 실행되는) 프로그램들을 타겟으로 한다. | |||
*입력값에 수용 가능한 버퍼보다 큰 값을 입력하여 임의의 공격코드를 루트 권한으로 실행시킨다 | |||
===힙 버퍼 오버플로우=== | ===힙 버퍼 오버플로우=== | ||
Heap Buffer Overflow | |||
* 힙 데이터 영역에서 일어나는 버퍼 오버플로이다. | |||
* 스택 오버플로우만큼 흔히 사용가능한 공격은 아니다. | |||
* 동적 메모리 할당 연결(malloc 상위 수준 데이터)을 덮어씀으로써 프로그램 함수 포인터를 조작한다. | |||
== 방어 기법 == | |||
* '''스택가드''' | |||
** 카나리(canary)라고 불리는 무결성 체크용 값을 복귀주소와 변수 사이에 삽입해 둔다. | |||
** 버퍼 오버플로 시 카나리값이 변하게 되는데, 이 경우 복귀주소를 호출하지 않는다. | |||
** gcc등 각종 컴파일러에 이 기법이 반영되어 업데이트 되었다. | |||
* | * '''ASLR(Address Space Layout Randomization)''' | ||
* | ** 메모리 공격을 방어하기 위해 주소 공간 배치를 난수화 한다. | ||
* | ** 실행 시 마다 메모리 주소를 변경시켜 버퍼 오버플로우를 통한 특정주소 호출을 차단한다. | ||
** 리눅스에서 다음과 같이 설정할 수 있다. | |||
<pre class='shell'> | |||
echo 2 > /proc/sys/kernel/randomize_va_space | |||
</pre> | |||
* '''실행 불가능한 영역''' | |||
** Solaris 2.7이상 버전에서 /etc/system 파일에 noexec_user_stack, noexec_user_stack_log를 1로 set하여 활성화시킨다 | |||
** 스택과 힙을 실행 불가능(No Executable)한 영역으로 만든다. | |||
*''' | * '''안전한 개발''' | ||
** | ** 프로그램 개발 시 입력값에 대한 크기 검증을 적절히 수행하거나 취약하지 않은 함수만을 사용한다면 어느정도 방지할 수 있다. | ||
** '''참고''' | |||
* | *** 버퍼 오버플로우에 취약한 언어들 : C, C++ | ||
*''' | *** 버퍼 오버플로우에 취약한 함수들 : strcat(), strcpy(), gets(), scanf(), sscanf(), vscanf(), vsscanf(), sprintf(), vsprintf(), gethostbyname() | ||
** | *** 대신 사용이 권장되는 함수들 : strncat(), strncpy(), fgets(), fscanf(), vfscanf(),snprintf(), vsnprintf() | ||
** | |||
* | |||
** | |||
* | |||
[[분류:보안]] | |||
[[분류:보안 취약점]] | |||