[정보보안기사/윈도우] 바이러스와 악성코드
바이러스
컴퓨터 바이러스는 컴퓨터 프로그램의 한 종류로 사용자 몰래 은닉하여 정상적인 프로그램이나 사용자의 데이터를 파괴하는 악성 프로그램이다. 컴퓨터 바이러스와 악성코드는 혼동하여 많이 사용되지만, 가장 근본적인 차이점은 자기복제 여부
이다. 즉, 컴퓨터 바이러스는 자기 스스로를 복제하여 증식하는 자기복제 특성을 가지고 있다
제1세대, 원시형 바이러스(Primitive Virus)
- 일반적으로 아마추어 프로그래머에 의해서 개발된 바이러스
- 단순하여 분석이 쉽고 코드의 변형이 없이 고정된 크기를 가지고 있다
- 일반적으로 주기억 장치에 상주해서 부트 영역이나 파일을 감염시키는 특성이 있다
- 돌(Stoned) 바이러스, 예루살렘 바이러스
제2세대, 암호화 바이러스(Encryption Virus)
- 컴퓨터 프로그램의 일부 또는 전체를 암호화 시켜서 백신으로 바이러스 감염 여부를 확인할 수 없게한다.
- 암호화 방식이 일정해서 복호화 방식도 일정하다
- 폭포(Cascade) 바이러스, 느림보(Slow) 바이러스
제3세대, 은페형 바이러스(Stealth Virus)
- 자기 스스로 은폐할 수 있는 바이러스
- 다른 실행 파일에 기생하여 그 실행 파일의 크기를 증가시킨다
- 파일 크기가 변경되기 때문에 백신이 발견하기 쉽다.
- (단, 백신이 감염 여부를 진단할 때 이전 상태를 보여주어서 감염 여부를 확인하기 어렵게 한다)
- 맥가이버(MacGyver) 바이러스, 브레인(Brain) 바이러스, 512 바이러스
제4세대, 갑옷형 바이러스(Armor Virus)
- 다양한 암호화 기법을 사용해서 은폐하는 기법을 사용하기 때문에 어떤 백신도 진단하기 어렵다.
- 바이러스가 프로그램을 변형하기 위해서 100만개가 넘는 방법을 사용한다
- 전문 프로그래머에 의해서 개발되었다
- 진단이나 치료가 불가능하지는 않다
- 다형성(Polymorphic) 바이러스, 자체 변형(Self-encryption) 바이러스
제5세대, 매크로 바이러스
- 엑셀이나 워드처럼 매크로 명령을 사용하는 프로그램을 감염시키는 바이러스
- 전문 프로그래머가 아니어도 누구나 쉽게 만들 수 있고 배포가 가능하다
- 운영체제와 관계없이 응용 프로그램에서 동작하는 바이러스
- Melisa, Laroux, Limda 바이러스
부트 바이러스
컴퓨터 전원을 켜면 디스크에 저장되어 있는 운영체제를 메모리로 로드한다. 이러한 과정을 부팅이라고 하며 부트 정보를 가지고 있는 디스크 영역을 부트섹터라고 한다.
- 부트 바이러스는 부트섹터에 영향을 주는 컴퓨터 바이러스
- 부트섹터에 바이러스가 감염되면 컴퓨터가 부팅되지 않거나 부팅 시간이 오래 걸리게 된다
- 브레인 바이러스, 미켈란젤로(Michelangelo) 바이러스
파일 바이러스
- 사용자가 사용하는 일반 파일에 감염되는 바이러스
- 윈도우의 실행 파일인 COM 혹은 EXE 파일을 감염시킨다
- 파일 바이러스는 기생형, 겹쳐쓰기형, 산란형, 연결형 바이러스로 분류된다
- 기생형
- 원래의 프로그램은 파괴하지 않고 바이러스가 프로그램의 앞 혹은 뒤에 붙어 기생한다
- 바이러스 감염 여부 확인이 어렵다
- 겹쳐쓰기형
- 파일의 앞부분을 겹쳐쓴다
- 원래의 프로그램이 파괴되므로 원래 프로그램은 복구가 안된다
- 산란형
- EXE를 감염시키지 않고 같은 이름으로 COM 파일을 만든다
- 같은 디렉터리에 같은 이름의 EXE와 COM이 있는 경우 사용자가 파일이름을 입력하면 COM이 먼저 실행된다
- 연결형
- 프로그램을 감염시키지 않는다
- 디렉터리 영역에 저장된 프로그램의 시작위치를 바이러스 위치로 변경한다
- 프로그램을 실행하면 원래 프로그램이 아닌 바이러스가 실행된다
- 기생형
부트 및 파일 바이러스
- 부트섹터와 파일영역 모두를 감염시키는 바이러스
- 게킬라, 나타스, 침입자 바이러스
윈도우 DDE 취약점을 이용한 공격
윈도우 DDE 취약점은 DDE의 정상적인 기능을 악용한 것으로 MS Word의 경우 문서를 열 때 자동 연결 업데이트를 해제하면 방어할 수 있다
윈도우 DDE(Dynamic Data Exchange)
- DDE는 윈도우에서 애플리케이션 간에 데이터를 전송하기 위한 프로토콜
- 윈도우 어플리케이션 간에 공유 메모리를 사용해서 데이터를 공유한다
- DDE는 윈도우 및 다른 운영체제 간에 데이터를 공유할 수 있도록 허용한다
Shellcode
Shellcode는 작은 크기의 코드로 소프트웨어 취약점을 이용하는 짧은 기계어 코드이다. 일반적으로 명령 셀을 실행시켜서 피해자의 컴퓨터를 공격자가 통제한다. Shellcode는 어셈블리어로 작성되고 기계어로 번역되어 사용된다.
Heap Spray
Heap Spray는 짧은 기계어 코드인 Shell Code를 Heap 영역에 뿌리는 것으로 Heap 영역에 임의적으로 Shell Code를 삽입하여 실행시키는 공격 기법이다.
생성된 Shell Code는 Visual Studio를 복사한 후 전역변수를 선언해서 대입해야 한다. 그리고 Visual Studio에서 DEP(Data Execution Prevention)을 해제하여 컴파일하면 바로 실행할 수 있다.
ASLR(Address Space Layout Randomizaion)
실행 파일이 메모리에 로드될 때 기본주소는 항상 동일한 주소를 갖는다. 하지만 이렇게 동일한 메모리 주소를 가지면 공격자에게 매우 취약한 문제점이 발생한다. 즉, 주소가 동일하기 때문에 해당 주소에 악성 코드를 적재하기가 쉬워진다.
프로세스가 실행될 때 메모리에 적재되는 기본주소가 항상 동일하면 공격자는 해당 주소를 하드코딩해서 자신의 Shellcode를 임의로 적재하여 악성코드를 실행하게 할 수 있다. 이러한 문제점으로 인해서 윈도우 Vista 부터는 메모리의 주소를 항상 동적으로 할당하게 했다. 즉, 기본주소가 동적으로 할당되는 것이다. 마찬가지로 리눅스에서도 기본주소를 동적으로 사용할 수 있는 시스템 변수가 존재한다.
ASLR을 해제(고정 주소)
sysctl -w kernel.randomize_va_space =
0
ASLR을 설정(동적 주소)
sysctl -w kernel.randomize_va_space =
1
버퍼 오버플로우(Buffer Overflow)
버퍼 오버플로우는 프로세스가 사용 가능한 메모리 공간을 초과해서 발생되는 공격으로 보안 취약점이다. C나 C++를 사용해서 프로그램을 개발할 때 메모리 공간에 제한을 두지 않는 API를 사용해서 발생하는 공격이다.
버퍼 오버플로우 공격을 알기 위해서는 먼저 실행 중인 프로세스가 사용하는 메모리 공간의 구조를 알아야 한다. 프로세스가 사용하는 메모리 공간은 Stack, Heap, Text, Data 로 나누어져 있다.
- Stack
- 프로그램 함수 내에서 사용하는 지역변수가 저장된다
- 함수를 호출하는 경우 되돌아오는 주소인 복귀주소를 가지고 있다
- 함수의 인자 값을 가지고 있다
- 스택 버퍼 오버플로우 공격 : 스택에 저장되어 있는 복귀주소가 지역변수에 의해서 침범당하는 공격
- Heap
- 프로그램 실행 중 메모리를 동적으로 할당하는 경우 힙 영역에 할당된다
- 동적 메모리 할당 함수를 사용해서 메모리를 할당하면 힙 영역에 할당된다
- 힙 버퍼 오버플로우 공격 : 힙 영역은 하위주소에서 상위주소로 메모리를 할당한다. 그러므로 경계 값을 검사하지 않고 메모리를 사용하면 경계를 초과하는 취약점이 발생한다.
- Text
- 읽기만 가능한 메모리 영역
- 프로그램의 코드가 저장된다
- Data
- 선언된 전역변수, 정적변수가 저장된다
- 데이터 영역에 변수가 선언되면 자동으로 초기화된다
버퍼 오버플로우에 취약한 C언어 함수들은 다음과 같다. 이들 함수의 공통점은 길이제한을 두는 기능이 없다는 것이다.
- strcpy(char* dest, const char* src)
- strcat(char* dest, const char* src)
- getwd(char* buf)
- gets(char* s)
- fscanf(FILE* stream, const char* format, …)
- scanf(const char* format, …)
- sprintf(char* str, const char* format, …)
버퍼 오버플로우를 방지하기 위해서 사용을 권고하는 C언어 함수는 다음과 같다
- strncat()
- strncpy()
- fgets()
- fscanf()
- vfscanf()
- snprintf()
- vsnprint()
버퍼 오버런(Buffer Overrun)
메모리 공간에 할당된 공간보다 더 큰 데이터를 입력하면 프로그램의 오류를 유발할 수 있다. 즉, 공격자는 프로그램의 오류를 유발하여 시스템을 장악하거나 Shellcode를 복사하여 악성코드를 실행한다.
경쟁조건(Race Condition)
경쟁조건이란 다중 프로세스 환경에서 두 개 이상의 프로세스가 동시에 수행될 때 발생되는 비정상적인 상태를 의미한다. 즉, 임의의 공유자원을 여러 개의 프로세스가 경쟁하기 때문에 발생한다.
APT(Advanced Persistent Threat) 공격
특정 기법 및 조직을 대상으로 다양한 공격 기법을 사용하여 지속적으로 공격을 수행하는 행위를 APT 공격이라 한다.
APT는 사회관계망 서비스(SNS)를 사용하여 정보수집, 악성 코드 배포를 수행하고 공격 표적을 선정하여 지속적으로 공격을 수행하는 것이다.
Zero Day Attack은 소프트웨어 패치 전에 취약점을 이용한 공격이고 MAIL APT는 악성 코드를 메일에 첨부하여 발송하고 이를 통해 정보를 획득하는 공격이다. 백도어 APT는 표적에 침투 후 백도어를 설치하여 재침입 시에 유입경로를 열어두는 것이다.
APT 공격 단계
- 침투(Incursion) : Email, USB, 웹사이트를 통한 악성코드 등
- 탐색(Discovery) : Network 정보, 시스템 정보, 계정 정보 및 DB/시스템 구조에 대한 정보
- 수집/공격(Capture/Attack) : 목표로 한 데이터 수집 혹은 시스템 공격
- 유출(Exfiltration) : 분석 및 추가 공격 혹은 금전적 이익을 취하기 위해 정보 유출
바이너리 디핑(Binary Diffing)
APT 공격이 아닌 Zero Attack 취약점을 찾을 수 있는 기법이다. 리버스 엔지니어링 분야에서 활용되는 분야로 디핑 기술을 이용하여 스크립트된 바이너리 함수 정보를 획득한다. 즉, 자동으로 Malware을 탐지하고 오픈소스 라이선스 준수여부를 확인할 수 있다.
댓글남기기