기사 자격증(알기사, 각종 시스템 보안 위협 및 대응책)

반응형

프로세스 메모리 구조

1. 프로세스 메모리 구조는 스택, , 데이터, 텍스트 영역으로 구분된다.

 - 스택 : 함수 호출 시 생성되는 지역변수, 매개변수가 저장되었다가 함수 종료시 반환되는 영역

 - : 동적 메모리 호출(동적할당)에 의해 호출되는 메모리 영역

 - 데이터 : 전역변수, 정적변수가 저장되어 있는 영역

 - 텍스트 : 프로그램 코드, 상수가 정의되어있는 영역

 

쉘코드

- 오버플로우가 발생하는 버퍼에 저장되는 공격자의 코드

- 실행제어를 이동시킴

- 버퍼 오버플로우의 핵심 공격

 

버퍼 오버플로우 공격

- 프로세스가 정해진 크기의 버퍼 한계를 벗어나 이웃한 메모리 위치에 데이터를 겹쳐쓰려고 시도하는 것

- 할당된 메모리 경계에 대한 검사를 하지 않는 프로그램의 취약점을 이용

스택오버플로우 공격

- 스택 : 후입선출(LIFO) 방식에의해 정보를 관리, TOP이라 불리는 스택 끝부분에서 데이터 삽입과 삭제 일어남, 아랫방향으로 갈수록 커진다.

- 스택 오버플로우 : SetUID가 설정된 루트 권한의 프로그램을 대상으로 스택에 정해진 버퍼보다 큰 공격 코드를 삽입해 반환주소를 변경

- 스택 오버플로우 공격절차

 1. 공격 쉘 코드를 버퍼에 저장

 2. root권한으로 실행된 프로그램의 특정함수 스택 반환주소 버퍼 오버플로우 시켜 공격 쉘 코드 저장되어있는 버퍼 주소 로 덮어 씌운다.

 3. 특정함수 호출 완료시 쉘 코드 주소 반환으로 쉘 코드 실행되고 루트 권한 획득

 

힙 오버플로우 공격

- : 가변적인 양의 데이터를 저장하기 위해 프로그램에 의해 할당되었다가 회수되는 작용 반복, 기억장소는 동적으로 할당받고 회수됨, 메모리 위 방향으로 갈수록 크기 커짐

- 동적 데이터 구조를 위해 사용되는 레코드가 오버플로우에 의해 연속된 메모리가 손상되는 현상

- 스택과 달리 힙은 반환주소가 없지만 할당 공간 함수에 포인터가 포함되어 있다면 공격자는 이 주소를 변경하여 쉘 코드를 가리키도록 할 수 있다.

 

버퍼오버플로우 공격의 대응책

1. 컴파일 시간 방어

 - 프로그램을 컴파일 할 때 검사하여 버퍼 오버플로우를 방지, 발견하는 것

 - 검사 후 기존 프로그램을 다시 컴파일 해야 하는 단점이 있음

2. 실행시간 방어

 - 컴파일 시간 방어의 재 컴파일의 단점을 극복하기 위한 방법(운영체제 업데이트로 배포가 가능)

 

컴파일 시간 방어

1. 프로그래밍 언어 선택 - Java, ADA, Python처럼 버퍼 오버플로우를 발생시키지 않는 언어 선택

2. 안전한 코딩 기법

사용자제를 권장하는 함수

사용을 권장하는 함수

strcat(), strcpy(), gets(), scanf(), sscanf(), vscanf(), vsscanf(), sprinf()

strncpy(), stcncat(), fgets(),fscanf(), vfscanf(), snprintf(), vsnprintf() f,n이 들어가는 함수

 

3. 언어 확장과 안전한 라이브러리 사용

4. 스택 보호 메커니즘

 - 함수의 진입과 종료 코드를 조사해 함수 스택 프레임에 대한 손상이 있는지 판단하는 방식

 - 프로그램 함수 호출시 ret 앞에 canary값을 주입 후 종료 시 canary 값이 변경되었는지 확인하는 방법

 - 적용하기 위해서는 기존의 프로그램들을 모두 새롭게 컴파일 해야함

 

5. 스택 쉴드

 - 함수 시작 시 복귀주소를 특수 스택에 저장해 두었다가 종료 시 저장된 값과 스택의 값을 비교해 다를 경우 오버플로우로 간주

 

실행시간 방어

- 실행가능 주소 공간 보호 : 실행코드가 특정지역에서만 사용하게 함 원천적으로 공격자의 쉘코드를 실행할 수 없게 함

