[정보보안기사 PART 04] 시스템 보안 - 각종 시스템 보안위협 및 대응책


Section 19 각종 시스템 보안위협 및 대응책

 

1. 버퍼 오버플로우 공격

 

(1) 버퍼 오버플로우(Buffer Overflow, Buffer Overrun) 공격 개요

1) 프로세스 메모리 구조

 Text, Data, Heap, Stack 영역으로 구분

 

Text 영역 : 프로그램 코드와 상수가 정의되어 있고, 읽기만 가능한 메모리 영역이기 때문에 데이터를 저장하려고 하면 분할 충돌을 일으켜 프로세스가 중지된다.

Data 영역 : 전역 변수와 정적 변수가 저장되어 있는 영역

Heap 영역 : 프로그래머의 필요에 따라 동적 메모리 호출에 의해 할당되는 메모리 영역

Stack 영역 : 함수 인자 값, 함수 내의 지역 변수, 함수의 반환 주소 등이 저장되는 영역으로 상위 메모리 주소에서 하위 메모리 주소로 데이터가 저장된다.

 

2) 버퍼 오버플로우 공격의 기본 개념

 버퍼 또는 데이터 저장 영역에 할당된 용량보다 더 많은 입력이 위치하면 다른 정보를 변경할 수 있는 조건

 공격자는 이런 조건을 이용하여 시스템을 중지시키거나 시스템의 제어를 갖기 위한 특별 코드 삽입

 버퍼 오버플로우는 프로세스가 정해진 크기의 버퍼 한계를 벗어나 이웃한 메모리 위치에 데이터를 겹쳐 쓰려고 시도하는 것과 같은 프로그래밍 오류의 결과로 발생

 

 

(2) 스택 버퍼 오버플로우(stack buffer overflow)

1) 개요

 보통 SetUID(Set User ID)가 설정된 루트 권한의 프로그램을 공격대상으로 한다. 스택에 정해진 버퍼보다 큰 공격 코드를 삽입하여 반환주소를 변경함으로서 임의의 공격 코드를 루트 권한으로 실행하는 방법

 

2) 함수 호출 메커니즘

 한 함수가 다른 함수를 호출하면, 호출된 함수가 끝났을 때 제어를 반환할 수 있도록 반환 주소를 저장할 장소가 필요하다.

 

3) 셸코드

 많은 버퍼 오버플로우 공격의 핵심 요소는 오버플로우가 발생하는 버퍼에 저장되는 공격자의 코드로 실행 제어를 이동시키는 것이다. 이 코드를 셸코드(Shellcode)라고 한다.

이렇게 부르는 이유는 사용자 명령어 라인의 해석기인 셸로 제어를 넘기고 공격당한 프로그램의 권한으로 시스템의 다른 프로그램에 접근하기 때문이다.

 

4) 스택 버퍼 오버플로우 공격 절차

 1단계 : 공격 셸 코드를 버퍼에 저장

 2단계 : 루트 권한으로 실행되는 프로그램의 특정 함수의 스택 반환주소 버퍼를 오버플로우 시켜서 공격 셸 코드가 저장되어 있는 버퍼의 주소로 덮어씌운다.

 3단계 : 특정 함수의 호출이 완료되면 조작된 반환 주소로 셸 코드의 주소가 반환되어 셸 코드가 실행되고, 루트 권한을 획득하게 된다.

 

 

(3) 힙 오버플로우(heap overflow)

 일반적으로 힙은 프로그램과 전역 데이터 위에 위치하며 메모리 위 방향으로 커진다.

 스택은 아래 방향으로 커진다.

 힙에 요청되는 메모리는 레코드의 연결리스트와 같은 동적 데이터 구조를 위해 사용된다. 만약 이런 레코드가 오버플로우에 취약한 버퍼를 가지고 있다면 연속된 메모리가 손상될 수 있다.

 스택과는 다르게 실행 제어를 쉽게 이동시킬 수 있는 반환 주소는 없다. 그러나 할당된 공간이 함수에 대한 포인터를 포함하고 있다면 공격자는 이 주소를 변경하여 겹쳐 쓴 버퍼에 있는 셸코드를 가리키도록 할 수 있따.

 

 

(4) 버퍼 오버플로우 공격 대응책

