Participation

[프로젝트] 인공지능을 이용한 악성코드 탐지 시스템

D4tai1 2019. 11. 11.

Malware Detection System Using Artificial Intelligence

입니다.

 

만들어진 프로그램명은

AI_Malware_Detection입니다.

 

AI_Malware_Detection은

어디선가 받은 파일이 악성인지 정상인지 

알려주는 프로그램입니다.

 

기존에 있는 백신이나 악성유무를 판단해주는 프로그램은

알려진 악성코드에 대해서만 가능하지만

AI_Malware_Detection는 AI기반이기 때문에

"기존 악성코드와 비슷하다면 이것은 악성일 것이다"라고

추측을 해줍니다.

 

[사진1] 발표시작

 

[사진2] 목차

 

[사진3] 정확도

 

[사진4] 대표발표

 

발표하는 일은 매 번 떨리지만

여기저기서 잘할 수 있을거라는 응원을 해줘서 

감사하게 생각하고

자신감을 얻은 덕에 발표는 무사히 마쳤습니다.

 

프로젝트를 도와주거나

발표하는 모습을 찍어준 제 팬들에게도

고마웠죠

 

발표점수와 구현점수로 200명정도 평가를 하였고 

나름 좋은 결과를 받았습니다.

 

이 결과는

함께한 사람들이 좋은사람이고

열심히 하는 저보다 더 열심히 하기 때문입니다.

분명히..

 

두둔!! 시작해 볼까요?!

 

1. 개요 
1.1. 프로젝트 배경 

2. 시스템 구성 
2.1. 전체 구성도 
2.2. 모델 구축 구성도
2.3. 탐지 구성도 

3. 데이터 추출 
3.1. 정적 데이터 추출 
3.1.1. 필요성 
3.1.2. 추출센서 
3.1.3. 추출결과 
3.2. 동적 데이터 추출 
3.2.1. 필요성
3.2.2. 추출환경 
3.2.3. 추출결과 

4. 특징공학 
4.1.1. 특징공학이란? 

5. 전처리 
5.1.1. 전처리란? 
5.1.2. 전처리방법 

6. 머신러닝 
6.1. 모델 구축 
6.1.1. SVM(Support Vector Machine) 
6.1.2. Random Forest 
6.1.3. Naive Bayes 
6.1.4. Gradient Boosting 
6.1.5. XGBoost 
6.2. 모델 평가 

7. 악성코드 탐지 시스템 
7.1. 서버 
7.1.1. 개발언어 
7.1.2. 기능 
7.2. 클라이언트 
7.2.1. 개발언어 
7.2.2. 기능 

8. 구현 

9. 결론 
9.1. 결론 
9.2. 추후 계획 

10. 참고문헌

 


 

1. 개요 
1.1. 프로젝트 배경 

 2018년의 경우 카스퍼스키랩(Kaspersky Lab)에서 신종 악성코드가 하루 평균 34만 6000개가 탐지되었다고 발표했으며, AV Test에서 발표한 내용에 따르면 2019년 1월부터 10월까지 약 9억 7천개의 악성코드가 탐지되었다고 한다.  

▶ 위와 같이 탐지건수는 매 해 증가하고 있으며 악성코드 제작자들은 피해자의 기기를 감염시켜 돈을 벌기 위해 끊임없이 새로운 방법을 찾고 있다. 방대한 양의 악성코드와 알려지지 않은 사이버 위협에 대해서 악성코드 분석가들이 일일이 대응하기는 여간 어려운 일이 아니다.  

▶ 이에 대응하기 위해 국내에서는 한국인터넷진흥원에 보안 빅데이터센터를 신설하였으며 매년 정보보호 R&D 데이터 챌린지 대회를 주최하고 있다. 

▶ 본 프로젝트에서는 위와 같은 사이버 위협을 최소화하기 위해 AI를 이용해서 기존 악성코드에 대한 내용을 학습하고 새로운 악성코드를 탐지하는 인공지능을 이용한 악성코드 탐지 솔루션을 제작하였다.

 


 

2. 시스템 구성 
2.1. 전체 구성도 
 

[그림1] 전체 구성도

2.2. 모델 구축 구성도 
 

[그림2] 모델 구축 구성도

 
2.3. 탐지 구성도 
 

[그림3] 탐지 구성도


▶ 모델제작에 사용할 데이터는 악성코드 10만개, 정상파일 10만개로 구성되어 있다. 
▶ 참고로 정상파일을 구하는 일은 여간 어려운 일이 아니다.

 


 

3. 데이터 추출 
3.1. 정적 데이터 추출 
3.1.1. 필요성 
▶ 정적 데이터 추출이란 악성코드를 실행하지 않고 그 자체가 갖고 있는 내용들을 통해 악의적인 여부를 진단하는 것이다. 

