ML을 이용한 PDF 악성코드 탐지에 대하여
본 포스팅은 PDF 기본 구조와 기존 탐지 방법론에 이어 ML을 이용한 PDF 악성코드 탐지 방법론에 대해 살펴보고자 합니다. ML을 이용하여 PDF 악성코드를 효과적으로 탐지하기 위해서는 feature 선정이 매우 중요한 과정이며, 이를 위해 지난 포스팅에서 PDF 문서의 구조 분석과 구조 내 존재하는 유의미한 데이터 즉, PDF 악성코드 공격 유형을 기반으로 feature로 활용할 수 있는 악성 인자에 대해 알아보았고, 본 포스팅에서는 feature 선정과 학습 그리고 모델 평가를 통해 효과적인 PDF 악성코드 탐지 방법에 대해 알아보도록 하겠습니다.
ML기반 PDF 악성코드 탐지 시스템 아키텍쳐
ML을 이용하여 PDF 악성코드 탐지와 이 모델을 평가하기 위해 아래 그림 1과 같은 구조로 시스템을 구성했습니다. 먼저 학습을 위해 데이터를 모으고(Data Collection), 시그니처 기반의 PDF 구조적 분석을 바탕으로 feature를 선정하였고(Data Pre-Processing), 모델링을 위한 feature로 활용하여 학습(Learning)을 진행한 후 모델을 평가(Evaluation)했습니다.

그림 1. ML기반 PDF 악성코드 탐지 전 과정
Data collection
학습을 위해 benign 파일과 malware 파일로 구분하여, benign 파일은 연구용으로 제공된 파일 9,7561개를 사용하였고, malware 파일은 virustotal에서 제공한 10,290개를 활용하였습니다.
Data pre-processing
ML을 이용하여 악성코드를 탐지하기 위해 PDF의 유의미한 정보 추출이 선행되어야 하며, 이를 위해 PDF 구조 파악이 필요합니다. 구조를 파악을 위해 pdf-parser.py2 오픈소스를 활용하는데, pdf-parser.py는 PDF의 구조를 객체화하여 관리하는 프로그램으로 PDF를 파싱하면 그림 2와 같이 obj(obj~endobj)와 obj를 구성하는 dictionary(<< >>), 그리고 여러 Tag Names(/Type, /Catalog), 이미지, 동영상, 하이퍼링크, Javascript 코드 등을 포함하는 stream(stream~endstream)으로 구성되어 있습니다.

그림 2. 파싱된 PDF 파일의 구조
데이터 전처리 과정은 그림 3과 같이 수정된 pdf-parser.py를 통해 수집된 정상 및 악성 PDF의 feature를 파일 별 CVS 파일로 생성한 다음 각 feature csv 파일을 ML의 input으로 활용하기 위해 통합 csv파일을 생성하는 과정을 거쳐 데이터의 전처리를 수행합니다.
1) https://www.dropbox.com/sh/i6ed6v32x0fp94z/AAAyZAlLSnwf6R0ayzUHxk8Aa/Clean?dl=0&subfolder_nav_tracking=1
2) https://blog.didierstevens.com/programs/pdf-tools/