1) 개요

 1. 컴파일 시간 방어 : 새 프로그램 내에서 공격을 저지하도록 프로그램을 강화하는 것을 목표

 2. 실행 시간 방어 : 존재하는 프로그램에서 공격을 발견하고 중지시키는 것을 목표

 

2) 컴파일 시간 방어

 프로그램을 컴파일할 때 검사하여 버퍼 오버플로우를 방지하거나 발견하는 것을 목표로 한다.

 가장 기본적인 대응책은 버퍼 오버플로우를 허용하지 않는 Java, ADA, Python과 같은 현대화된 고급 프로그래밍 언어를 사용하여 소프트웨어를 작성

사용 자체를 권장하는 함수 : strcat(), strcpy(), get(), scanf(), sscanf(), vscanf(), vsscanf(), sprintf(), vsprintf(), gethostbyname(), realpath()

 사용을 권장하는 함수 : strncat(), strncpy(), fgets(), fscanf(), vfscanf(), snprintf(), vsnprintf()

 

3) 실행 시간 방어

 대부분의 컴파일 시간 기법은 기존의 프로그램을 다시 컴파일해야 한다. 따라서 기존의 취약한 프로그램에 보호를 제공하기 위하여 운영체제의 업데이트로 배포할 수 있는 실행 시간 방어법이 인기를 끌고 있다.

 실행 시점 대응책은 실행가능 주소 공간 보호기법과 주소 공간 임의화 기법 포함.

 실행가능 주소 공간 보호 기법은 실행 코드가 프로세스 메모리상의 특정 위치에서만 실행 될 수 있게 함으로써 공격자가 스택 버퍼에 주입한 실행 코드(셸코드)를 원천적으로 실행될 수 없게 만든다. 대부분의 버퍼 오버플로우 공격은 스택 버퍼에 실행 코드를 주입하므로 재컴파일 없이 기존 프로그램들을 보호하는 데 매우 효과적이다.

 주소 공간 임희ㅗ하 기법은 스택 버퍼가 위치하는 주소 공간을 메모리 내에서 임의적으로 배치함으로써 공격자가 스택 버퍼 속에 주입한 실행 코드의 주소를 예측할 수 없게 만든다. 따라서 실행 코드로의 반환 주소 변경이 매우 어렵게 되어 스택 버퍼 오버플로우 공격이 매우 어렵게 된다.

 

 

2. 포맷 스트링 공격(Format String Attack)

 

1) 개요

 포맷 스트링(Format String)은 C언어의 printf()등의 함수에서 사용되는 문자열의 입,출력 형태를 정의하는 문자열로 서식 문자열이라 표현한다.

 포맷 스트링을 인자로 하는 함수의 취약점을 이용한 공격으로 외부로부터 입력된 값을 검증하지 않고 입출력 함수의 포맷 스트링을 그대로 상요하는 경우 발생할 수 있는 취약점

 공격자는 포맷 스트링을 이용하여 취약한 프로세스를 공격하거나 메모리 내용을 읽거나 쓸 수 있다. 그 결과, 공격자는 취약한 프로세스의 권한을 획득하여 임의의 코드를 실행 할 수 있다.

 

2) 공격원리

 데이터 형태에 대한 불명확한 정의

 

3) 포맷스트링 취약점의 위협요소

 - 프로그램의 파괴

 - 프로세스 메모리 보기

 - 임의의 메모리 덮어쓰기

 

4) 포맷 스트링 공격의 대응책

 함수 사용 시 포맷 스트링을 지정하여 간접적으로 참조가 되도록 한다.

 시스템 패치를 꾸준히 진행한다.

 

 

 

3. 레이스 컨디션 공격

 

1) 기본 개념

 둘 이상의 프로세스나 스레드가 공유자원에 동시에 접근할 때 접근하는 순서에 따라 비정상적인(원하지 않는) 결과가 발생하는 조건/상황을 말한다.

 실행되는 프로세스가 임시파일을 만드는 경우 악의적인 프로그램을 통해 그 프로세스의 실행 중에 끼어ㅓ들어 임시파일을 목적파일로 연결(심볼릭 링크)하여 악의적인 행위를 할 수 있는데 이를 레이디 컨디션 공격이라고 한다.

 만약 프로세스가 setuid 설정이 되어 root 권한으로 실행된다면 권한 상승을 통한 중요 자원(파일)에 접근하는 심각한 문제가 발생.

 

