Korean Institute of Information Technology
[ Article ]
The Journal of Korean Institute of Information Technology - Vol. 19, No. 4, pp.125-134
ISSN: 1598-8619 (Print) 2093-7571 (Online)
Print publication date 30 Apr 2021
Received 09 Feb 2021 Revised 15 Apr 2021 Accepted 18 Apr 2021
DOI: https://doi.org/10.14801/jkiit.2021.19.4.125

윈도우 API 의존 관계 그래프를 이용한 악성코드 인텔리전스 시스템 구축

이건호* ; 유찬곤**
*국방과학연구소 현역파견원(교신저자)
**국방과학연구소 책임연구원
Malware Intelligence System based on Windows API Dependency Graph
Kunho Lee* ; Changon Yoo**

Correspondence to: Kunho Lee Agency for Defense Development Tel.: +82-2-3400-2708, Email: xien0114@add.re.kr

초록

사이버 공간을 위협하는 악성코드는 지속적으로 증가하고 있으며, 증가속도 또한 점차 가속화되고 있다. 기하급수적으로 증가하는 신변종 악성코드는 전혀 새로운 기술을 사용하기보다 기존 악성코드를 재사용하는 경우가 많아, 기존 악성코드를 분석 후 분석결과를 활용한다면 신변종 악성코드에 대한 대응능력을 강화할 수 있다. 본 논문은 윈도우 환경에서 실행되는 악성코드의 효율적인 분석을 위해 API 의존 관계 그래프(ADG, API Dependency Graph)를 기반으로 기존 악성코드의 기능적 특징을 분석하고, 분석된 결과를 토대로 패밀리를 분류하여 새로운 악성코드의 기능적 특징을 추론하는 기법을 제안한다. 이러한 기법을 적용한 결과 기존의 타 연구 결과에 비해 기능적 유사도가 높은 패밀리가 구성되는 것을 확인할 수 있었다. ADG를 활용하면 API 함수 호출 시 사용되는 리턴 값과 입력 매개변수 간의 관계를 추적하여 의미적으로 연관된 API만을 모아 패턴분석을 할 수 있으므로 좀 더 정확한 분석이 가능하다는 결론을 얻을 수 있다.

Abstract

Malicious codes that threaten cyberspace continue to increase. The rate of increase is also gradually accelerating. However, the new malicious codes often reuse existing malicious codes rather than utilizing completely new technologies. So, if we analyze the malware and use the result of the analysis that is called Malware Intelligence(MALINT), we can enhance the ability to respond to new malicious codes. This paper suggests a new method to analyze malware sets based on API Dependency Graph(ADG) for efficient and accurate analysis of malicious codes executed in the Windows environment and to infer functionalities of new malicious code. For the result of this new method, we made a malware family which has higher functional similarity than other researches. By use of ADG, a more accurate analysis can be made by analyzing the relationship between APIs and tracking the return value and input parameters of the APIs.

Keywords:

API dependency graph, malware analysis, malware intelligence, malware classification

Ⅰ. 서 론

악성코드 제작 기술의 발달로 신변종 악성코드의 출현 속도가 점차 빨라지고 있다. 악성코드 제작 도구를 사용하면 악성코드에 대해 깊은 지식이 없는 초보자도 간단히 악성코드를 제작할 수 있어 새로운 악성코드의 등장을 가속화하고 있다. 이러한 문제에 효율적으로 대처하기 위해 자동화된 악성코드 분석기술은 필수적이며 이에 대한 연구가 활발히 진행 중에 있다.

악성코드 분석기술은 크게 정적분석과 동적분석으로 구분된다. 정적분석은 악성코드 실행 없이 PE 파일의 구조를 분석하여 악성코드 여부 판정, 악성코드 간 유사도 분석 등을 수행하는 분석 기법이다. 분석시간이 동적분석에 비해 상대적으로 빠르고 분석환경에 대한 민감도가 적은 장점이 있으나 패킹된 악성코드의 경우 언패킹을 하지 않으면 분석이 사실상 불가능하다는 단점이 있다.

동적분석은 악성코드 실행을 통해 악성코드가 실제로 수행하는 다양한 행위를 모니터링하는 악성코드 분석 기법이다. 실제 악성코드의 행위를 자세히 관찰할 수 있는 장점이 있으나 악성코드를 실행하는 분석 환경에 따라 다른 행위를 보이는 문제, 악성코드가 분석환경을 인식 후 악성행위를 하지 않는 문제, 악성코드 실행에 소요되는 시간이 오래 걸리는 문제와 같은 단점이 존재한다. 따라서 정적분석과 동적분석 중 분석 목적에 적절한 방식을 상호보완적으로 사용해야 한다.

