정보보안 분야에 요즘 Hot한 머신러닝이나 데이터과학을 접목해보려는 아이디어는 누구나 한번쯤 떠올려 보았을 것이다. 그러나 양질의 DataSet을 구하기가 어렵기 때문에 원활한 연구를 진행하기 어렵다는 것이 가장 큰 문제이다. 그래서 대부분은 흔히 구할 수 있는, 서버의 로그나 네트워크 패킷 덤프 정도를 분석하는 것에 그친다. 


Kaggle은 데이터 사이언스를 연구하는 사람들에게 매우 유명한 곳이다. 다양한 기업에서 자신들만의 데이터를 제공하여 공모전을 개최하고, 도전자들은 각자 자신만의 방법으로 데이터를 분석하고 의미를 해석한 결과를 제출한다. 점수(정확도)를 가장 많이 얻은 팀은 현상금을 획득한다. (참고 : https://www.kaggle.com/competitions)

Kaggle에서 2015년에 진행했었던 흥미로운 프로젝트가 있었다. 바로 Microsoft malware classification challenge이다.

링크 : https://www.kaggle.com/c/malware-classification/


악성코드 제작자와 백신업체 사이에서는 늘 총성없는 전쟁이 벌어지고 있다. 바이러스 제작자들은 백신에 탐지되는 것을 우회하기 위해 자신의 코드를 암호화하는 방법(polymorphic malware)을 사용하거나, 감염시마다 자동으로 코드를 변조하는 방식(metamorphic malware) 등 교묘한 술책을 사용한다. 이것을 악성코드 전문가가 직접 분석하고 작동원리를 파악하여 적절한 치료방법을 강구하는 것이 백신업체의 역할인데, 끊임없이 쏟아지는 악성코드의 진화속도를 따라잡기엔 인적자원이 부족할 따름이다. 이러한 문제를 해결하기 위한 방법으로 데이터과학적 방법이 활약할 수 있을까?


Microsoft는 Kaggle을 통해 자사 백신 서버의 데이터를 공개했고, 도전자들은 주어진 악성코드 샘플을 분석하여 그들을 분석하여 9가지의 Family로 Classification하는 것이다. 여기서 Family라 함은, 생물학에서 고양이과(科), 개 과(科) 라고 구분하여 부르듯이, 특정 개체가 포함되는 카테고리를 의미하는 것이며 주어진 악성코드는 다음과 같이 9개의 Family 중 하나에 속한다고 가정한다. 단, 이미 악성코드임이 확인된 파일만을 대상으로 테스팅 하므로 여기에서 얻은 결론을 일반적인 다른 바이너리에 적용하기에는 한계가 있다. 즉, 단순히 악성코드 분류를 위한 프로젝트이며, 새로운 시그니쳐 탐지(Detection)를 목표로하지는 않는다.

문제에서 제시되는 바이너리는 위와같은 9종의 구분 중 반드시 하나에 속한다고 가정한다.
문제에서 제시되는 바이너리는 위와같은 9종의 구분 중 반드시 하나에 속한다고 가정한다.

악성코드는 학습을 위한 Train Set과, 점수측정을 위한 Test Set으로 구분되어 주어진다. 대부분의 머신러닝에서 사용되는 데이터가 숫자 또는 문자의 형태를 띄고있지만, 이 프로젝트는 헥스값으로 된 바이너리 덤프를 그대로 분석해야한다. 또한, IDA Pro 같은 리버스 엔지니어링 도구를 사용하여 바이너리 파일을 어셈블리 수준으로 변환하는 방법도 제공된다. 데이터 자체가 파일형식이다보니, Train Set과 Test Set으로 제공된 데이터의 용량은 500G에 달한다. 때문에 이를 모두 하드디스크에 담기 어려운 경우에는 압축된 상태(약 20G)에서 파일을 순차적으로 뽑아오는 형식으로 관리하는 것도 고민해야 할 것이다. 


이번 학기 대학원 수업에서 진행할 프로젝트를 찾던 중 발견하였고, 관심있는 주제여서 제안을 했지만 아쉽게도 리젝되었다. 비록 이번 기회는 아니지만 여유가 생기면 꼭 직접 분석해보고 싶은 데이터이다. 챌린지에서는 단순히 Raw dump와 어셈블리 레벨의 코드만으로 분석하는 것이 제한조건이었는데, 챌린지가 끝났으므로 개인연구 목적으로 사용할 때는 radare2 등의 오픈소스 프레임워크를 추가적으로 활용해보는 것도 좋은 아이디어라고 생각한다. ClamAV나 Cuckoo Sandbox 등도 좋은 오픈소스이다.

프로젝트 제안 발표에 사용했던 요약본 슬라이드
프로젝트 제안 발표에 사용했던 요약본 슬라이드

어쨌든 이 프로젝트는 2015년 2월부터 4월까지 진행되었으며, 상금은 $16,000(현재시점 기준 1,800만)이었다. 그런데 Forum에 올라왔던 글들의 반응을 보니, 일명 열정페이 논란(…)이 있었나보다. (참고 : Is anyone actually doing this for the prize money? ) 솔직히 이 정도면 어마어마한 프로젝트라고 볼 수 있는데도 마이크로소프트 정도의 공룡기업이 고작 2천만원정도의 가격으로 후려치는건 너무한게 아니냐는 의견이며, 미국에서 데이터 사이언티스트는 인기직종 1순위이며 평균연봉은 11만6천840달러(1억3천500만원)이라는 점을 기억했을 때 충분히 열받을 수 있는 상황이다. (참고 : [아이뉴스24] 미국 1위 직업이 '데이터 사이언티스트’?


그럼에도 불구하고 대부분의 참가자들은 얌전하게 이 프로젝트 참가의 의의를 밝혔다. 돈보다는 연구 자체에 관심이 있고, 이런 양질의 데이터를 얻은 것에 비하면 오히려 거저먹었다는 생각도 많았다. ("원래 캐글은 이런곳이니, 하기 싫으면 니가 꺼져”라는 반응도 꽤 있었다.) 


어쨌든 이 프로젝트의  Competition은 이미 완료되었으며 수상한 몇 팀이 각자의 방법을 공유하였다.

1등 팀 @rcarson : https://github.com/xiaozhouwang/kaggle_Microsoft_Malware

3등 팀 @Mikhail Trofimov : https://github.com/geffy/kaggle-malware


Kaggle은 Competitions 기간이 만료되더라도, 보통은 프로젝트 참여를 중단시키지 않고 열어둔다. 때문에 데이터과학을 공부하고자하는 목적으로 계속해서 도전할 수 있다. 본 마이크로소프트 프로젝트의 경우 0.5TB나 되는 매우 귀중한 자료가 제공되었으므로, 연구에 많은 도움이 될 것이다. 포럼에서 질문된 내용 중에 이 데이터를 가지고서 개인의 연구논문 작성이나 컨퍼런스 발표를 할 때 저작권상의 문제소지가 있는지(Can this dataset be used in some academic work?)에 대한 논의가 있었다. 캐글 지적 재산권 규정중 데이터에 관한 원칙("Intellectual Property, DATA”)은 다음과 같다.

Unless otherwise permitted by the terms of the Competition Website, Participants must use the Data solely for the purpose and duration of the Competition, including but not limited to reading and learning from the Data, analyzing the Data, modifying the Data and generally preparing your Submission and any underlying models and participating in forum discussions on the Website.

즉, 보통의 경우에는 본 프로젝트의 범위를 벗어나는 용도로 활용해서는 안된다. 그러나 호스트(이 경우 마이크로소프트)의 뜻에 따라 학술적 연구 목적에 한해 개방할 수도 있다. 다행히 Microsoft는 이것을 허용했고, @Mansour Ahmadi라는 사람은 실제로 ACM Conference의 학술지 CODASPY ‘16에 관련 논문 "Novel Feature Extraction, Selection and Fusion for Effective Malware Family Classification”을 게재하였다. 이들은 99.8%의 정확도를 달성하였다고한다. 시간이 생기면 해당 논문을 리뷰하여 올리도록 하겠다.


참고로 데이터가 공개되어있긴 하지만, 해당 데이터를 제 3자가 웹하드나 토렌트 등의 방법으로 제공하는 것은 분명히 금지된다. Kaggle 가입은 무료이므로, 직접 가입해서 다운로드하는 것이 좋다. 7z로 압축된 데이터셋 17G짜리 두개를 받는데 몇시간 정도 소요될 수 있으며, 압축을 풀면 약 500G이므로 저장공간 관리에 유의하기 바란다.

  • train.7z - 트레이닝을 위한 raw 데이터 세트 (MD5 hash = 4fedb0899fc2210a6c843889a70952ed)
  • trainLabels.csv - 트레이닝 셋에 대한 레이블링 정보
  • test.7z - 테스팅을 위한 raw 데이터 세트 (MD5 hash = 84b6fbfb9df3c461ed2cbbfa371ffb43)
  • sampleSubmission.csv - 채점을 위해 작성해야 할 자료의 예시 csv 파일
  • dataSample.csv - 대용량 파일을 다운로드 받기전 대략적으로 살펴볼 수 있는 데이터 샘플
CPUU님의 창작활동을 응원하고 싶으세요?