▶ 모든 파일들은 자신만의 해시를 갖거나, 사용되는 API, 그리고 문자열 등을 갖는다. 이후 이러한 요소들이 나타나 있는 파일을 발견했을 때, 추가적인 분석 여부나 이후 분석 방향에 대하여 선정할 수 있게 도움을 준다. 

▶ 프로그램의 기능을 파악하기 위해 코드나 프로그램의 구조를 추출하는 것을 말하며, 프로그램을 실행시키지는 않는다. 

▶ 예를 들면 PE구조를 검사해서 악성 행위와 관련된 정보들을 파악할 수가 있다. 사용되는 API와 문자열의 경우 중요한 정보를 갖는다. 사용되는 API의 목록을 가지는 IAT(Import Address Table)의 경우 어떠한 DLL을 필요로 하며, 해당 DLL에서 어떠한 함수를 사용하는지 확인할 수가 있다. 이는 꽤 중요한 지표가 되는데 만약 계산기가 네트워크와 관련된 DLL을 import 하며, socket과 같은 API를 사용한다면, 이는 충분히 추가적인 분석을 해야 할 요지가 생긴다. 문자열의 경우에도 새로운 프로세스나 파일을 생성하거나 제거, 외부 통신을 위한 IP 주소, 지속성을 위해 레지스트리에 남기는 키 값 등 악성코드의 기능과 직접적으로 관련된 문자를 포함하고 있을 수 있다. 이렇게 IAT와 문자열을 서로 비교하면 행위에 대한 큰 틀을 작성할 수 있다. 

▶ 그 외에도 resource섹션을 추출한 뒤 분석해보면 Dropper인지 확인할 수도 있다. 

▶ 정적 데이터 추출을 통해 얻은 정보만 가지고 악성코드라고 의심할 수는 있지만 단정을 지을 수는 없다. 

▶ 또한 악성코드가 패킹되어 있는 경우 정적 데이터 추출로 얻은 정보은 모델에 사용하기 적합하지 않다. 

3.1.2. 추출센서

[그림4] 정적 데이터 추출


▶ 아래는 정적 데이터 추출에 대한 내용이며, 위 그림은 정적 데이터를 추출하는 과정이다. 
 

[그림5] 추출한 PE헤더 정보


▶ PE헤더 : 바이너리를 입력 받아서 PE정보를 추출 후 CSV로 출력한다. 

[그림6] 추출한 opcode 4-gram 정보


▶ opcode n-gram : 바이너리를 입력 받아서 opcode 4-gram을 추출 후 csv로 출력한다. 
 

[그림7] opcode sequence image정보


▶ opcode sequence image : 바이너리를 입력 받아서 opcode의 sequence를 256*256의 png로 출력한다.


▶ 이 외에도 8가지 정도의 추출방법을 사용하였다.

3.1.3. 추출결과 
▶ 바이너리의 PE헤더 정보, API call정보, 리소스 정보, 바이너리 이미지 등의 정보를 추출할 수 있다. 

3.2. 동적 데이터 추출 
3.2.1. 필요성 
▶ 정적 데이터 추출과는 다르게, 동적 데이터 추출은 해당 파일을 실행하므로 나타나는 변화를 모니터링하며 어떠한 행위(Behavior)를 하는지 확인한다.  

▶ 행위에 대한 정보를 추출할 수 있다는 장점이 있지만 실제로 돌려보아야 하므로 시간이 오래 걸리고 특정한 조건이 전제되어야 수행되는 악성코드의 경우 실행이 어렵다. 

▶ 레지스트리 키가 변했는지, 어느 주소와 통신을 했는지 등을 확인할 수 있으며, 네트워크의 경우, 어떠한 곳과 어떠한 네트워킹이 일어나는지 파악하는 것이 중요하다. 악성코드가 네트워크를 통해 특정한 곳에서 추가적인 파일을 다운로드 할 수가 있으며, 사용자가 입력하는 키 이벤트를 네트워크를 통해 보낼 수도 있다. 또한 이후 백도어 기능을 위하여 특정 포트를 열어놓기도 한다. 이처럼 네트워크 기능이 추가된다면 패킷에 대하여 분석이 필요하다. 

▶ 그러나 랜섬웨어나 키로깅 같이 행위가 명확한 악성코드는 동적 데이터 추출만으로도 정확히 어떠한 행위를 하는지 판단이 가능하지만, 백도어나 일정 시간 잠복기를 갖는 경우 아무런 증상이 나타나지 않기 때문에 동적 데이터 추출만으로는 어렵다. 

3.2.2. 추출환경 
▶ Ubuntu16.04의 환경에서 Cuckoo(v2.07)와 Sandbox(Windows7 64bit)를 구축하였다. 

3.2.3. 추출결과 
 