이러한 동적분석과 정적분석에서 공통으로 주목하는 정보는 악성코드가 사용하는 API 정보이다. 악성코드도 윈도우 환경에서 실행되는 프로그램이므로 윈도우 API를 호출하여 다양한 행위를 수행한다. 악성코드 동적분석에서는 API가 호출되는 순서와 그 순서의 패턴을 분석하여 악성여부 및 유사도 분석 등을 수행하며, 정적분석에서는 API 함수 간 호출 구조를 분석하는 방법을 사용한다.

본 연구에서는 정적 API 호출구조를 기반으로 악성코드의 기능을 분석하는 방법을 제시한다. API 호출구조를 좀 더 정확히 분석하기 위해, API 리턴값과 매개변수 사이의 데이터의존성이 있는 API 의존 관계 그래프(ADG, API Dependency Graph)를 추출하고 그 정보를 다량 수집하여 인텔리전스를 생성한다. 이후 이를 활용하여 새로운 악성코드의 기능을 분석하거나 악성코드들을 분류하여 신변종 악성코드에 대응하는 기술을 마련한다. 본 논문의 구성은 다음과 같다. 2장에서 관련연구를 간략히 기술하고, 3장에서 API 의존 관계 그래프에 대해 설명한 후 4장에서 이를 기반으로 한 악성코드 인텔리전스 생성과 관련 분석 기법을 제시하고 제안 기법과 기존 기법 간 비교분석을 진행한다. 이후 5장에서 결론을 맺는다.


Ⅱ. 관련 연구

2.1 행위 기반 악성코드 기능 식별

기존에 악성코드를 탐지하기 위해 사용하는 백신들은 시그니쳐 기반의 탐지법을 기본적으로 사용하며, 이는 새롭게 등장한 악성코드들에 대해 즉각적으로 대응하는 것이 불가능하다. 따라서 이를 보완하기 위해 행위 정보를 기반으로 악성코드의 기능을 식별하는 연구가 많이 진행되어왔다. Rieck 등[1]은 샌드박스 환경을 활용해 API 행위 정보를 수집하여 악성코드 분류를 위한 공통적인 패턴을 식별, 학습하는 기법을 제안하였다. 또한, Kolbitsch 등[2]은 샌드박스 환경을 활용해서 API 행위 정보 간의 데이터 의존 관계를 그래프로 표현하여 이를 기반으로 악성코드와 그 탐지명을 대응시키는 기법을 제안하였다. 그러나 두 연구 모두 동적 분석의 문제점인 샌드박스 우회 기능에 대응할 수 없고, 패턴 학습을 위하여 다량의 악성코드를 처리하기에는 컴퓨팅 자원과 시간이 많이 요구된다는 한계점이 존재한다.

Kim 등[3][2]와 마찬가지로 의존 관계 그래프를 기반으로 악성코드를 탐지하는 기법을 제시했으나, API 의존이 아닌 변수에 대한 의존 관계 그래프를 생성한다. 그러나 알고리즘이 많은 계산 자원을 필요로 하여 개선할 필요성이 있으며, 변종을 생성하는 규칙을 정의하고 분석하기 때문에 정의되지 않은 규칙을 활용할 경우 효과가 없다는 한계점이 존재한다.

Lee 등[4]은 코드 그래프라는 개념을 제시하였다. 바이너리의 시스템 콜 시퀀스를 추출하여 이를 그래프로 생성한 후, 각 시스템 콜을 32개의 객체와 4가지의 동작으로 조합되는 128개의 그룹으로 분류하여 대응시킨다. 이렇게 만들어진 코드 그래프를 활용해 변종 악성코드 식별에 활용할 수 있음을 보였다.

Zhang 등[5]은 안드로이드 환경에서 다양한 앱들에 대한 바이트코드 레벨 정적 분석을 통해 가중치가 부여된 API 의존 관계 그래프를 생성하고, DB를 구축하여 임의의 앱에 대한 그래프 유사도를 측정할 수 있게 해 기존 앱에 대한 정보가 존재할 경우 난독화된 악성코드에 대한 탐지를 가능케 한다. 본 논문은 해당 연구를 참조하여 윈도우즈 환경에서 바이너리 레벨 정적 분석을 통해 API 의존 관계를 추출하여 분석에 활용하였다.