그림 3. 데이터 전처리 과정
지난 포스팅에서 언급한 기존 ML 기반 PDF 악성코드 탐지 연구 동향을 살펴보면 초창기 ML의 feature로 사용한 것은 JavaScript 특정 key의 frequency, keyword 기반 frequency, path와 tag_name을 활용한 dictionary 순으로 발전한 것을 알 수 있었습니다. 본 포스팅에서는 기존 동향에서 사용한 path:name 기반의 structural base feature와 저희 센터에서 선행 연구한 시그니쳐 기반의 탐지를 통해 추가적인 의심스러운 key 선정하여 학습 모델에 활용했습니다.
표 1. ML에 활용될 feature list(일부)
Feature Name | 내용 |
/FlateDecode | zlib 라이브러리를 활용해 텍스트를 압축했다고 표시 |
Decompress 개수 | FlateDocde를 포함한 압축된 영역의 개수 |
/AA | PDF 파일에 영향을 미치는 트리거 이벤트에 대항 응답 |
/JS | javascript 코드가 포함되어 있음을 표시 |
/GoToE | 현재 PDF 파일에서 내장된 DPF 파일에 직접적으로 접근한다는 내용 |
/Launch | 내장된 애플리케이션을 실행하거나파일이 있음을 표시 |
/F | 스트림데이터에 포함된 파일을 알리는 표시 |
/Extends | 다른 스트림을 상속한다는 의미 |
/EmbeddedFile | non-text파일로 이미지나 비디오 등의 파일을 지칭 |
/OpenAction | PDF파일이 열릴 때 행동 혹은 위치를 지정 |
/URI | 원격지 주로를 가르킴 |
/Xobject | PDF파일 내 여러 번 참조하기 위해 만드는 객체 |
/RichMedia | 동영상, 소리, 플래시 등의 리치 미디어가 포함됨을 표시 |
PDF 사이즈 | PDF 파일의 크기 |
xref 사이즈 | PDF 파일 구성 요소 중 cross-reference table의 크기 |
trailer 사이즈 | PDF 파일 구성 요소 중 trailer의 크기 |
최종수정날짜 | 파일의 최종 수정 날짜 |
count stream | 스트림의 개수 |
표 1은 기존 연구 동향처럼 path, name에 대한 정보와 내용입니다. /FlateDeocde와 Decompress 개수는 악성코드를 숨기기 위해 압축시켰는지를 파악할 수 있으며, /AA, /JS는 script에서 악성 Object를 사용하는 경우(/GoToE, /OpenAction, /Page, /Extends, /EmbeddedFile, /Launch, /F, /Xobject 등)를 복합적으로 파악할 수 있고, /URI는 안전하지 않은 사이트나 악성파일을 다운로드 받을 수 있기 때문에 확인해야 하며, /RichMedia 역시 악성 동영상, 소리, 플래시 등을 활용하여 공격할 수 있기 때문에 feature로 사용하였고, 그 외 PDF 사이즈, xref 사이즈, trailer사이즈, count stream의 경우 내용에 비해 크거나 혹은 매우 작은 경우 악의적인 행위를 할 수 있어 선정하고 수정 날짜는 악성프로그램을 이용하여 생성했을 때 비정상적인 날짜가 들어가 feature로 선정하였습니다.
추가적으로 기존 연구들과는 다르게 본 포스팅에서는 악성 인자를 키워드로 추가로 선정하는데, 의심스러운 키워드 선정은 선행 연구한 시그니쳐 기반 탐지의 결과를 이용하였습니다. 추가적인 의심스러운 key는 js 내 악성을 유발하는 eval, getAnnots, for 등의 예약어나 압축크기가 20,000 이상인 경우, xml관련 키워드가 존재할 경우(xml, chunk, pdf 등), URI 객체 외에서의 domain 및 ip주소를 활용한 경우, 권한 탈취를 하는 경우(root, administrator), 디렉터리를 조작하려는 경우(mkdir, createdirectory), shell을 직접 실행하려는 경우(powershell) 등 33개의 의심스러운 키워드를 추가 선정했습니다. 최종적으로 중복되는 키워드는 축소하고 다른 악성 PDF 연구에서 많이 사용되는 키워드까지 포함하여 총 52개의 feature를 선정하였고, 해당 feature(key)를 활용하여 각각의 PDF마다 feature의 정보가 담긴 csv파일을 생성한 후 최종적으로 learning에 사용할 수 있는 형식인 통합 csv파일을 생성하였습니다.
Learning
머신러닝(ML)이란 컴퓨터를 인간처럼 학습시켜 데이터에서 패턴을 찾는 인공 지능 분야로, 컴퓨터의 발전과 알고리즘, 라이브러리 등의 발전으로 많은 곳에서 사용하고 있습니다. 최근 관련 연구에서 많이 사용되는 ML 기법은 그래디언트 부스팅 트리(GBT), SVM(Support Vector Machine), RF(Random Forest) 등이 있습니다.
본 포스팅에서는 그래디언트 부스팅 트리의 확장 버전인 XGB, LGBT(Light GBM)와 RF, SVM 총 4가지의 모델을 성능을 비교하였고, 표 2는 성능 비교 결과입니다. 각 모델의 성능은 SVM을 제외하면 큰 차이가 없습니다. XGB는 RF에 비하면 0.2%, GBT랑 비교하면 0.5% 정도의 더 향상된 정확도를 볼 수 있으며 다른 지표 또한 최소 -0.1%부터 최대 0.5%가량 차이가 나는 모습을 확인할 수 있습니다.
모델의 성능 비교를 토대로 본 포스팅에서는 전처리한 데이터를 활용하여 benign 파일, malware 파일을 구분할 수 있도록 XGBoost tree를 기반으로 모델을 설계했으며 세부 파라미터는 sklearn의 GrtidSearchCV를 활용하여 최종적으로는 max_depth 10, n_estimators 300, learning_rate 0.1, gamma 0, booster: gbtree, binary:logistic으로 선정하였습니다.
표 2. classifier 모델 성능 비교
XGBoost tree | RF | LGBMClassifier | SVM | |
Accuracy | 0.9966412 | 0.9943862 | 0.991987 | 0.958655 |
precision | 0.9981933 | 0.999 | 0.9958266 | 0.9999903 |
recall | 0.9954882 | 0..9904355 | 0.9890821 | 0.922502 |
f1 | 0.9968376 | 0.994697 | 0.9924373 | 0.959623 |
auc | 0.9965444 | 0.9941255 | 0.9917713 | 0.9612 |
Evaluation
모델의 성능 평가란 실제 값과 모델에 의해 예측된 값을 비교하고, 두 값의 오차를 구하는 것으로 (실제값 – 예측값) = 0이 되면 오차가 없으며 잘 예측한 것으로 간주합니다. 그러나 모든 모델은 예측값과 실제 값이 일치하기는 힘들기 때문에 어느 정도의 오차를 허용할지를 결정합니다. 이진 분류 모델의 성능은 실제값과 예측값이 완전히 일치할 수 없기에 오차로만 판단하지 않아야 합니다.
모델의 성능은 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1 점수(F1-score), ROC 값(AUC 값), 혼동 행렬(confusion Matrix)을 활용하여 평가합니다.
표 3. 혼동 행렬(기본)
예측 값 | |||
일반 | 악성 | ||
실제 값 | 일반 | TN(True Negative) | FP(False Positive) |
악성 | FN(False Negative) | TP(True Positive) |
혼돈 행렬은 분류의 예측 범주와 실제 데이터의 분류 범주를 교차표 형태로 정리한 행렬입니다. 표 3은 혼동 행렬로 모델에서의 예측이 일반 파일이고, 실제 파일이 일반 파일일 때를 True Negative(TN), 모델은 악성이라 판단했지만, 실제 파일은 일반 파일일 경우 False Positive(FP), 모델은 일반 파일이라 예측했지만 실제로는 악성일 경우는 False Negative(FN), 마지막으로 모델에서는 악성, 실제 파일도 악성 파일일 경우를 True Positive(TP)라 표현한다. 해당 4가지 TN, FP, FN, TP를 활용하여 정확도, 정밀도, 재현율, F1 점수 등을 계산할 수 있습니다.
ㆍ정확도(Accuracy): 전체 데이터 중 정확하게 예측한 데이터의 수로 입력된 데이터를 얼마나 정확하게 예측하는가에 대한 비율