[그림8] 동적 데이터 추출 과정


▶ 위 그림은 Sandbox에서 파일을 실행한 후 동적 데이터를 추출하는 과정이다. 
▶ 원격터미널을 캡쳐했기 때문에 동작하는 내용은 추후 영상에 첨부할 계획이다.
 

[그림9] 동적 데이터를 추출한 report.json


▶ Cuckoo는 동적 데이터 추출로 얻은 정보를 NOSQL인 몽고DB에 json파일 형태로 저장하며 이 파일을 report라고 부른다. 

▶ report 파일에는 네트워크 상의 행위 및 프로세스에 대한 변화 등을 확인할 수 있는 정보가 저장되어 있다. 

[그림10] API sequence image


▶ 또한 정적 데이터 추출은 호출한 API만 알 수 있지만 동적 데이터 추출은 API 호출 순서를 알 수 있기 때문에 API n-gram과 API sequence image도 추출할 수 있다. 

▶ API호출 순서는 패킹 되어있는 파일과 일반 파일이 섞여있는 데이터를 모델에 사용할 때 더욱 효과적이다. 

▶ 이 외에도 동적 데이터를 여러 가지 방법으로 추출하였다.

 


 

4. 특징공학 
4.1.1. 특징공학이란? 
▶ 머신러닝 모델을 위한 데이터 테이블의 컬럼(특징)을 생성하거나 선택하는 작업을 말한다. 

▶ 이 프로젝트의 특징공학은 악성코드에 대한 깊은 도메인 지식과 악성코드의 정보를 가져오기 위한 기술이 요구된다. 

▶ 3.1.3 추출결과와 3.2.3 추출결과에서 얻은 정보 중 어떤 특징이 악성코드를 판별하는데 영향을 많이 미치는지를 선정하는 것을 의미한다. 

 

[그림11] opcode 4-gram별 개수 


▶ opcode 4-gram으로 예를 들면 위 그림과 같이 악성코드에서 어떠한 opcode 4-gram이 주로 사용되는지 알기 위해 4-gram별로 카운트한다.

 


 

5. 전처리 
5.1.1. 전처리란? 
▶ 모델에 데이터를 넣기 전의 단계를 의미하며, 머신러닝 모델을 위한 파일을 직접 선별하고 학습에 사용할 수 있는 형태로 전처리를 진행한다 

5.1.2. 전처리방법 
▶ 숫자의 경우 중위수로, 심볼의 경우 최빈값으로 처리한다. 

▶ 심볼을 사용할 수 없다면 One-Hot인코딩을 사용한다. 

▶ 값의 범위가 너무 클 경우에는 범주화를 한다.

 


 

6. 머신러닝 
SVM, RandomForest, NaiveBayes, Gradient Boosting, XGBoost의 5가지 지도학습 모델을 이용해서 구축하였다. 다섯 가지 모두 sklearn 라이브러리에서 가져와서 사용하였다.  

6.1. 모델 구축 
6.1.1. SVM(Support Vector Machine) 
6.1.2. Random Forest 
6.1.3. Naive Bayes 
6.1.4. Gradient Boosting 
6.1.5. XGBoost 
▶ 위 모델에 대한 이론 설명은 이미 많기 때문에 블로그에서는 생략했다.. 

6.2. 모델 평가 
▶ 전체 컬럼(특징)으로 학습했을 때 아래와 같은 정확도를 나타냈다. 
▶ 정확도는 과적합된 부분이 있어서 블로그에서는 생략했다. 


[그림12] 동적 데이터 전체로 학습결과

[그림13] 정적 데이터 전체로 학습결과

▶ 사용한 모델에 대한 설명은 결과에서 다루려고 한다.

 


 

7. 악성코드 탐지 시스템 
7.1. 서버 
7.1.1. 개발언어 
▶ 서버 프로그램은 파이썬으로 개발했으며 2버전과 3버전을 혼합해서 사용하였다. 
▶ 총 100개 이상의 파이썬소스와 셸스크립트로 구성되어 있다. 

7.1.2.    기능 
▶ 클라이언트로부터 파일을 받아서 정적 및 동적 데이터 추출 후 분석을 한다. 

▶ 분석한 컬럼(특징)으로 전처리를 진행하여 모델에 넣는다. 

▶ 모델에서 나온 결과로 악성인지 정상인지 판단 후 결과를 클라이언트로 전송한다. 

7.2. 클라이언트 
7.2.1. 개발언어 
▶ 클라이언트 프로그램은 C#으로 개발했다. 

7.2.2.    기능 
▶ 파일을 입력 받은 후 서버로 파일을 전달한다. 

▶ 악성인지 정상인지 서버에서 판단해주면 결과를 출력한다.

 


 

8. 구현

[그림14] (클라이언트) 검사할 파일을 읽어오기 

 