2.2 악성코드 분류

Xu 등[6]은 악성코드 별 정적 특징을 추출하여 이를 기반으로 악성코드를 군집화하는 MutantX-S 프레임워크를 개발하였다. 정적 특징으로는 악성코드의 행위를 그대로 볼 수 있는 opcode를 채택하였으며, opcode의 hex값을 인코딩하여 군집화 과정의 특징 벡터로 활용하였다. 또한 개별의 opcode가 아닌, n개의 opcode를 연쇄적으로 분류한 n-gram 개념을 도입하여 활용하였으며 해당 논문에서는 n=4를 최적의 해로 결론짓고 분석에 활용하였다.

한편 Raff 등[7]은 opcode 단위가 아닌 바이트 단위로 n-gram을 추출하여 이를 기반으로 악성코드 분류를 시도하였다. 40만 개 이상의 바이너리 셋에 존재하는 6-gram을 모두 추출한 후, 빈도수 등의 지표들을 통해 분석 가치가 있는 상위 200,000개의 6-gram을 선택하고 이를 처리한 후 군집화를 수행하였다. 또한 [8]을 통해 byte n-gram과 opcode n-gram의 성능을 비교하고 개선된 opcode n-gram 분류 기법을 제시하였다.

Sebastian 등[9]은 대량의 신변종 악성코드를 빠르게 분류할 수 있도록 AV 벤더에서 제공하는 패밀리명을 모두 모아 가장 가능성이 높은 레이블을 샘플에 지정하고, 레이블들을 구성하는 단어들을 토큰화시켜 이를 기반으로 새로운 악성코드를 분류하는 AVClass 기법을 제시하였다.


Ⅲ. ADG

ADG는 프로그램의 행위 정보를 반영하기 때문에 행위 그래프라고도 불린다. 프로그램 내 API 호출 순서에 따라 생성되는 API 콜 그래프와는 달리 API 간 데이터 의존 관계가 반영된다.

기존 API 기반의 악성코드 분석기법은 악성코드가 사용하는 API 목록을 기반으로 분석을 진행하나 단순한 API 목록 정보는 악성코드가 수행하는 단위기능 분석에는 부적합하다. 따라서 본 연구에서는 분석 대상 악성코드의 기능을 식별하기 위해 API의 출력 값과 매개변수의 입력 간 의존관계를 분석한 정보를 담은 ADG를 기반으로 기능 분석 및 패밀리 식별을 진행한다. 이를 통해 기존의 분석 기법보다 기능정보 분석에 있어서 더 유용한 정보를 제공할 수 있다.

API 의존 관계 그래프에서의 노드는 API 시스템 콜로 구성되며, API A의 반환 값이 API B의 인자로 사용될 때 노드 A에서 노드 B로 향하는 엣지(Edge)를 연결한다. 즉, 이 때 연결되는 엣지는 API A와 API B 사이의 데이터 의존 관계를 나타낸다.

그림 1은 악성코드의 API 의존 관계 그래프의 한 예를 나타낸다. NtConnectPort() API의 리턴값이 NtRequestWaitReplyPort() API로 입력되며, NtCreateFile() API의 리턴값은 NtWriteFile() API의 매개변수로 입력됨을 나타낸다. 이렇게 API 간 데이터 의존관계를 파악함으로써 악성코드가 주로 사용하는 의미 없는 코드(Meaningless code)를 삽입하거나 의존 관계가 없어서 호출 순서를 바꾸어도 동작하는데 문제가 없는 API의 호출 순서를 바꾸는 행위에 대해 강건하게 대처할 수 있다. API 의존 관계 그래프로 형성된 API들은 호출 순서가 바뀌게 되면 제 기능을 하지 못하게 되므로 난독화를 거쳐도 변종 악성 코드의 API 의존 관계 그래프는 원본 악성 코드의 것과 거의 유사하거나 동일하다.

Fig. 1.

An example of API dependency graph by malicious code

정적 분석을 통한 API 의존 관계 그래프 추출은 데이터 흐름 분석 기법을 활용하여 진행된다. 데이터 흐름 분석이란 컴퓨터 프로그램 내 특정 지점에서 변수들이 가질 수 있는 값들의 집합에 대한 정보를 모으는 분석 기법이다. 이러한 정보를 모으기 위해 프로그램의 CFG(Control Flow Graph)를 활용한다.

