24강. Section 17. 각종 시스템 보안위협 및 대응책
- 버퍼 오버플로우 공격
> 프로세스의 메모리 구조는 Text, Data, Heap, Stack 영역으로 구분
> Text 영역 : 프로그램 코드와 상수가 정의되어있고, 읽기만 가능하므로 데이터 저장하려고할 시 프로세스가 중지됨, 실행코드가 위치
> Data 영역 : 전역 변수와 정적 변수가 저장되어있는 영역
※ 전역변수란?
중괄호 외부에 선언되는 변수다.
전역이라는 이름 그대로 어느 지역에서든 참조해서 사용할 수 있다.
※ 정적 변수란?
프로그램이 종료되기 전까지 메모리가 소멸되지 않는 변수다.
함수를 벗어나도 변수가 사라지지 않고 유지된다.
> Heap 영역 : 동적 메모리 호출에 의해 할당되는 메모리 영역
> Stack 영역 : 함수 인자값, 함수 내의 지역변수, 함수의 반환 주소 등이 저장되는 영역으로 상위 메모리 주소에서 하위 메모리 주소로 데이터가 저장
- 공격 원리
> 취약한 함수를 이용하여 데이터 길이에 대한 불명확한 정의가 내려졌을 때 덮어쓰기 이용
> 경계선 관리가 적절하게 수행되어 덮어쓸 수 없는 부분에 해커가 임의의 코드를 덮어 쓰는 것을 이용
- 스택 버퍼 오버 플로우
> SetUID가 설정 된 루트 권한의 프로그램을 공격대상으로 함
> 스택에 정해진 버퍼보다 큰 공격 코드를 삽입하여 반환주소를 변경함으로써 임의의 공격 코드를 루트 권한으로 실행하도록 하는 방법
- 힙 오버 플로우
> 힙은 프로그램과 전역 데이터 위에 위치하며 메모리 위 방향으로 커진다(최소 → 최대)
> 스택은 메모리 아래 방향으로 커짐(최대 → 최소)
> 힙에 요청되는 메모리는 레코드의 연결리스트와 같은 동적 데이터 구조를 위해 사용되는데 취약한 버퍼를 가지고 있다면 연속된 메모리가 손상될 수 있음
> 할당된 공간이 함수에 대한 포인터를 포함하고 있다면 공격자는 이 주소를 변경하여 겹쳐 쓴 버퍼에 있는 셸코드를 실행
- 공격 대응책
> Java, ADA, Python과 같은 고급 프로그래밍 언어 사용
> C나 C++ 사용할 경우 Secure Coding 해야함
> 스택 보호 메커니즘(Stack Guard) : 함수의 진입(entry) 및 종료(exit)에서 코드조사를 하여 어떤 변경 사항이 발생했을 경우 프로그램을 종료시킴
> 스택 쉴드(Stack Shield) : 함수 시작 시 복귀 주소에 Global RET라는 특수 스택을 저장해두어 함수 종료 시 저장 된 값과 스택의 RET값을 비교해 다를 경우 프로그램 실행을 중단
> 주소 공간의 임의 추출(ASLR, Address Space Layout Randomization) : 공격자는 셸코드로 제어를 넘기기 위해 공격에 사용할 적당한 반환주소를 결정하는 데 예측 된 주소를 사용하는데 이 예측을 어렵게하여 스택이 임의의 다른 곳에 이ㅜ치하도록 변경
> NOP sled(NOP 썰매) : 아무 기능도 수행하지 않는 명령어로 다수의 NOP 명령을 셸 코드 앞에 삽입하여 해당 영역을 가리키기만 하면 NOP를 타고 최종적으로 셸코드가 실행하기 위함
> 실행가능 주소 공간의 보호(NX) : 특정 메모리 영역에서 실행 될 시 실행되지 못하도록 만듦(Non-Executable Stack)
※ Solaris 2.7 이상 버전에서 /etc/system파일에서 set noexec_user_stack = 1, set noexec_user_stack_log = 1 두 줄 추가
> rtl : Non-Executable Stack을 우회하여 공격
ASLR(방어) → NOP Sled(공격) → NX(방어) → rtl(공격)
- 포맷 스트링 공격(Format String Attack)
> 외부로부터 입력 된 값을 검증하지 않고 입/출력 함수의 포맷 문자열 그대로 사용하는 경우 발생할 수 있는 취약점
> 위협요소 : 프로세스를 죽게 만들거나 프로세스 배치에 대한 개략적인 내용을 획득 하는데 사용
> 대응책 :
1) printf(), snprintf() 등 포맷 문자열 사용하는 함수 사용 시 사용자 입력값을 직접적으로 포맷 문자열로 사용하거나 포맷 문자열 생성에 포함시키지 않는다
2) %n, %hn은 공격자가 이를 이용해 특정 메모리 위치에 특정값을 변경 할 수 있으므로 포맷 스트링 매개변수로 사용하지 않음
- 레이스 컨디션 공격
> 둘 이상의 프로세스나 스레드가 공유자원에 동시 접근 시 접근 순서에 따라 원하지 않는 결과가 발생하는 조건/상황
> (1)실행되는 프로세스가 임시 파일을 만드는 경우 (2)임시 파일을 목적 파일로 연결(심볼릭 링크)하여 악의적인 행위함
> (3)setuid 설정이 되어 root 권한으로 실행 될 시 권한 상승을 통한 중요 자원에 접근하게 됨
> 대응책 :
1) 임시 파일에 대한 심볼릭 링크 설정 여부와 권한에 대한 검사 과정 추가
2) 임시 파일을 생성하지 않거나 sticky bit 설정
3) umask를 설정하여 생성한 파일이 공격자에 의해 삭제 되지 않도록 함