천객만래 [千客萬來] (It has an interminable succession of visitors)
출처: 하우리 

PC와 인터넷의 급속한 발전은 우리에게 편리함을 줌과 동시에 수많은 악성코드들을 만들어 냈으며, 해마다 그 악성코드의 양은 크게 증가하고 있다. 독일의 한 안티바이러스 연구기관인 AV-Test.org 에서는 다음과 같은 흥미로운 데이터를 발표했다. 매년 증가하는 유니크한 악성코드 샘플의 통계를 작성하여 발표한 것이다. 2009년 5월을 기준으로 약 2200만개의 누적 샘플 개수를 보이고 있으며, 최근 2~3년동안 매년 약 2배 이상의 증가 추세를 보이고 있다. 




이처럼 악성코드는 백신업체들이 감당하기 힘들만큼 크게 증가하고 있으며, 앞으로 그 양은 점점 더 많아질 것이다. 그럼 이러한 악성코드들을 현재 백신업체들은 어떻게 탐지하고 진단하고 있을까? 먼저 백신업체들은 접수된 샘플들의 악성행위 여부를 판단해야할 것이다. 

1. 악성코드의 일반적인 행위들

바이러스 분석가들은 접수된 샘플의 무엇을 보고 악성코드임을 확인할 수 있을까? 악성코드들은 일반적으로 다음의 행위들을 수행하며, 분석가들은 크게 정적 분석과 동적 분석을 통해 해당 행위들을 식별하게 된다.

(1) 최초 감염

* 취약점(80% 이상)을 통한 최초 파일 생성
악성코드가 최초로 PC에 감염되기 위해서는 어떠한 선행 이벤트가 반드시 수행되어야 한다. 사용자가 이메일의 첨부파일을 클릭한다던지, USB를 PC에 꽂거나 또는 인터넷으로부터 특정 파일을 다운로드하여 실행하는 등의 행위들이 먼저 일어나게 되며, 그러한 행위로 인해 악성코드들이 PC에 감염되게 되는 것이다. 먼저 앞의 이러한 행위들은 대부분 사용자의 부주의로 인해 발생하는 경우가 많다. 하지만 최근의 악성코드 감염은 사용자도 모르게 PC의 운영체제 또는 웹브라우저 등과 같은 애플리케이션의 취약점을 통하여 은밀하게 이루어지고 있으며, 이는 전체 감염 원인의 80% 이상을 차지하고 있다. 따라서 PC의 취약점을 패치하여 제거하는 것만으로도 악성코드 감염의 대부분을 예방할 수 있다.

(2) 파일 생성

* 자신복사, 다운로드, 드롭
악성코드가 최초로 PC에 감염되게 되면, 악성코드의 실체인 파일(자신)을 시스템 어딘가에 위치시키게 된다. 주로 임시폴더에 최초 생성된 악성코드를 시스템폴더로 복사하게 된다. 또한 다른 악성코드를 인터넷에서 다운로드하거나, 자신의 몸체에 담고 있는 다른 악성 파일들을 꺼내어 드롭하는 등의 행위를 수행한다. 



이러한 행위를 하기 위해 사용되는 파일/디렉토리 관련 API들에는 다음과 같은 것들이 있다.

가. 파일 생성 관련 API
- CreateFile
- ReadFile
- WriteFile
- CopyFile
- GetSystemDirectory
- GetWindowsDirectory 




나. 다운로드 관련 API 
- URLDownloadToFileA 



다. 드롭 관련 API 
리소스 섹션 등으로부터 내부의 파일을 드롭할 때 사용된다. 
- FindResourceA 
- LoadResource




(3) 실행되도록 등록 (부팅 시)

* 레지스트리, 서비스, BHO
악성코드는 가능한 시스템에서 오래 살아남아야 하며, 또한 시스템이 시작될 때마다 실행을 시켜줄 수 있는 무언가가 필요하다. 이를 위해 악성코드는 주로 레지스트리, 서비스 등에 악성코드 파일의 경로를 등록한다. 또한 웹 브라우저등이 실행될 때 사용되는 BHO(Browser Helper Object)에 등록하기도 한다.

주로 악성코드가 사용하는 레지스트리의 경로는 다음과 같다.
- HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
- HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
- HKML\SYSTEM\CurrentControlSet\Services

이러한 행위를 하기 위해 사용되는 레지스트리/서비스 관련 API들에는 다음과 같은 것들이 있다.
- RegCreateKey
- RegOpenKeyEx
- RegSetValueEx
- RegQueryValueEx
- CreateServiceA
- OpenServiceA
- StartServiceA 






(4) 프로세스 동작

* 프로세스, 쓰레드, DLL Injection, 서비스
악성코드는 주로 독립적인 프로세스 형태로 동작하거나 다른 정상 프로세스에 Injection되어 쓰레드 상태로 동작한다. 또한 DLL을 Injection하거나 보안 프로그램들을 종료시키기 위해 적당한 프로세스를 검색한다던지 하는 등의 여러 가지 프로세스 관련 행위들을 수행한다.