데이터 흐름 분석을 위해 CFG를 생성하는 과정은 라이브 변수 분석과 도달 정의 분석이라는 두 가지 기법이 대표적으로 존재하며, 본 연구에서는 그 중 도달 정의 분석 기법을 활용한다. 도달 정의 분석에서는 프로그램의 특정 지점에서 정의된 변수들이 잠재적으로 다른 지점까지 닿을 수 있는 범위의 집합을 계산하여 이를 단위 노드로 묶어낸다.

이렇게 CFG를 API 의존 관계 그래프 추출에 활용하기 위해 우선 프로그램의 의사 코드를 추출한다. 디컴파일러를 이용하여 바이너리 내 어셈블리어를 C 문법의 의사 코드로 변환하며, 본 연구에서는 IDA Pro에 내장되어있는 IDAPython이라는 파이썬 스크립트를 실행할 수 있는 인터프리터를 활용하여 이 작업을 수행하였다.

이후, 파이썬 오픈소스 라이브러리인 Pycparser를 이용하여 AST(Abstract Syntax Tree)를 생성한다. 생성된 AST를 분석하여 if, while, break 구문 등을 분류하여 기준에 맞게 CFG를 생성한다. 그림 2는 일련의 과정을 거쳐 의사 코드로부터 생성한 CFG의 예시이다. 명령어 구문들이 단위 노드로 분리되어 연결되어 있는 것을 확인할 수 있다.

Fig. 2.

An example of control flow graph by malicious code

이렇게 생성한 CFG를 통해 API 의존 관계 그래프를 추출하는 과정은 두 단계로 진행된다. 첫 번째 단계에서는 worklist 기반의 반복문을 수행하는 작업으로 call-assignment 구문을 발견하면 이에 대한 정보를 worklist 큐에 삽입하고 큐에 있는 원소들을 하나씩 꺼내어 데이터 흐름 분석을 진행하며 그래프를 생성한다. 두 번째 단계에서는 첫 번째 단계에서 생성된 그래프 중에서 노드가 API가 아닌 서브루틴(사용자 정의 함수)인 원소들에 대하여 분석을 진행한다.

3.1 Call-Assignment 구문 분석

Call-assignment 구문 분석에서는 CFG 내의 구문들을 한 줄씩 탐색하면서 v = X(a, b)와 같은 함수를 호출하고 그 반환값을 변수에 할당하는 call-assignment 구문이 있는지 확인한다. 이러한 구문을 발견하면 (v, X, 해당 구문의 위치)를 tuple 형태로 worklist 큐에 삽입한다.

CFG 구문 탐색이 끝나고 worklist 큐가 완성이 되면 worklist 큐에 있는 원소들을 차례로 하나씩 꺼내면서 반복문을 수행한다. 분석은 노드 단위로 진행이 되며 변수 v에 대해 X가 호출되어 v에 반환값이 할당되는 시점부터 도달 정의 분석을 진행하게 된다.

분석을 종료하는 시점은 v가 더 이상 사용되지 않는 시점이며, v가 노드의 마지막 부분을 넘어서도 사용될 경우에는 노드의 하위 노드들에 대해서 분석을 반복하게 된다. 이때도 마찬가지로 CFG 내 마지막 노드들까지 도달하거나 하위 노드들의 전부에서 v의 사용이 완료되는 경우 분석이 종료된다. v = v + w와 같이 v의 활용이 끝남과 동시에 새롭게 정의되는 경우는 v에 대한 정보가 남아있다고 판단하여 분석을 종료하지 않고, w = v와 같이 할당이 될 경우에만 종료된다고 판단한다. 분석이 종료되기 전까지는 Y(v) 또는 w = Y(v)와 같은 v를 인자로 가지는 call 구문이나 call-assignment 구문이 발견될 때 X에서 Y로 향하는 엣지를 연결한다. 이는 API 의존 관계 그래프 리스트에 (X, Y) 형태의 tuple을 삽입하는 것으로 표현한다.

그림 2의 CFG를 예시로 들면, 1번 노드와 2번 노드에서 v1 = OpenHandle(a) 형식의 구문을 발견할 수 있고, 해당 노드들의 하위 노드인 3번 노드에서 CloseHandle(v1) 구문으로 v1이 할당되는 것을 볼 수 있다. 따라서 OpenHandle API에서 CloseHandle API로 이어지는 엣지를 ADG에 추가할 수 있다.

3.2 서브루틴 처리