2) 파일 링크

 - 하드 링크

   똑같이 복사된 파일을 만든다.

   

 - 심볼릭 링크

   데이터가 있는 파일으 처믕부터 하나뿐이고, 심볼릭 링크는 단지 원본 파일 데이터를 가리키는 링크 정보만 가진다.

   원본 파일과 심볼릭 링크는 원본 파일이 삭제되더라도 원본 파일의 이름과 위치를 기억하고 계속 그 파일을 바라보는 상태로 남는다.

 만약에 삭제된 원본 파일 대신 처음 원본 파일과는 다르지만 똑같은 경로에 같은 파일명으로 파일을 생성해보면, 심볼릭 링크 파일은 새로 생성된 파일에 여전히 심볼릭 링크 파일로 존재학 된다.

 

3) 심볼릭 링크와 레이스 컨디션 공격

 공격의 대상은 소유자가 root이고, SetUID 비트를 가지며, 임시 파일을 생성하는 파일

 

4) 레이스 컨디션 공격에 대한 대응책

 - 프로그램 로직 중에 임시 파일 생성 후, 임시 파일에 접근하기 전에 임시 파일에 대한 심볼릭 링크 설정 여부와 권한에 대한 검사 과정 추가

 - 가능하면 임시파일 생성하지 않는다.

 - umask를 최하 022정도로 유지하여 임시로 생성한  파일이 공격자에 의해 악의적으로 삭제되지 않도록 한다.

 

 

 

4. 백도어(back door)

 

 시스템의 보안이 제거된 비밀통로

 서비스 기술자나 유지보수 프로그래머의 접근 편의를 위해 시스템 설계자가 고의적으로 만들어 놓은 통로

 

 

 

5. 시스템 자원 고갈 공격(시스템 서비스 거부 공격)

 

1) 개요

 시스템이 보유하고 있는 자원을 선점하거나 모두 고갈하는 방식으로 수행

 ex) 디스크 채우기, 메모리 고갈, 모든 프로세스 죽이기, 프로세스 무한 생성 방법

 

2) 시스템 자원 고갈 공격(System Resource Exhaustion Attack)의 종류

 - 가용 디스크 자원 고갈 공격

 - 가용 메모리 자원 고갈 공격

 - 가용 프로세스 자원 고갈 공격

 - 프로세스 죽이기 공격

 

 

 

6. 리버스 엔지니어링

 

1) 기본 개념

 장치나 시스템의 구조를 분석하여 원리를 발견하는 과정

 

2) 리버스 엔지니어링 공격

 시스템 또는 응용프로그램에 대한 분석 후 해당 시스템이나 응용프로그램이 갖고 있는 취약점을 찾을 수 있으며 이 취약점을 공격할 수 있는 코드를 생성해낼 수 있다.

 

3) 리버스 엔지니어링에 대한 대응책

 - 소스코드 난독화

 - 바이너리 난독화

 

 

 

7. 기타 시스템 보안위협 및 대응책

 

1) 루트킷(rootkit)

 존재의 흔적을 최대한도로 숨기면서 공격자가 언제든지 시스템에 관리자 권한으로 접근할 수 있도록 비밀 통로를 지속적으로 유지시켜주는 일련의 프로그램 집합

 

2) GNU Bash 취약점(ShellShock)

 취약한 버전의 bash는 환경변수의 함수 선언문 뒤에 임의의 명령어를 삽입할 경우 환경변수에 설정된 함수 선언 시 함수 선언의 끝을 인지하지 못하고 삽입한 명령어까지 실행하는 취약점이 존재한다. 이것이 최초 발견된 bash 취약점(ShellShock)이다.

 셸쇼크 취약점에 의해 영향을 받는 프로그램들 중 가장 대표적인 것이 CGI이다. CGI는 User-Agent와 같은 요청헤더정보를 셸의 환경변수에 저장하는데, 공격자가 헤더정보에 함수와 명령어를 추가하여 전송하면 해당 명령어가 실행되는 취약점 발생

 

3) 논리폭탄(logic bomb)

 특정한 사건이 발생할 때 프로그램이나 일련의 코드를 실행

 

 

 

*출처:[알기사] 2019 정보보안기사&산업기사

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

+ Recent posts