해당 행위들을 하는 데 관련된 API들은 다음과 같다. 특히 CreateRemoteThread는 DLL 형태의 악성코드를 프로세스에 Injection하기 위해 주로 사용되는 API이다.
- CreateProcess
- FindProcess
- TerminateProcess
- CreateThread
- CreateRemoteThread
- WriteProcessMemory
- ShellExecute
- StartServiceA 






(5) 네트워크 활동

* 포트 오픈, 특정 도메인/포트 접속, IRC 접속 등
악성코드의 가장 활발한 활동은 주로 네트워크 활동으로 나타난다. PC에서 수집한 정보들을 악성코드 제작자에게 전송하기 위해서는 네트워크 관련 활동은 필수적이기 때문이다. 최근의 악성코드들이 개인정보를 절취하는 등의 악성코드인 점을 감안했을 때 네트워크 관련 활동들은 중요하게 다루어질 수 밖에 없다. 또한 악성코드의 전파를 위해서도 네트워크 활동은 꼭 필요하다.

네트워크 활동과 관련하여 사용되는 API들에는 다음과 같은 것들이 있다.
- WSAStartup
- WSASend
- socket
- send
- recv
- listen
- accept
- gethostbyname
- InternetGetConnectedState

(6) 악성행위

* 보안기능 비활성화, 온라인 게임 계정 절취, DDoS, 스팸메일 발송 등
앞서 나왔던 모든 행위들과 관련 API들을 통해 기본적인 악성코드의 행동들을 수행했다면, 다음은 본격적으로 악성코드가 원하는 악성행위들을 수행하는 것이 남았다. 자신을 방해하는 보안 프로그램 및 운영체제의 보안 기능들을 비활성화하거나, 절취하고자 했던 게임 계정 등의 각종 정보를 절취하고, 감염된 수많은 좀비 PC들을 활용하여 특정 서버에 DDoS 공격을 수행하여 서비스를 방해하는 등의 악성행위가 있다. 또한 금전적인 목적으로 돈을 받고 스팸메일을 대신 발송해주는 등의 너무나도 많은 악성행위들이 존재하며 이러한 행위들을 토대로 해당 샘플의 악성코드 여부가 확실하게 판별되며, 악성행위들은 주로 악성코드의 진단명에 영향을 준다. 




2. 악성코드 탐지 기법

바이러스 분석가들이 악성코드의 일반적인 행위들을 식별하여 해당 샘플의 악성코드 여부가 확실하게 가려졌다면 해당 샘플들은 백신제품이 진단할 수 있도록 어떠한 형태로 가공되어야 할 것이다. 일반적으로 백신제품들이 악성코드를 진단하기 위해 사용하는 탐지 기법에는 Signature 기반 탐지 방법과 Heuristic 기반 탐지 방법이 있다.

(1) Signature 기반 탐지

시그니쳐(Signature) 기반 탐지 방법은 악성코드 파일을 유니크(Unique)하게 식별하기 위해 사용되는 방법으로, 시그니쳐는 백신 프로그램이 파일들을 스캔할 때 해당 파일을 유일하게 식별할 수 있도록 사용되는 특정 데이터 부분을 말한다. 여기서 시그니쳐는 패턴이라는 이름으로 불리기도 한다.

대부분의 백신 제품들은 해당 벤더에 알려진 모든 악성코드들을 시그니쳐 형태로 가공한 데이터베이스를 포함하고 있다. 이 데이터베이스는 바이러스 분석가 또는 시그니쳐 제작자들에 의해 식별된 새로운 악성코드들의 시그니쳐들로 정기적으로 업데이트 된다. 제품을 통해 새로운 파일들을 스캔할 때, 데이터베이스로부터 시그니쳐와 파일과의 일치 여부를 확인하게 된다.

다음은 악성코드를 식별하는 오픈소스 프로젝트 도구인 YARA의 시그니쳐 중 일부이다. 특정 String을 시그니쳐로 규정하여 파일에서 해당 String이 일치할 경우 악성코드로 식별하여 탐지하는 방법이다. 



시그니쳐를 설계하고 생성하기 위해서는 먼저 악성코드가 동작하는 운영체제와 파일의 종류들을 식별할 수 있어야 한다. 대부분의 사용자 및 기업의 PC 운영체제 환경이 윈도우(Windows) 시스템을 기반으로 구성되어져 있기 때문에 대부분의 악성코드 또한 윈도우 시스템 기반으로 제작되어 있다. 윈도우 시스템에서는 파일이 실행가능하기 위해서는 PE(Portable Executable)라는 윈도우의 실행파일 형식을 가지고 있어야 한다. 따라서 따라서 대부분의 악성코드가 PE 구조를 가지고 있으며, PE 구조 상에서의 특징을 기반으로 시그니쳐를 생성하는 경우가 많다. 



파일 전체의 데이터를 MD5 및 SHA-1등과 같은 해쉬를 통해 해쉬값을 생성하고, 해당 해쉬값을 시그니쳐로 사용하여 그 값을 비교하는 방법은 쉽게 악성코드를 유일하게 식별할 수 있다. 오진이 거의 없는 탐지 방식이지만, 해당 악성코드 샘플들을 백신 업체들이 모두 보유하고 있어서 해쉬값을 만들 수 있는 경우에만 탐지가 가능하며 악성코드 변종들을 탐지하지 못하는 단점이 있다. 일부 백신제품들에서는 아직도 이 방법을 일부 사용하기도 한다.