Call-assignment 구문 분석에서 생성되는 그래프는 노드가 API뿐만 아니라 바이너리에서 정의된 서브루틴까지 포함되어 있다. 따라서 서브루틴을 분석하여 API로 치환하는 추가 작업이 필요하다. 따라서 1단계에서 생성된 그래프의 원소 (X, Y) 중 X 또는 Y 둘 중 하나 이상이 API가 아닌 서브루틴인 원소들을 모아서 큐를 만든다. 그 후에 큐에 있는 원소들을 하나씩 꺼내어 반복적으로 분석을 진행한다.

Fig. 3.

Call-assignment syntax analysis pseudocode

Fig. 4.

Subroutine handle pseudocode

이 때 엣지가 나가는 X가 서브루틴인 경우와 엣지가 들어오는 Y가 서브루틴인 경우를 나누어서 다르게 분석해주어야 한다. X가 서브루틴인 경우에는 X 내에서 반환하는 값에 대해 역방향으로 분석하여 반환값이 API 호출에 의한 값이면 X를 해당하는 API로 치환하고, Y가 서브루틴인 경우는 Y 내에서 변수 v를 인자로 사용하는 API가 존재하면 Y를 해당 API로 치환한다.

그림 2의 CFG에서는 서브루틴을 발견할 수 없다. 그러나 CloseHandle API가 3번 노드가 아닌 sub_40574E 함수에서 호출되고 3번 노드에서 v1을 인자로 같이 넘겨준다면, 기존에 OpenHandle API에서 sub_40574E 함수로 연결되는 엣지가 OpenHandle API에서 CloseHandle API로 이어지는 엣지로 수정될 것이다.


Ⅳ. ADG 기반 악성코드 인텔리전스 구축

본 절은 악성코드 집합으로부터 ADG를 추출한 후 악성코드 인텔리전스를 구축하는 절차를 기술한다. 각 악성코드로부터 추출된 ADG 집합을 대상으로 유사한 ADG끼리 군집을 형성한 후, 각 ADG 군집을 대표하는 대표 ADG(RADG, Representative ADG)를 추출하고 RADG를 분석가가 분석하여 기능명칭 레이블링을 작성한다. 이후 분석대상 악성코드의 기능을 식별하기 위해 ADG를 추출하고 추출된 ADG와 RADG를 매칭하여 매칭된 RADG의 기능명칭 레이블을 통해 분석대상 악성코드의 기능을 식별할 수 있다.

본 연구에서는 APT, Backdoor, Downloader, Keylogger 등 다양한 유형을 지닌 12,000개의 악성코드에서 추출한 ADG들을 기반으로 악성코드 인텔리전스를 구축하였다.

4.1 ADG 클러스터링

존재할 수 있는 모든 ADG에 대해 의미를 부여하는 것은 현실적으로 불가능하기 때문에 유사한 ADG들을 클러스터링으로 묶어 군집화 과정을 수행한다. 그래프 군집화 모델로는 k-means 알고리즘[10]을 사용하였고, 이 때 필요한 유사도 측정 기법으로는 Jaccard Index를 사용하였다.

클러스터링 진행 과정은 다음과 같다. 우선 k개의 랜덤한 ADG를 선정하여 각 클러스터의 중심값으로 설정한 이후, 남은 ADG를 하나씩 선택하여 Jaccard Index를 통해 계산된 가장 가까운 클러스터에 할당하고 해당 클러스터의 중심값을 갱신하는 행위를 반복한다.

이 때 중심값 갱신에는 그림 5와 같은 빈도수를 고려한 그래프 합집합 모델을 활용한다. 모든 ADG의 간선을 2차원 배열화시켜 합한 후 빈도수에 따라 0 또는 1로 표현해 중심값을 갱신한다.

Fig. 5.

An example of graph union model considered by frequency

이 때 적정한 클러스터 개수 k를 선정해야 하는데, k의 숫자가 작아지면 그래프가 밀집되어 서로 연관성이 없는 API가 하나의 그래프로 묶이거나 중요한 기능적 특징을 가지는 API가 누락되는 현상이 발생할 수 있다. 한편 k의 숫자가 커지면 API가 기능 단위로 하나의 그래프로 뭉쳐지지 않고 파편화되는 현상이 발생할 수 있기 때문에 적정한 k를 찾아내는 것이 매우 중요하다. 그러나 이를 정량적으로 평가하는 것 역시 불가하다. 일반적인 k-means 알고리즘은 inertia 값 등을 활용하여 군집화가 제대로 되었는지를 확인하지만, 여기서는 단순히 정점들이 제대로 뭉쳐있는지가 아닌, 정점들이 뭉친 군집에 기능적 의미가 존재해야하기 때문이다. 따라서 k 값에 다양한 값을 대입하여 군집 시행한 후 우수한 결과를 선택하는 방식을 택해야 한다.