ㆍ정밀도(Precision): 양성으로 판단한 것 중 진짜 양성의 비율로 악성 PDF파일로 예측한 파일 중 실제 악성 파일에 해당하는 비율

ㆍ재현율(Recall): 진짜 양성인 것 중 올바르게 양성으로 판단한 비율로 실제 악성 PDF 파일 중 모델이 악성 파일로 예측한 비율

ㆍF1 점수: 정밀도와 재현율을 결합하여 만든 지표로 정밀도와 재현율의 조화 평균식

정밀도와 재현율은 양성(악성 PDF) 데이터 세트 예측 성능에 초점을 맞춘 지표로 이진 분류 모델의 업무 특성에 따라 더 중요한 지표로 간주할 수 있습니다. 만약 데이터가 한쪽으로 치우쳐진 경우에는 정확도만으로 판단할 수 없습니다. 예를 들어 일반파일 1,000,000개, 악성파일 100개일 경우, 어떠한 모델이 1,000,100개 모두를 일반파일로 판단했다고 가정해 보겠습니다. 그 모델의 성은은 정확도 1,000,000/1,000,100인 99.999%로 매우 높지만, 정밀도와 재현율, F1 점수는 0으로 매우 안 좋습니다. 사실상 악성코드를 하나도 잡지 못하는 결과입니다.
표 4는 위에서 예제로 한 극단적인 상황의 혼돈 행렬 표입니다. 모델이 1,000,100개 모두를 일반 파일로 예측했고, 그중 1,000,000개는 일반 파일이기 때문에 TN의 값은 1,000,000개입니다. 그리고 나머지 100개는 모델에서는 일반 파일로, 실제 값은 악성 파일이기 때문에 FN의 값은 100개로 볼 수 있습니다. 위에서 설명한 바와 같이 정확도는 99.999%라고 높아 보이지만, 정밀성의 경우 0(TP)/(100(FP)+0(TP)) = 0/100 = 0이고, 재현율도 0(TP)/(100(FP)+0(TP)) = 0/100 = 0입니다. 그렇기 때문에 모델 성능을 볼 때는 정확도만 보는 게 아니라 위 5가지의 지표를 모두 연계하여 판단해야 합니다.
표 4. 극단적인 상황 예제에서의 혼돈행렬
예측 값 | |||
일반 | 악성 | ||
실제 값 | 일반 | 1,000,000(TN) | 0(FP) |
악성 | 100(FN) | 0(TP) |
ML기반 PDF 악성코드 탐지 결과
실험에 사용한 데이터로는 학습데이터 18,778개 중 일반파일 8,781개, 악성파일 9,997개를 사용하였으며 검증데이터로는 일반파일 975개, 악성파일 1,111개로 실험하였습니다. 모델링에 모델 성능평가에 신뢰도 향상을 위해 k-겹 교차검증을 활용했습니다. 학습모델은 어떠한 학습데이터, 평가데이터를 선정하는가에 따라 매우 다른 성능을 가질 수 있기 때문에 인공지능 분야에서는 데이터를 잘 나눈 것이 매우 중요합니다. 이에, 공평하게 나누는 방법으로 고안된 방법으로 k-겹 교차검증을 많이 이용하는데, 학습용/평가용 데이터 세트를 나누는 방법의 하나로 한 번의 학습용/평가용 데이터로 얻은 성능보다는 여러 번 나눈 것의 평균을 계산하는 것이 모델 검증에 신뢰성을 확보할 수 있기 때문입니다.
따라서, 본 포스팅에서는 데이터의 10%씩 총 10번의 k겹 교차 검증을 진행하였고, 아래 표 5, 표 6의 정확도와 정밀성, 재현율, f1-score, auc 값 그리고 혼동행렬로 모델을 평가하였습니다.
표 5. 10-겹 교차검증 결과
Model 1 | Model 2 | Model 3 | Model 4 | Model 5 | Model 6 | Model 7 | Model 8 | Model 9 | Model 10 | average | |
Accuracy | 0.995 | 0.994 | 0.996 | 0.997 | 0.994 | 0.996 | 0.996 | 0.999 | 0.996 | 0.995 | 0.996 |
precision | 0.997 | 0.998 | 0.997 | 0.999 | 0.996 | 0.999 | 0.998 | 1 | 0.996 | 0.995 | 0.998 |
recall | 0.995 | 0.994 | 0.995 | 0.995 | 0.993 | 0.993 | 0.995 | 0.997 | 0.995 | 0.996 | 0.994 |
f1 | 0.995 | 0.994 | 0.996 | 0.997 | 0.995 | 0.996 | 0.996 | 0.999 | 0.996 | 0.996 | 0.996 |
auc | 0.995 | 0.994 | 0.996 | 0.997 | 0.994 | 0.996 | 0.996 | 0.999 | 0.996 | 0.995 | 0.996 |
표 6. 검증 데이터의 혼동행렬
예측 값 | |||
일반 | 악성 | ||
실제 값 | 일반 | 973개 | 2.6개 |
악성 | 6.3개 | 1,105개 |
표 5는 10번의 학습 결과를 나타낸 결과로, 10번의 모델에서 모두 비슷한 성능을 가지는 것으로 보아 데이터의 불균형 없이 학습이 잘 이루어 지는 것을 볼 수 있었으며, 평균적으로 이진 분류의 정확도 0.996, 정밀도는 0.998, 재현율은 0.994, f1-score 0.996으로 높은 점수를 획득하였습니다. 표 6에서 모델이 예측한 결과가 실제 결과와 얼마나 일치하는지를 확인하기 위한 혼동행렬 표입니다. 총 10번의 학습 결과의 평균치를 나타냈는데 2,087개 중 평균 8.9개의 오답이 있으며 2,078개의 정답을 맞힌 결과를 볼 수 있습니다.
기존에 연구한 시그니쳐 기반 탐지와 비교했을 때, 시그니쳐 기반은 약 70% 정도의 탐지율을 보였습니다. 반면, 같은(혹은 비슷한) feature를 가지고 ML 학습을 진행한 후 결과를 보면 분명한 차이가 발생하는 것을 볼 수 있습니다.
글을 마치며
본 포스팅에서는 ML을 이용한 PDF 악성코드 탐지 방법론에 대해 다루었습니다. 전통적으로 악성코드 탐지 방법인 시그니처 탐지 방법은 분석 시간이 상대적으로 오래 걸리며, 새로운 공격 패턴에 대해 즉각적으로 대응하지 못하지만, ML을 활용할 경우 이러한 문제를 상당 부분 해결할 수 있고, 탐지 성능에서도 우수함을 알 수 있습니다.
하지만 최근 인공지능 기반 악성코드 탐지 기술을 회피하는 방법에 관련한 공격 연구도 진행되고 있어, 이에 효과적으로 대응하기 위해 시그니처 추출 기반 탐지 방법론을 활용하여 정확하고 명확한 특징을 선정하고, 이를 통해 개선된 학습 모델을 생성하는 연구가 지속해서 필요함을 알 수 있습니다[1].
다음 포스팅에서는 ML을 이용하여 HWP 및 MS-OFFICE 악성코드를 탐지하는 방법론에 대해 알아보도록 하겠습니다.
Reference
1. 최선오, 김영수, 김종현, 김익균.(2017).딥러닝을 이용한 악성코드탐지 연구동향.정보보호학회지,27(3),20-26.

손진혁 연구원은 컴퓨터공학과를 학부, 석사과정을 졸업했다. 현재 카이스트 사이버보안연구센터 AI보안 팀원으로 XAI를 활용한 인공지능의 보안 연구를 진행하고 있다.