# License/정보보안기사
# 버퍼 오버플로우(Buffer Overflow) 취약점
Artifex_Ethan_
2020. 5. 20. 18:23
반응형
# 버퍼 오버플로우(Buffer Overflow)
프로세스 메모리 영역 중 버퍼에 초과 값을 입력하여 시스템을 중지시키거나 원하는 동작을 하도록 조작할 수 있다.
# 종류
스택 버퍼 오버플로우(Stack Buffer Overflow)
: 주로 SetUID가 설정된 프로그램들이 타겟이 된다. 입력 값에 수용 가능한 버퍼보다 큰 값을 입력하여 임의의 공격을 루트 권한으로 실행시킬 수 있도록 한다.
ㄴ 원리:
- 프로그램에서 특정 함수를 실행시키면 스택에 돌아가기 위한 주소가 기록된다. (함수에서 return이 호출되면 그 값과 함께 돌아갈 주소)
- 버퍼에 큰 값을 넣게 되면 이 스택 영역을 침범하게 된다.
- 리턴 주소가 들어갈 곳에 쉘코드나 다른 프로그램의 주소를 넣으면 그것이 실행되게 한다.
힙 버퍼 오버플로우(Heap Buffer Overflow):
- 힙 데이터 영역에서 일어나는 버퍼 오버플로우이다.
- 스택 오버플로우만큼 흔히 사용가능한 공격은 아님.
- 동적 메모리 할당 연결(malloc 상위 수준 데이터)를 덮어씀으로써 프로그램 함수 포인터를 조작한다.
# 보안
* 시큐어코딩 :
- 버퍼 오버플로우에 취약한 언어 : C, C++
- 버퍼 오버플로우에 취약한 함수 :
- strcat()
- strcpy()
- gets()
- scanf()
- sscanf()
- vscanf()
- vsscanf()
- sprinf()
- vsprintf()
- gethostbyname()
대신 사용이 권장되는 함수:
- strncat()
- strncpy()
- fgets()
- fscanf()
- vfscanf()
- snprintf()
- vsnprintf()
* 스택 가드
* 스택 쉴드 :
- 함수 시작 시 복귀주소를 Gloval RET이라는 특수 스택에 저장해둔다.
- 함수 종료 시 저장된 값과 스택의 RET값을 비교해 다를 경우 오버플로우로 간주하고 프로그램 실행을 중단.
* ASLR :
- 메모리 공격을 방어하기 위해 주소 공간 배치를 난수화한다.
- 실행 시 마다 메모리 주소를 변경시켜 버퍼 오버플로우를 통한 특정주소 호출을 차단한다.
- 리눅스에서 다음과 같이 설정할 수 있다.
- # echo 2 > /proc/sys/kernel/randomize_va_space
* 실행 불가능 영역 :
- Solars 2.7 이상 버전에서 /etc/system 파일에 noexec_user_stack, noexec_user_stack_log 를 1로 set.
- 스택과 힙을 실행 불가능한 영역으로 만든다.
* 대응 수단 정리
1. 스택상에 있는 공격자의 코드가 실행되지 못하게 한다.
2. 함수의 진입과 종료 코드를 조사하고 함수의 스택 프레임에 대해 있는지를 검사한다.
3. 변수 타입과 그 변수에 허용되는 연산들에 대해 엄격하게 제한하는 고급 프로그래밍 함수를 사용한다.
반응형