이렇게 ADG들을 k개의 클러스터로 분류하는 과정이 끝나면 하나의 클러스터에 다양한 ADG들이 존재하게 되는데, 해당 ADG들 중 중심값에 가장 가까운 ADG를 대표 ADG(Representative ADG, RADG)로 선정한다. 그리고 RADG가 개별 악성행위의 의미를 지닌 ADG인지, 파편화되거나 별개의 악성행위가 뭉쳐져 있는 ADG는 아닌지 파악해 최적의 결과를 보이는 k를 찾아내야 한다. 이를 통해 k=300을 채택하였다.

이렇게 추출된 RADG들은 악성코드 분석가에 의해 기능명과 그에 대한 설명이 부여되어 누구나 쉽게 그 의미를 파악할 수 있게 되고, 특정 악성코드의 ADG를 추출하였을 때 유사한 RADG에 대응되어 해당 악성코드가 어떤 악성 행위를 수행하는지 분석할 수 있다.

4.2 악성코드 패밀리 분류

분석된 악성코드를 유사한 악성코드끼리 묶어 패밀리를 구성해 놓으면 신변종 악성코드 분석 시 효율성을 높일 수 있다. 여기서 유사성의 기준에 따라 다양한 패밀리가 형성될 수 있으며, 본 논문에서는 악성코드가 수행하는 기능을 기준으로 유사한 기능을 수행하는 악성코드끼리 패밀리를 분류하는 방법을 제시한다.

악성코드가 수행하는 기능을 기반으로 한 패밀리 분류를 위해 악성코드들에서 ADG를 추출한 다음 추출한 ADG와 RADG를 매칭하고, 매칭된 RADG를 인덱스로 하여 벡터화 과정을 수행한다. 이후 k-means, Spectral 군집화, 계층적 군집화의 3가지 클러스터링 알고리즘을 활용하여 어떤 특징을 가지는지, n-gram 기반, AVClass 기반의 군집 모델과 어떤 차이점을 보이는지에 대해 분석하였다.

ADG 클러스터링 때와 마찬가지로 이번에도 클러스터 수가 커지면 유사한 악성코드가 다른 군집으로 분류될 가능성이, 클러스터 수가 작아지면 유사하지 않은 악성코드가 같은 군집으로 분류될 가능성이 커진다. 이 때문에 k에 다양한 값을 대입하여 클러스터 내 악성코드 간 기능적 유사도 식 (1)를 측정했으며, 이 때 기능적 유사도는 Jaccard Index를 활용하였다.

Simk=i=1kJFik(1) 

그림 6은 클러스터 수 변화에 따른 동일 클러스터 내 악성코드 간 기능적 유사도를 나타낸 그래프이다. k=200까지는 기능적 유사도가 급격하게 증가하지만, 이후로는 증가 폭이 감소함을 볼 수 있다.

Fig. 6.

Functional similarity between malware in same cluster by cluster number change

클러스터 수의 증가에 따라 유사한 악성코드가 다른 군집으로 분류되는 사례가 많아진다는 점을 감안할 때, 수를 200개로 끊어서 활용하는 것이 합리적이라는 결과를 도출할 수 있다.

이후 악성코드의 기능적 유사도면에서 각 군집모델의 성능비교를 수행했다. 표 1은 n-gram, AVClass, ADG 기반의 악성코드 패밀리를 각각 구성했을 때 군집알고리즘 별 동일 패밀리 내 악성코드 간 기능적 유사도를 측정한 결과를 보여준다. 패밀리 분류를 위한 입력데이터로 n-gram를 사용한 경우 계층적 군집알고리즘을 사용했을 때 39%로 가장 높은 기능적 유사도 군집결과를 보였으며, AVClass 사용 시 Spectral 군집알고리즘 적용 시 가장 높은 62.3% 기능적 유사도 군집결과를 보였다. 반면, ADG를 사용한 경우 세 가지 군집 알고리즘에서 70% 이상의 기능적 유사도를 보였다.

Functional similarity of clustering model and algorithm