- 주소 공간 임의화 : 스택 버퍼가 위치하는 주소 공간을 메모리 내에서 임의적 배치 공격자가 실행코드가 어디있는지 알 수 없게 함

- 주소 공간의 임의 추출(ASLR) : 프로세스 주소 공간에 있는 중요 데이터의 위치 구조를 랜덤 위치로 조작하는 것

- 실행가능 주소 공간의 보호

 1. 스택과 힙을 실행불능(Non-Excutable Stack)으로 만듦으로써 기존 프로그램을 위한 여러 가지 버퍼 오버플로우 공격 막음

 2. /etc/system파일에 set noexec_user_stack =1, set noexec_user_stack_log=1로 설정

  ※ rtl : 공격자가 실행불능 공격에 대한 대응책으로 실행불능 스택을 우회하는 방법

- NOP sled : 공격자가 스택 버퍼의 맨 끝 부분에 쉘코드를 위치시키고 버퍼의 앞 부분에 의도적으로 NOP를 채워 넣어 쉘코드 위치를 모르게 하는 것

 ※ NOP : 아무 기능도 하지 않는 명령어

 

포맷스트링 공격

- 포맷 스트링 문자를 사용하지 않고 함수를 사용하는 공격으로 ret 값을 변조하여 임의의 코드를 실행함

 ex) printf("%s,char) printf(char)

- 포맷스트링 문자 종류

파라미터

특징

파라미터

특징

%d

정수형 10진수 상수(int)

%o

8진수 양의 정수

%f

실수형 상수(float)

%x

16진수 양의 정수

%lf

실수형 상수(double)

%s

문자열

%s

문자 스트링(char *)

%n

이전까지 출력한 바이트 수 지정변수(4바이트)

%u

양의 정수

%hn

%n의 절반(2바이트)

 

- 포맷스트링 취약점의 위험요소

 1. 프로그램 파괴

 2. 프로세스 메모리 보기

 3. 임의의 메모리 덮어쓰기

- 포맷스티링 공격의 대응책으로 함수 사용시 포맷 스트링을 반드시 지정해 주어야 하며 시스템 패치도 꾸준히 해야 한다.

- 포맷 스트링 취약점 점검 도구

 1. gdb

 2. ltrace

 3. objdump

 

파일링크의 종류

1. 하드링크

 - 원본파일의 복사판

 - 하드링크 파일 수정 시 원래 파일도 똑같이 수정이 됨

 - 두 파일 중 하나만 삭제하면 파일의 내용은 바뀌지 않고 링크 숫자만 줄어듦

 - 두 파일이 각각 동일한 수준의 데이터를 가지기 위해 서로 동기화를 함

 - 링크하고자 하는 파일과 하드링크 파일은 동일 파티션에 존재해야 함

2. 심볼릭 링크

 - 레이스 컨디션 공격에 쓰임

 - 원본파일을 가지고 있는 것이 아닌 원본 파일 데이터를 가리키는 링크 정보만 가짐

 - 원본 파일 삭제되더라도 원본 파일의 이름과 위치를 계속 기억하고 바라보고 있음 

  → 삭제된 원본 파일 대신 원래 파일 경로의 이름이 동일한 다른 파일이 들어온 경우 심볼릭 링크는 그 파일과 연결 됨

 

레이스 컨디션 공격

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

- 실행되는 프로세스가 임시파일을 만든 경우 공격자는 프로세스 실행 중 끼어들어 임시파일을 공격파일로 연결해 악의적 행위 가능

- 또한 root 권한으로 실행 되면 권한 상승을 통해 중요 자원에 접근이 가능하다.

- 레이스 컨디션 공격의 조건

 1. Set UID 설정

 2. 심볼릭 링크

 3. 임시파일 생성 가능

- 레이스 컨디션 공격 대응책

 1. 임시 파일에 접근하기 전 임시파일에 대한 심볼릭 링크 설정 여부와 권한 검사 과정 추가

 2. 임시파일은 가능한 생성하지 않는다.

 3. umask를 최하 022로 설정

 4. sticky-bit 사용

 

백도어

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

- 서비스 기술자나 유지보수 프로그래머의 접근 편의를 위해 시스템 설계자가 고의적으로 만든 보안 구멍

- 백도어를 통해 업무 편의성이 증가

- 악의적인 백도어 = 백 오르피스 PC에 내장되어 사용자 몰래 사용자 정보를 저장, 유출

- 리눅스 / 유닉스에서 root 권한으로 http 데몬이 수행중일 경우 보안에 매우 취약하다

- 백도어, / 바이러스가 자주 사용하는 프로세스

 1. Csrss.exe = 윈도우 콘솔을 관장, 스레드 생성 / 삭제

 2. Explore.exe = 작업표시줄, 바탕화면 같은 사용자 쉘 지원

 3. Lsass.exe = Winlogon 서비스에 필요한 인증 프로세스

 4. Mstask.exe = 시스템에 대한 백업이나 업데이트 토큰 생성

 5. Smss.exe = 사용자 세션 시작 기능 담당하는 프로세스

 6. Spoolsv.exe = 프린터와 팩스 스풀링 기능 담당

 7. Svchost.exe = DLL에 의해 실행되는 프로세스의 기본 프로세스

 8. Services.exe = 시스템 서비스 시작 / 정지하여 그들 간 상호 작용 기능 수행

 9. Taskmgr.exe = window 작업 관리자 자신의 프로세스

 10. Winlogon.exe = 사용자 로그인 / 로그오프를 담당하는 프로세스

  ※ Csrss.exe, Svchost.exe는 공격자들이 가장 애용하는 프로세스이다.

- H-IDS

 1. 호스트 기반 IDS를 이용해 백도어를 탐지

 2. H-IDS를 이용해 checksum을 이용한 무결성 검사도 가능하다

 3. H-IDS의 제공 서비스

  1. 열린 포트 확인

  2. 무결성 검사

  3. 로그검사 수행

- 백도어에 대한 가장 좋은 대응책은 최초의 권한 획득을 허용하지 않는 것이다.

 

시스템 자원 고갈 공격(DOS)

- 시스템 서비스 거부 공격이라고도 불리는 DOS는 시스템이 보유하고 있는 자원을 모두 선점하거나 모두 고갈하는 방식으로 수행된다.

- 대표적인 방법으로 디스크 채우기, 메모리 고갈, 모든 프로세스 죽이기, 프로세스 무한 생성 등이 있다.

 1. 가용 디스크 자원 고갈 공격(디스크 채우기)

#include<unistd.h>

#include<sys/file.h>

void main(){

int fd;

char buf[1000];

fd = creat("/root/termifile" ,0777);

while(1){

write(fd,buf,sizeof(buf); // 버프크기만큼 버프에 fd라는 파일을 생성해 디스크 자원 고갈

}

}

 

 2. 가용 메모리 고갈 공격(메모리 고갈) - 디스크 고갈 공격보다 시스템 자원을 더 많이 차지

#include<stdio.h>

void main(){

char *m;

while(1){

m = malloc(1000); // 동적 할당을 이용해 계속해서 메모리 고갈 시킴

}

}

 

 3. 가용 프로세스 자원

#include<unistd.h>

void main(){

while(1){

fork(); // fork = 프로세스 할당 함수 무한반복으로 프로세스를 만들어 가용 프로세스를 0으로 만듦

return 0;

}

}

 

 4. 프로세스 죽이기 - root 권한으로 스크립트 사용해 사용중인 프로세스를 죽임

#!/bin/sh

sync

kill -15 1

 

리버스 엔지니어링(역공학)

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

- 리버스 엔지니어링 공격으로 공격자는 시스템 또는 응용프로그램에 대한 분석 수행해 취약점을 발견해 공격할 수 있다.

- 리버스 엔지니어링 대응책 난독화

 1. 소스코드 난독화 - 프로그램 소스코드를 알아보기 힘들게 하여 취약점 발견을 어렵게 함

 2. 바이너리 난독화 - 바이너리 역공학을 통한 분석을 어렵게 함

 

루트킷

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

- 루트킷으로 루트 권한 획득 후 모든 서비스를 제어하는 방법

 

GNU BASH 취약점

- 취약한 bash는 환경변수의 함수 선언문 뒤에 임의의 명령어를 삽입한 경우 환경변수에 설정된 함수 선언시 선언의 끝을 인지 하지 못하고 삽입한 명령어까지 실행하는 취약점이 있음

- 공격자는 이 취약점을 이용해 쉘코드를 삽입하여 수행

- 20149월 최초발견된 취약점으로 CVE-2014-6271이라는 취약점 번호가 부여됨

- 셸쇼크라고도 함

- 셸쇼크에 가장 영향을 많이 받는 프로그램은 CGI이다.

 

논리폭탄

- 특정한 사건이 발생할 때 프로그램이나 일련의 코드가 실행되는 것

- 사용자가 특정한 행위를 수행 시 그것의 페이로드 실행을 활성화하는 많은 유형의 트리거를 가질 수 있다.

 

반응형