좋은징조 담당교수 : 조성제 52131086 김도엽 32121875 김현일 32131732 이상훈
딥러닝을 이용한 안드로이드 앱 악성코드 탐지
목차 1.문제의 대두 2.안드로이드 앱의 취약성 3.실행 환경 4.DEX 5.CNN 6.방법론 7.데이터셋
1. 문제의 대두 - 악성코드의 증가 컴퓨터에 악영향을 끼치는 소프트웨어의 총칭 매년 악성코드 감염수가 증가 => 악성화 코드로 인한 이익이 상당함 급증 한 이유 : 악성화 코드를 통한 금전적 이익이 상당함 =>백신의 탐지를 피하기 위한 다형성 기법의 보편화, 분석 방해 기법도 진화
1. 문제의 대두 - 모바일 악성코드 모바일 시장에서 어플리케이션 다운로드 수의 증가 어플리케이션에 포함된 악성코드로 인한 감염 샘플들의 수가 똑같이 증가 스마트폰의 사용자가 급증하면서 모바일 시장에서 어플리케이션 다운로드의 수도 함께 증가 어플리케이션에 심어진 악성코드의 설치로 인해 감염된 샘 플들의 수도 증가
1. 문제의 대두 - 모바일 악성코드 피해 정상동작 과금유도 방해 모바일 악성코드 개인정보 원격제어 유출 유해사이트 접속 국제 전화, SMS 등 과금 서비스 무단 사용 콘텐츠 삭제, 배경화면 변경 원격제어 개인정보 유출 유해사이트 접속 악성코드 설치 및 원격 조정 SMS, 주소록 통화내역, 위치정보 등 유출 스마트폰의 기능의 확대 - 금융거래, 개인정보등을 기록 그에 따른 모바일 악성코드로 인한 피해 사례들 => 사용자의 개인정보를 유출로 인한 경제적인 사회적인 문제야기 출처 : 2017 Internet &security Focus 6월호 유해사이트 접속 유도 후 주민등록 번호 유출
2. 안드로이드 앱의 취약성 높은 시장 점유율 앱스토어의 검증 절차 미흡 -> 누구나 등록가능 악성코드 제작, 유포가 용이 => 악성코드 감염 가능성 ↑ 안드로이드가 다른 os보다 악성코드 감염이 많은 이유로는 시장 점유율이 가장 높고, 악성코드 제작과 유포가 가장 용이하기 때문이다. 또한 앱스토어의 검증 절차가 미흡하기 때문에 누구나 등록이 가능한 구조도 이유 중의 하나이다 source : Mobile Cyber Threat Report ; malware rate / INTERPOL, Kaspersky Lab
한계 : 이미 발견된 패턴에 대해서 정립하기 때문에, 지속적으로 변조되어지는 악성코드들을 전부 탐지하기에 어려움이 있다 2. 안드로이드 앱의 취약성 시그니처 탐지기법 이미 발견되서 정립 되어진 공격 패턴을 미리 입력해두고, 입력된 패턴에 해당하는 트래픽을 발견하게 되었을 때 이를 감지하여 알려주는 탐지 기법 한계 : 이미 발견된 패턴에 대해서 정립하기 때문에, 지속적으로 변조되어지는 악성코드들을 전부 탐지하기에 어려움이 있다 새로운 대안 : 딥러닝을 이용 => 악성코드 분석 / 탐지 / 예방 가능 시그니처 탐지 기법이란, 이미 발견되서 정립 되어진 공격 패턴을 미리 입력해 두고, 입력된 패턴에 해당하는 트래픽을 발견하게 되었을 때 이를 감지하여 알려주는 것 이미 발견된 패턴에 대해서 정립 하기 때문에, 지속적으로 변조되어지는 악성코드들을 전부 잡기는 어려움
2. 안드로이드 앱의 취약성 - 해결방안 왜 딥러닝을 이용해서 바이러스를 잡는가? 기하급수적으로 늘어나는 악성 앱을 검출해내기 위해서는, 새로운 유형의 데이터 에 대해서 잘 학습 할 수 있는 딥러닝을 이용하는 것이 가장 효과적이라고 판단 했 습니다.
3. 실행 환경 OS : Window 10 Main Program : PyCharm(python 3.6) NN Library : Keras(backend : tensorflow) CPU : i5 - 7500 SSD : 850 evo GVA : gtx1070(8GB) RAM : 16GB
악성코드 탐지 기존 연구 Natarj는 binary파일을 8bit gray scale 이미지로 변환했을 때에, 바이러스와 정상프로그램 사이에 차이가 있을 것이라고 판단하고 연구를 진행했고, 실제로 9,458개의 데이터를 대상으로 25 class 분류를 하였을 때 98%의 성능을 냈습니다. 그것이 가능했던 이유는, 감염시키기 위해서 사용되는 바이러스 코드와 실행을 위 주로 만들어진 정상적인 프로그램의 binary 데이터들은 서로 binary값의 분포와 형 태가 다르기 때문에 가능한 것. 저희는 Natarj가 사용했던 머신러닝 기법이 아니라 딥러닝 기법을 이용해서 더 좋은 효과를 내 보려고 합니다.
dex file (Dalvik Executable Format) : 안드로이드 프로그램에서 컴파일된 dalvik 실행 파일로서, 실행에 필요한 데이터들 을 binary형태로 저장 컴파일시 모든 .class 및 .jar 파일은 Dalvik 바이트 코드 형식으로 작성된 단일 classes.dex 파일로 결합됨 dex에는 실행에 필요한 데이터들이 다 있기 때문에, dex를 분석하면 바이러스와 정 상 프로그램을 분류할 수 있음 JAR : (Java Archive)는 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 모아놓은 파일
4. dex의 파일구조 /x68, /x6C 이미지 - softdx’s blog
4. DEX - 바이너리 이미지화(bin2img) dex binary에서 원하는 영역을 잘라온 다음에, 해당 영역의 부분의 binary 파일을 8비트씩 잘라서, 바이트로 만들게 되면 흑백 이미지로 변환 가능해집니다. (binary 값은 Intensity의 의미를 지니며, Intensity는 밝기를 의미합니다. 0-검정 255-흰색) 우측에서 알 수 있듯이, 정상 프로그램과, 바이러스 프로그램 사이의 binary 이미지 모양의 변화가 다르다는 것을 확연히 알 수 있습니다. 이미지 : ‘Android Malware Detection using Convolutional Neural Networks and Data Section Images’ - 단국대 정재민 연구원 논문 발췌
5. CNN(Convolution Neural Network) dex파일을 이미지로 만든후, 정상 프로그램과 바이러스 프로그램을 분류하기 위해서 CNN을 사용 CNN은 이미지 분류를 위해서 사용하는 가장 좋은 분류기로서 평가 받음 ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)의 2012년 대회에서 제프리 힌튼 교수팀의 AlexNet이 top 5 test error 기준 15.4%를 기록해 2위(26.2%)를 큰 폭으로 따돌리고 1위를 차지함. 2018 네이버 개발자 컨퍼런스에서는 CNN을 이용한 사람의 분류율을 99.7% 달성에 성공했다고 밝힘 검증은 되지 않았지만 특정 데이터셋에 대해서는 높은 정확도를 보인다고 봅니다. CNN = Convolution + Neural Network
5. CNN(Convolution Neural Network) - NN 인공신경망은 퍼셉트론과 활성화 함수의 집합들인데, 퍼셉트론은 F(입력값 * 가중치 + 편향) = F(출력값)의 형태고, 활성화 함수로 선형적인 문제를 비선형으로 만듭니다.
5. CNN(Convolution Neural Network) - Convolution(1) 필터에 변형을 주어가면서, 기댓값에 가장 가까운 출력값을 만들기 위해서 가중치를 학습합니다. Convolution = image -> convolution -> feature map
5. CNN(Convolution Neural Network) - Convolution(2) 가로 세로 필터에 따른 이미지 변화 세로필터 가로필터
5. CNN(Convolution Neural Network) - Convolution(3) Convolution을 통한 Feature map의 변화가 뚜렷함 레이어 한개를 거쳤을 뿐인데 많은 변화가 발생함 filter는 단지 2비트만을 사용
5. CNN(Convolution Neural Network) - Convolution(4) feature map의 변화임 필터를 씌우고, 씌운 것끼리 합치고… Convolution 단 뽑힌 feature의 조합으로 기댓값 만들기 : full connected 단 실제로 CNN 네트워크의 구조에 따른 변화를 보여드려야 할거 같습니다.
Dropout Dropout은 매 batch마다(데이터의 학습 사이즈) 새로운 모델로 학습하기 위해서 임의의 unit을 아예 학습에 포함하지 않습니다. 1개 모델 batch만큼의 모
5. CNN(Convolution Neural Network) - Dropout NN을 구성할 때에 있어서 Dropout을 추가할 수 있는데, Dropout은 Feature Extracting을 원활하게 하기 위한 방법중 하나로서 다음과 같은 효과를 가진다 여러개의 모델을 사용하는 것과 같은 효과 batch 단위로 달라짐 모델 최적화 속도 향상 가능 Feature Extracting 학습되지 않는 feature를 고를 수 있음 오버피팅 방지 과도하게 학습되는 경우를 방지 할 수 있음 CNN에서는 안쓰지만 데이터가 작아서 오버피팅 방지용 적용해볼 예정임
퍼셉트론 no activation activation 퍼셉트론 output 공식 : ( 입력값 * 가중치 + 편향) = if (출력값 < 임계치) then output = 0 0 x 가중치 + bias = bias = output = 0 255 x 가중치 + bias = output = f(output) ex : 가중치가 1일때, bias도 1이고, 임계치 128이라고 가정 a: pixel 값이 1 : 1 * 1 + 1 = 2(output) if(2 < 128) then output = 0 b: pixel 값이 255 : 255*1 +1 = 256(output) if(256 > 128) then output = f(256)
6. 방법론 bin 파일을 이미지화 할 때, 어느 영역에 얼마나 많은 데이터들이 들어 있느냐 빈도수를 이용해서 이미지화 (기존 방법과 서로 비교) bin 파일을 이미지화 할 때, 중요한 점이 어떤 데이터가 들었느냐 벡터나 그래프화로 처리
6. 방법론 pixel을 이미지화하는 방법론(natarj 방법에는 문제가 있었음) 1) 단순히 이미지화의 문제 단순히 8bit씩 읽어와서 (0~255)의 값을 가진 값으로 pixel로 변환 0000 0001 -> 1 1111 1111 -> 255 binary 파일 안에 있는 기계어의 종류에 따라서 중요도가 달라져버릴수가 있는데, 이런 경우 임계치 값 미만은 다 의미가 없다고 판단해버릴 경우가 있 ex. 임계치가 128이면, binary의 128미만의 기계코드는 전부 의미없는 값이 되어버림. 하지만 실제로 binary값은 쓰레기값이나 00이 아니면 의미있는 값으로 봐야함 좌측 같은 경우에는 심하면 1이 255보다 1/255배 중요한 값이 되어버림. 2) 의미의 소실 (ex.Resize로 5개의 값을 1개로 묶을 때 ) 50 50 50 50 50 = 250
6. 방법론 픽셀이 resize되면서 의미가 퇴색됨 의미가 퇴색이 됨에도 불구하고 성능이 좋음 - 데이터가 얼마나 binary 파일에서 어느 영역에 위치하느냐 즉, 픽셀의 값이 가진 의미보다, 빈도수가 중요하진 않을까? 2) 해결법 (black or white) 0 = 1~255 -> 255 resize 값에 따라서 gray intensity를 정함 (ex 가로, 세로 resize를 통해 2배씩 줄어든다면) 파이썬 resize 원리가 최근접 이웃 보간법으로 RESIZE가 되어서, 임계값 미만이면 0, 임계값 이상이면 255로 알고리즘 수정 0, 65, 130, 195, 255 (0, 0.25*255, 0.5*255,5 0.75*255,5 1*255)
6. 방법론 25개의 벡터들의 합으로 이루어진 v벡터는 25개의 원핫 벡터의 합 임 3) vector 형식 0, .. . . . . . . 255의 픽셀값을 256차원에서 1의 값을 갖는 256차원의 벡터로 변형. ex : a = 0, b = 2, c = 255인 픽셀을 벡터로 만들면 a = [1, 0, 0, … , 0], b = [0, 0, 1 , 0, ….. 0], c =[0, 0, 0, …, 1] 픽셀의 값이 높으면 인공신경망 입장에서는 중요한 값이고, 픽셀 값이 낮으면 안 중요한 값이 되어 버립니다.-퍼셉트론 하지만 실제로는 높은 값이 더 중요한 것이 아니라, 값이 단지 다르다는 것을 나타내는 것이기 때문에, 높은 값이 중요한 값을 의미하는 natarj방식은 우리가 원한 값이 아님 a) 빈도의 합으로 섹션의 길이가 다르기 때문에 resize를 해줘야 하는데, resize하는 과정에서 값의 손실이 발생할 수 있음. 손실되지 않도록 값을 압축하기 위해서 벡터를 빈도를 측정하게 만듭니다. (단순히 더해주면 됩니다.) ex. 1000 * 1000의 data section을 200 * 200이미지로 줄이게 되면, 가로 1/5배, 세로 1/5로 줄어들면서 값의 손실이 96% 정도 발생하게 됨 해당 문제를 해결하기 위해서 25개 원핫 벡터의 합으로 1개의 벡터를 만듭니다. v v v v v v v v v v v v v v v v v v v v v v v v v 25개의 벡터들의 합으로 이루어진 v벡터는 25개의 원핫 벡터의 합 임 V
6. 방법론 3_1) 코드의 패턴을 벡터화해서 word2vec 방식으로 문제를 풀 수도 있음 -> 이미지화가 아니라서 나중의 연구주제로 넘김
6. 방법론 3_2 256차원을 2차원으로 차원축소 후에 이미지화후 분류 v v v v v v v v v v v v v v v v v v v v v v v v v 25개의 벡터들의 합으로 이루어진 v벡터는 25개의 원핫 벡터의 합 V w = 224 V V V V V V V V V V V V V V V V V V V V V V V V V V V h = 224 V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V
6. 방법론 3_3) 코드의 패턴을 벡터화해서 word2vec 방식으로 문제를 풀 수도 있음 픽셀의 값이 256가지의 종류(차원에서의 단위벡터)가 가능하고, 256차원을 256개의 필터로 해석 256개의 필터
6. 방법론 4) variance로 그래프(혹은 신호로) 만들기(trash값으로부터의 variance로) bit로부터의 분산을 기준으로 만들어지는 분산 그래프입니다. 0 60 128 128 200 255의 5가지 값이 있고, 가장 많이 반복되는 값(혹은 trash 값)을 μ(평균값)로 가정. μ가 128일때 그래프는 다음과 같이 그려집니다. value 128 -128 1 2 3 4 5 offset
6. 방법론 5) 코드들을 분석해서 코드들의 행위에 따라서 특정 비트나 색깔을 부여해서 이미지화 해보기 code section의 코드들을 java코드로 변경, google에 dex2jar 검색하면 나옵니다. 변경된 코드들을 기반으로, 행위에 따라 값을 부여합니다.(print는 붉은색(출력), scanf는 파란색(입력) System call은 초록색(커널접근)) 행위에 따라 부여된 값들을 기반으로 이미지화하기
데이터는 정보보호 R&D 데이터 챌린지 2018 에서 제공 파일이름.vir의 형태로 제공받음 7. 데이터셋 데이터는 정보보호 R&D 데이터 챌린지 2018 에서 제공 파일이름.vir의 형태로 제공받음 파일이름은 해쉬 값으로 되어 있기 때문에, 추후에 단순하게 넘버링할 예정 정상 앱 : 4000 악성 앱 : 1999(1개는 압축 푸는데 오류발생해서 제거함) 상자는 400개 단위 의 데이터를 의미
Train, Validation, Test 인공신경망에서 학습을 하기 위해서는 데이터셋이 필요합니다. 그리고 데이터셋의 용도에 따라서 3가지로 분류가 되는데, 신경망을 학습시키는 데이터를 Train Data 학습이 잘 됬는지 검증하는 데이터를 Validation Data 정말로 처음보는 데이터에 대해서도 어느정도의 성능을 나타낼지를 의미하는 Test Data가 있습니다.
데이터는 train, validation, test를 각각 6:2:2로 나눌 예정입니다. 정상 악성 7. 데이터 나누기 데이터는 train, validation, test를 각각 6:2:2로 나눌 예정입니다. train : 정상 (4000 * 0.6), 비정상 (1999*0.6) validation : 정상 (4000 * 0.2), 비정상 (1999*0.2) test : 정상 (4000 * 0.2), 비정상 (1999*0.2)
7. 데이터셋 - Validation? 실제로 Training과 Test데이터를 가지고 학습하게 되면 NN에서는 언제 오버피팅이 발생하는지 알수 없고, UnSeen Data에 대해서는 검증이 불가능함. Train과 Test 데이터만 가지고 학습하면, 실제로는 학습이 잘되었는지 검증을 Test가 하는 것이고, 우리가 나중에 학습을 종료하는 시점이 Test가 값이 가장 잘 나오는 부분에서 학습 종료가 됩니다. 그러면 최적의 Test를 만드는 Training을 학습하는 것이므로, 정말로 UnSeen Data에 대해서 학습을 했다고 보기 어려움. 이 두가지 이유 때문에 validation데이터를 사용하며, 유사한 방법으로 k-fold가 있음 적은 데이터에서는 두가지 중 어떤 것이 더 좋다고 말하기 힘듭니다. 데이터에 validation을 사용하면, 처음보는 데이터에 대해서도 어느정도의 성능을 나타내는지를 실질적으로 검증이 가능하다는 의미입니다.
상기 방법론들을 통해서 앱의 dex 파일을 이미지로 만든 다음에, 분석할 예정 Role 상기 방법론들을 통해서 앱의 dex 파일을 이미지로 만든 다음에, 분석할 예정 김현일 악성코드 분석 딥러닝 모델 설계 김도엽 안드로이드 앱 데이터 패턴 분석 이상훈
Timeline 9월 - 아이디어 회의 10월 - 방법론에 따른 데이터 생성, 데이터 분석 11월 - 데이터 분석 및 분류기 성능 측정 12월 - 분류프로그램 성능 향상 시도
실험 dex파일의 binary 값을 byte단위로 읽어와서 (0~255)의 값을 가진 pixel로 변환 1) 단순히 이미지화 단점 : 파일 크기가 큰 경우에 resize되면서 주변 값의 영향을 받을 수 있음. 좌측 그림 같은 경우는 4바이트가 보간되지만, 현재 데이터셋에서는 93~128바이트단위로 보간이 될수도 있음
변환된 이미지들 악성코드 정상코드 20번 2379번 2385번(실질적으로 원한 이미지) 152번(실질적으로 원한이미지) 30번 악성코드 정상코드 20번 2379번 2385번(실질적으로 원한 이미지) 152번(실질적으로 원한이미지) 30번 878 번
성능(84%) Train Graph Val Graph 학습은 잘되니 모델은 이상 없음 1.데이터 부족으로 오버 피팅,(100) 2.val acc가 올라가는 건 normalize한 결과가 아 님. 신뢰 불가
실험 2) Black or White 0 = 1~255 -> 255 0 = 1~255 -> 255 resize되는 값중 단 하나라도 1이상의 값을 가지고 있다면 흰색으로 판단 (메모리 내에서 값이 있는지 없는지가 중요한가를 판단하기 위함) resize값이 10이라서 10바이트가 1개의 바이트로 resize된다면, 다음과 같이 됩니다.
변환된 이미지들 악성코드 정상코드 20번 152번(실질적으로 원한이미지) 2379번 2385번(실질적으로 원한 이미지) 악성코드 정상코드 20번 152번(실질적으로 원한이미지) 2379번 2385번(실질적으로 원한 이미지) 878 번 30번
성능(82%) Train Graph Val Graph 학습은 잘되니 모델은 이상 없음 1.데이터 부족으로 오버 피팅,(100) 2.val acc가 올라가는 건 normalize한 결과가 아 님. 신뢰 불가 100에폭에서 로스가 오 르면 acc가 떨어짐. 저게 정상.
실험 3) Black or White 0 = 1~255 -> 255 0 = 1~255 -> 255 resize 값에 따라서 gray intensity를 정함 (ex resize를 통해 5배씩 줄어든다면) 이 방식을 이용하게 된다면, 위의 Black or White에서 발생한 문제 에서 Intensitiy의 다양성을 줌으로써, 문제를 단순화하면서도 해결 이 가능한 것으로 보입니다. 0, 65, 130, 195, 255
변환된 이미지들 악성코드 정상코드 2379번 20번 152번(실질적으로 원한이미지) 2385번(실질적으로 원한 이미지) 30번 악성코드 정상코드 2379번 20번 152번(실질적으로 원한이미지) 2385번(실질적으로 원한 이미지) 30번 878 번
성능(86%) Train Graph Val Graph 학습은 잘되니 모델은 이상 없음 1.데이터 부족으로 오버 피팅(100) 2.val acc가 올라가는 건 normalize한 결과가 아 님. 신뢰 불가 접근 방법에 문제가 있 는 것을 확인 데이터 전 처리 필요성 확인
6. 방법론 4) variance로 그래프(혹은 신호로) 만들기(trash값으로부터의 variance로) bit로부터의 분산을 기준으로 만들어지는 분산 그래프입니다. 0 60 128 128 200 255의 5가지 값이 있고, 가장 많이 반복되는 값(혹은 trash 값)을 μ(평균값)로 가정. μ가 128일때 그래프는 다음과 같이 그려집니다. value 128 -128 1 2 3 4 5 offset
4번 방법 적용 후 성능 Acc = 86%가 나옵니다. 마찬가지로 오버피팅 되는 것을 알 수 있습니다.
Thank you.