n-gram 모델은 opcode의 통계적 분포 빈도수를 기반으로 군집화를 수행하기 때문에 API 수준에서의 기능적 유사도가 낮게 나온 것으로 분석된다. AVClass 모델의 경우에는 여러 AV의 진단명을 기준으로 패밀리를 분류하기 때문에 수행 기능이 다른 악성코드라 하더라도 유사한 진단명을 가진 악성코드의 경우 동일 패밀리로 분류되기 때문에 기능적 유사도가 낮은 것으로 분석된다. 반면 ADG를 기반으로 패밀리를 분류하는 경우 사용하는 유사한 ADG를 갖는 악성코드가 동일 패밀리로 구성되므로, ADG를 사용하여 패밀리를 분류할 때 기능적 유사도가 제일 높은 것으로 분석된다.

4.3 사용 예시

그림 7은 임의의 악성코드를 선택하여 ADG를 추출한 결과를 나타내고, 표 2는 추출된 ADG와 RADG를 매칭하여 기능을 식별한 결과를 보여준다.

Fig. 7.

Lists of ADG by particular malware

Matching results by ADG and RADG from Fig. 7

분석 대상 악성코드의 ADG를 분석해 기 식별된 패밀리 중 소속 패밀리를 찾는 과정은 다음과 같다. 분석 대상 악성코드의 ADG와 각 패밀리 구성 시 군집 알고리즘에서 사용한 각 군집의 군집중심값을 비교하여 소속 패밀리를 식별한 후, 패밀리 내에서 가장 유사한 악성코드를 찾아 연결 관계를 구성한다. 이를 모식도로 표현한 것이 그림 8이며 분석 대상은 빨간색으로 강조되어 있다.

Fig. 8.

Analyzed malware’s malware family relationship


Ⅴ. 결론 및 향후 과제

본 논문에서는 정적 분석을 기반으로 API 의존 그래프(ADG)를 추출한 후 이를 기반으로 인텔리전스를 구축하여 악성코드의 기능을 추론하는 방안과 새로운 개념의 악성코드 군집을 제안하였다. 이를 통해 기 분석되지 않은 신변종 악성코드의 기능을 자동으로 식별하고, 군집 모델 식별을 통해 유사한 기능을 가진 기존 악성코드들을 확인함으로써 빠르게 이에 대처할 수 있다.

또한 본 연구에서 제시한 악성코드 군집 모델은 기존의 n-gram 기반이나 AVClass 기반의 악성코드 군집과 큰 차이를 보인다. 분류하는 방법을 감안해보았을 때 타 군집 모델에 비해 좀 더 기능적 응집성을 보일 수 있는 것이 본 모델의 특징이다.

한편 본 제안방법은 RADG에 부여하는 기능레이블과 기능명세의 품질에 따라 기능분석의 결과가 결정된다. 그러나 RADG는 API 함수 간 호출순서를 나타낼 뿐 매개변수의 값(Value)을 확인할 수 없어, 분석가가 RADG만을 보고 기능레이블 및 명세를 작성하기에 충분한 정보가 제공되지 않는다. 또한 유사한 ADG끼리 클러스터를 구성하는 클러스터 알고리즘과 클러스터의 수에 따라 RADG가 결정되므로, 적절한 단위기능으로 나눠질 수 있도록 최적의 RADG 수와 클러스터 모델을 찾는 작업이 이루어져야 한다.

이러한 점을 극복하기 위해 후속 연구에서는 대량의 악성코드로부터 추출된 API 의존 관계 그래프를 군집화하고, 군집을 대표하는 그래프를 생성하여 악성코드의 기능 정보를 나타내는 데이터베이스를 구축하여 모든 ADG에 기능 정보를 대응할 수 있게 발전시키는 것이 필요할 것으로 보인다. 이러한 연구는 악성코드의 기능을 식별하는 관련 연구에도 활용할 수 있을 것으로 기대된다.