[그림15] (클라이언트) 검사 시작을 누르면 서버로 파일전송 후 결과대기

 

[그림16] (서버) 클라이언트로부터 받은 파일에 대한 작업1 

 

▶ 받은 파일에 대한 데이터 추출 / 분석 / 전처리를 진행한다.

 

[그림17] (서버) 클라이언트로부터 받은 파일에 대한 작업2 


▶ 전처리 후 모델탑재 / 모델 별 결과확인 / 악성여부 판별 / 클라이언트로 결과전송을 진행한다. 

[그림18] 검사 결과 확인

 

▶ 이 프로그램은 정상프로그램이지만 [그림17]에서 1로 표시된 것은 악성을 의미한다.

▶ 아마도 캡쳐 시 악성 1개 정상 1개 돌리면서 서버는 악성을 캡쳐하고, 클라이언트는 정상을 캡쳐한 것 같으니 참고하면 된다.

▶ 정적 데이터만으로 판단할 경우 짧은 시간이 소요되지만, 동적 데이터를 이용하려면 파일과 하드웨어 성능에 따라 다르긴 하지만 많은 시간이 소요된다. 

 


 

9. 결론 
9.1. 결론 
▶ 시작 시 train셋과 test셋의 비율을 7:3으로 정하고 진행했다. 

▶ SVM, Random Forest, Naïve Bayes, Gradient Boosting, XGBoost 총 5가지 모델에 동적 데이터도 넣어보고 정적 데이터도 넣어 보았다. 

▶ 그 결과 SVM과 Naive Bayes가 다른 모델에 비해 정확도가 낮았다. 

▶ 이후 악성코드에 대한 도메인 지식을 이용해서 특정 컬럼(특징)만 선별해서 넣어보았지만 SVM과 Naïve Bayes는 여전히 다른 모델에 비해 상대적을 정확도가 낮았다. 

▶ 그 외 정확도가 과하게 높은 경우는 오버피팅이 되었기 때문이다. 

▶ 또한 2개(SVM, Naive Bayes)를 제외한 Random Forest와 XGBoost, Gradient Boosting을 악성코드 여부를 판별하는데 사용하기로 했다. 

▶ 위에서 설명한 정보 중에서는 정적 데이터에서는 PE분석한 것이 학습률이 높았으며, 동적 데이터에서는 API n-gram이 학습률이 높았다. 

9.2. 추후 계획 
▶ 추후 동적 데이터 추출 시 악성코드 판별에 중요한 정보가 될 수 있는 행위정보를 추출할 계획이다. 

▶ 한국인터넷진흥원 주최로 진행되는 정보보호 R&D 데이터 챌린지 2019 대회에서 AI기반악성코드 탐지 트랙에 참가하게 되었다.  

▶ 대회에서 사용할 하드웨어 정보는 CPU i9-9900K / RAM 128GB / GPU GEFORCE RTX 2080TI 11GB / SSD 2TB / HDD 10TB이고 Sandbox의 메모리는 32GB로 설정하였다. 그럼에도 불구하고 대회시간 내 동적 데이터 추출은 불가능하다.  

▶ 그래서 추가적으로 RAM 16GB PC 48대를 동적 데이터 추출이 가능하도록 설정해 놓았다. 

▶ 동적 데이터 추출 시 행위정보가 정상적으로 추출되지 않는 부분이 있었는데 이 부분은 특정 조건에서만 실행되는 악성코드[ex] 마우스 3번 클릭 후 동작, 1분 후 동작하는 악성코드 등]이다. 악성코드를 돌아가도록 하기 위해서 사전에 조건을 확인하는 부분을 True로 만들어 조건을 충족시킬 수 있도록 하는 기능을 Plug-in방식으로 제작할 계획이다. 

▶ 또한 Anti-VM 기법이 적용된 악성코드의 행위를 분석하기 위한 환경을 제공하기 위해 Anti-VM 우회 시스템도 제작할 계획이다. 

▶ 그 외에도 백신은 악성코드의 해시 값을 가지고 악성코드 여부를 탐지하지만 악성코드가 자가변조를 할 경우 해시 값을 신뢰할 수 없게 된다. 이 경우에 대한 연구도 순차적으로 진행할 계획이다.  

▶ 마지막으로 악성코드는 소프트웨어의 취약점을 이용해서 자신을 실행시키는 방법을 많이 사용한다. 악성코드가 취약점을 이용하지 못하도록 소프트웨어 취약점을 자동으로 탐지해주는 것도 현재 연구 중이다. 

 


 

10. 참고문헌 
▶ 도서 : Cuckoo Sandbox : 쿡쿠 샌드박스 구축과 확장 + 운영 팁 
▶ 도서 : 인공지능 보안을 배우다

댓글