일부 변종들이 주로 코드부분은 동일하지만 데이터부분의 데이터들을 조금씩 바꾸는 경우가 많은 것에 착안하여 PE 구조의 코드 섹션 영역만을 해쉬하여 시그니쳐로 사용하기도 한다.

탐지의 속도 및 정확성을 증가시키기 위해 파일의 특정 위치로부터 특정 범위까지의 해쉬값을 시그니쳐로 사용하는 방식은 국내 백신업체들이 가장 많이 사용하고 있는 방식이다. 주로 파일이 실행될 때 코드의 시작지점인 엔트리 포인트를 기준으로 특정 위치를 지정하고, 그 위치로부터 특정 범위의 값을 CRC, MD5 등과 같은 해쉬값으로 계산하여 시그니쳐를 생성하는 방식이다.

일반적으로 시그니쳐 기반의 탐지 방법은 정확성이 매우 뛰어나며, 탐지 속도가 빠른 장점이 있다. 하지만 악성코드 파일이 조금만 바뀌어도 탐지를 할 수 없게 되는 문제가 많으며 변종들에 대한 탐지가 쉽지 않다. 최근의 악성코드의 급격한 증가로 수십, 수백만의 새로운 악성코드들을 모두 수집하여 시그니쳐를 생성하는 데는 무리가 있다. 이에 백신업체들은 자동화된 악성행위 분석 시스템과 시그니쳐 생성 시스템을 운영하여 접수되거나 수집된 샘플들에 대한 시그니쳐를 생성하고 변종과 새로운 악성코드들을 탐지하기에 효과적인 Heuristic 기반 탐지 기법을 병행 도입하여 악성코드에 대응하고 있다.

(2) Heuristic 기반 탐지

휴리스틱(Heuristic) 기반 탐지 방법은 시스템의 룰과 패턴을 사용하여 알려지지 않은 악성코드를 탐지하기 위해 사용하는 기법이다. 대부분의 백신제품들은 시그니쳐 기반 탐지를 보조하기 위해 향상된 탐지와 효율성의 몇가지 형태의 휴리스틱 기법을 사용한다.

시그니쳐를 사용하여 정확하게 탐지되지 않는 악성코드는 정의된 의심스러운 기준들의 휴리스틱 룰셋과 비교하여 탐지하게 된다. 특정한 코딩 기법의 사용, 의심스러운 것으로 생각되는 행위와 구문들과 그러한 의심스러운 행위들의 조합 등을 통해 해당 파일에 대한 위험을 정의한다.

변종 및 유사한 악성코드들을 Generic하게 탐지하기 위해 사용되는 Generic 탐지 기법 또한 일종의 휴리스틱 유형 중의 하나이다. 악성코드를 시그니쳐 기반 방식으로 정확하게 식별하지 못하는 경우에 알려진 악성코드들의 유사성을 고려하여 탐지할 수 있도록 사용된다.

앞서 악성코드의 일반적인 행위들을 살펴보았다. 일반적인 행위들에서 사용된 API들의 사용 빈도와 사용 순서들의 조합을 하나의 룰셋으로 정의하고 일정 임계치를 정의하여 해당 임계치 이상의 사용이 감지될 경우 악성코드로 간주하는 것도 일종의 휴리스틱 기법의 예이다.

윈도우 시스템 상에서의 PE 구조를 갖는 악성코드의 경우 다음과 같은 몇 가지 의심스러운 PE 구조 특징을 정의하고 휴리스틱 진단에 이용하게 된다.

- 코드의 실행이 마지막 섹션에서부터 시작될 경우
- 의심스러운 섹션의 Characteristics
- 의심스러운 엔트리포인트로부터 다른 섹션으로의 이동
- 의심스러운 섹션의 이름

이렇듯 휴리스틱 기반 탐지는 시그니쳐 기반 탐지에 비해 해당 룰셋을 정의하기 위해 사전 연구와 많은 분석 및 테스트가 필요하다. 과거의 백신제품들이 시그니쳐 기반 탐지 방식에 많이 의존하였다면, 최근에는 악성코드의 증가로 새로운 악성코드들의 효과적인 진단을 위해 휴리스틱 기반 탐지 기법에 대한 많은 연구와 활용이 증가하고 있다. 하지만 휴리스틱 기반 탐지 기법은 향상된 탐지 능력과 효율성을 갖게 되는 반면에 탐지 속도가 느려지는 단점이 있으며, 오탐(False Positive)의 가능성이 크다는 단점이 있다. 앞으로 얼마나 이러한 단점들을 극복해낼 수 있느냐에 백신 업체들의 기술력이 판가름 날 것이다.

(주)하우리 기술연구소 기반기술팀 연구원 최상명 

출처: 
http://ssl.hauri.co.kr/customer/security/colum_view.html?intSeq=93&page=2 
Posted by SB패밀리