References

  • K. Rieck, T. Holz, C. Willems, P. Dussel, and P. Laskov, "Learning and Classification of Malware Behavior", Proceedings of the 5th international conference on Detection of Intrusions and Malware, and Vulnerability Assessment, Paris, France, pp. 108-125, Jul. 2008. [https://doi.org/10.1007/978-3-540-70542-0_6]
  • C. Kolbitsch, P. M. Comparetti, C. Kruegel, E. Kirda, X. Zhou, and X. Wang, "Effective and Efficient Malware Detection at the End Host", Proceedings of the 18th Conference on USENIX Security Symposium, CA United States, pp. 351-366, Aug. 2009.
  • K. Kim and B. Moon, "Malware Detection based on Dependency Graph using Hybrid Genetic Algorithm", Proceedings of the 12th Annual Conference on Genetic and Evolutionary Computation, Portland Oregon, USA, pp. 1211-1218, Jul. 2010. [https://doi.org/10.1145/1830483.1830703]
  • J. Lee, K. Jeong, and H. Lee, "Detecting Metamorphic Malwares using Code Graphs", Proceedings of the ACM Symposium on Applied Computing, Sierre Switzerland, pp. 1970-1977, Mar. 2010. [https://doi.org/10.1145/1774088.1774505]
  • M.. Zhang, Y. Duan, H. Yin, and Z. Zhao, "Semantics-Aware Android Malware Classification Using Weighted Contextual API Dependency Graphs", Proceedings of the 21st ACM Conference on Computer and Communications Security(CCS), Scottsdale Arizona USA, pp. 1105-1116, Nov. 2014. [https://doi.org/10.1145/2660267.2660359]
  • X. Hu, S. Bhatkar, K. Griffin, and K. Shin, "MutantX-S: Scalable Malware Clustering based on Static Features", Proceedings of USENIX Annual Technical Conference, CA, United States, pp. 187-198, Jun. 2013.
  • E. Raff, R. Zak, R. Cox, J. Sylvester, P. Yacci, R. Ward, A. Tracy, M. McLean, and C. Nicholas, "An Investigation of Byte N-gram Features for Malware Classification", Journal of Computer Virology and Hacking Techniques, Vol. 14, No. 1, pp. 1-20, Feb. 2018. [https://doi.org/10.1007/s11416-016-0283-1]
  • R. Zak, E. Raff, and C. Nicholas, "What can N-grams Learn for Malware Detection?", Proceedings of the 12th International Conference on Malicious and Unwanted Software, Fajardo PR USA, pp. 109-118, Oct. 2017. [https://doi.org/10.1109/MALWARE.2017.8323963]
  • M. Sebastian, R. Rivera, P. Kotzias, and J. Caballero, "AVCLASS: A Tool for Massive Malware Labeling", Proceedings of the 19th International Symposium on Research in Attacks, Intrusions, and Defenses, Paris France, pp. 230-253, Sep. 2016. [https://doi.org/10.1007/978-3-319-45719-2_11]
  • J. MacQueen, "Some Methods for Classification and Analysis of Multivariate Observations", Proceedings of the 5th Berkeley Symposium on Mathematical Statistics and Probability, Berkeley California USA, pp. 281-296, Jan. 1967.
저자소개
이 건 호 (Kunho Lee)

2017년 2월 : 고려대학교 사이버국방학과(공학사)

2017년 7월 ~ 현재 : 국방과학연구소 현역파견원

관심분야 : 정보보호, 암호

유 찬 곤 (Changon Yoo)

1997년 2월 : 충남대학교 전산학과(이학사)

2003년 8월 : South Dakota State University Computer Science(공학석사)

2003년 8월 ~ 현재 : 국방과학연구소 책임연구원

관심분야 : 정보보호

Fig. 1.

Fig. 1.
An example of API dependency graph by malicious code

Fig. 2.

Fig. 2.
An example of control flow graph by malicious code

Fig. 3.

Fig. 3.
Call-assignment syntax analysis pseudocode

Fig. 4.

Fig. 4.
Subroutine handle pseudocode

Fig. 5.

Fig. 5.
An example of graph union model considered by frequency

Fig. 6.

Fig. 6.
Functional similarity between malware in same cluster by cluster number change

Fig. 7.

Fig. 7.
Lists of ADG by particular malware

Fig. 8.

Fig. 8.
Analyzed malware’s malware family relationship

Table 1.

Functional similarity of clustering model and algorithm

Algorithm k-means Spectral Hierarchical
Clustering model
n-gram 27% 26% 39%
AVClass 61.8% 62.3% 61.6%
ADG 73.4% 71.1% 74.0%

Table 2.

Matching results by ADG and RADG from Fig. 7

RADG Function name and description
(1) - Memory allocation and deallocation
- Allocate and deallocate memory in active process
(2) - Obtain process list
–Get Windows directory and open file, then obtain process list
(3) - Obtain API address
- Obtain dynamic API address
(4) - Communication operation
- Try connect to remote server
(5) - Handle heap
- Allocate and deallocate memory in heap