Мал­варь для Android стре­митель­но раз­вива­ется, и анти­виру­сы про­тив нее не всег­да эффектив­ны. И даже если не брать в рас­чет откро­вен­но вре­дитель­ские при­ложе­ния, самые что ни на есть легитим­ные прог­раммы порой про­сят при­виле­гии, которые им, по идее, не нуж­ны. Как узнать, что дела­ет то или иное при­ложе­ние в тво­ем Droid-девай­се и не собира­ет ли оно о тебе допол­нитель­ные све­дения?
 

Введение

Как ты, ско­рее все­го, зна­ешь, сущес­тву­ет два метода ана­лиза при­ложе­ний: ста­тичес­кий и динами­чес­кий. Пер­вый вклю­чает в себя дизас­сем­бли­рова­ние, деком­пиляцию, иссле­дова­ние манифес­та при­ложе­ния. Вто­рой пред­полага­ет запуск при­ложе­ния в спе­циаль­ном окру­жении, поз­воля­ющем про­извести ана­лиз его поведе­ния в так ска­зать реаль­ных усло­виях. На прак­тике, как пра­вило, при­меня­ются оба метода, при­том одновре­мен­но. Но так как ста­тичес­кий метод ана­лиза мы уже рас­смат­ривали (статья «Ана­томия с пре­пара­цией», № 170), в этой статье скон­цен­три­руем­ся на динами­чес­ком.

В самом Android по дефол­ту прак­тичес­ки отсутс­тву­ют встро­енные средс­тва для динами­чес­кого ана­лиза пос­торон­них при­ложе­ний. С одной сто­роны, в дес­ктоп­ных ОС эти средс­тва зачас­тую исполь­зуют­ся в целях, пря­мо про­тиво­полож­ных их наз­начению (прос­тей­ший при­мер — фун­кция вин­ды CreateRemoteThread(), которая лет десять назад успешно экс­плу­ати­рова­лась вся­чес­кой мал­варью, или уже набив­шие оско­мину хуки API все той же вин­ды), с дру­гой же — без них прак­тичес­ки невоз­можно про­изво­дить ана­лиз злов­редных при­ложе­ний.

Но здесь у Android есть один супер­плюс — его код открыт. А это зна­чит, что всю фун­кци­ональ­ность, необ­ходимую для эффектив­ного ана­лиза при­ложе­ний, в него мож­но добавить. Имен­но это сде­лали иссле­дова­тели из про­екта TaintDroid, наработ­ки которо­го затем были исполь­зованы при соз­дании эму­лято­ра DroidBox, который поз­воля­ет изу­чать при­ложе­ния пря­мо на ком­пе.

DVD

В име­ющей­ся в офи­циаль­ных репози­тори­ях вер­сии DroidBox есть недоче­ты. На dvd.xakep.ru ты най­дешь исправ­ленный скрипт, который нуж­но ско­пиро­вать в соот­ветс­тву­ющую пап­ку пос­ле заг­рузки репози­тория.

 

DroidBox

DroidBox сос­тоит из двух час­тей, которые условно мож­но наз­вать Host и Target. Target-часть, запус­каемая на эму­лято­ре, пред­став­ляет собой сбор­ку Android 4.1.2 с набором пат­чей, боль­шая часть из которых взя­та из TaintDroid без изме­нений. Пат­чи добав­ляют некото­рые фун­кции для отсле­жива­ния дан­ных на низ­ком уров­не.

Host-часть — набор скрип­тов на питоне, который соеди­няет­ся с эму­лято­ром и получа­ет от Target-час­ти все­воз­можную информа­цию об ана­лизи­руемом при­ложе­нии и выводит ее в тек­сто­вом и гра­фичес­ком видах.

DroidBox рас­простра­няет­ся как в исходных тек­стах, так и в виде готовых бинар­ников (при этом, разуме­ется, нуж­но иметь Android SDK и соот­ветс­твен­но задан­ную перемен­ную $PATH, куда нуж­но добавить пути к катало­гам tools и platform-tools). Пос­коль­ку он доволь­но дав­но не обновлял­ся, име­ет смысл не мучить­ся со сбор­кой из репози­тория, а взять уже готовый. Перед этим нуж­но пос­тавить некото­рые пакеты:

$ sudo apt-get install python-numpy python-scipy python-matplotlib subversion

И ска­чать собс­твен­но DroidBox:

$ wget http://droidbox.googlecode.com/files/DroidBox411RC.tar.gz && tar xzvf DroidBox411RC.tar.gz

По неиз­вес­тным мне при­чинам основной скрипт DroidBox в архи­ве не генери­рует гра­фики, а ста­рый скрипт, который находит­ся в SVN-репози­тории в катало­ге external, не работа­ет, поэто­му мне приш­лось изме­нять код текуще­го скрип­та, слег­ка испра­вив его и выдер­нув из ста­рого скрип­та нуж­ные час­ти. Мою модифи­кацию скрип­та ты най­дешь на DVD.

За­тем соз­даем AVD (Nexus 4 с Android 4.1.2 на бор­ту) и запус­каем его с помощью скрип­та, находя­щего­ся в све­жерас­пакован­ном катало­ге:

$ ./startemu.sh DroidBox

В качес­тве парамет­ра скрипт при­нима­ет имя све­жесоз­данно­го AVD, при этом в конеч­ном сче­те запус­кая не ори­гиналь­ный System image, а тот, который идет в ком­плек­те с DroidBox. Сле­дом нуж­но под­сунуть в эму­лятор при­ложе­ние, которое мы хотим ана­лизи­ровать. В качес­тве подопыт­ных я выб­рал нес­коль­ко сем­плов мал­вари, а имен­но Simplocker, Fakemart, один из бан­ков­ских тро­янов и нашумев­ший Android.OBad.a.

Создание AVD для DroidBox
Соз­дание AVD для DroidBox
 

Simplocker

Это отно­ситель­но недав­ний злов­ред, написан­ный по заветам вин­локеров. Пос­ле запус­ка он обви­нит тебя в нек­ропедо­зоофи­лии, зашиф­рует все изоб­ражения, видео и докумен­ты на кар­те памяти и пот­ребу­ет опла­тить их рас­шифров­ку.

Simplocker собственной персоной
Simplocker собс­твен­ной пер­соной

За­пус­каем семпл:

$ droidbox.sh /home/rom/android_malware_samples/simplocker/simplocker.apk

В окне эму­лято­ра появит­ся глав­ный экран при­ложе­ния, который будет запус­кать­ся вновь при каж­дой попыт­ке его зак­рыть. Ждем какое‑то вре­мя, пыта­емся что‑то делать, кли­каем мыш­кой по раз­ным час­тям экра­на и в ито­ге при­бива­ем эму­лятор, нажав в тер­минале.

В ито­ге получа­ем три фай­ла: диаг­рамму обще­го рас­пре­деле­ния опе­раций, гра­фик их рас­пре­деле­ния по вре­мени и собс­твен­но трас­сиров­ку. Име­на пер­вых двух фай­лов сос­тоят из пре­фик­са (tree- для диаг­раммы, behaviorgraph- для гра­фика по вре­мени и trace- для трас­сиров­ки), име­ни пакета, даты и вре­мени. В моем слу­чае имя фай­ла трей­са для Simplocker выг­лядело как trace-org.simplelocker-20141008-1635.png.

Те­перь смот­рим. На гра­фике по вре­мени (см. скрин­шот) пер­вые мгно­вения у нас идет заг­рузка DEX-фай­ла, затем запуск сер­виса и опе­рация с крип­тоAPI Android (судя по все­му, еди­нич­ная), а затем прак­тичес­ки неп­рерыв­но идет поток фай­ловых опе­раций, по срав­нению с которым гре­бешок сетевых опе­раций (net read, net open) кажет­ся ред­ким. Дей­ствия же поль­зовате­ля на эту диаг­рамму не вли­яют.

Simplocker. График распределения операций по времени
Simplocker. Гра­фик рас­пре­деле­ния опе­раций по вре­мени

Структура файла трассировки DroidBox

Файл трас­сиров­ки DroidBox пред­став­ляет собой запись дей­ствий в фор­мате JSON и име­ет сле­дующие сек­ции:

  • accessedFiles — спи­сок фай­лов, к которым при­ложе­ние получи­ло дос­туп;
  • apkName — имя ана­лизи­руемо­го APK-фай­ла;
  • closenet — опе­рации зак­рытия сокетов;
  • cryptousage — опе­рации с крип­тоAPI Android;
  • dataleaks — утеч­ка лич­ных дан­ных поль­зовате­ля;
  • dexclass — опе­рации с DEX-клас­сами;
  • enfperm — добав­ленные (не исполь­зуемые!) при­ложе­нием раз­решения;
  • fdaccess — опе­рации с фай­лами;
  • hashes — MD5-, SHA-1- и SHA-256-хеши ана­лизи­руемо­го APK;
  • opennet — опе­рации откры­тия сокетов;
  • phonecalls — телефон­ные звон­ки;
  • recvnet — при­ем по сети;
  • recvaction — спи­сок интентов, на которые при­ложе­ние реаги­рует;
  • sendnet — опе­рации переда­чи по сети;
  • sendsms — отправ­ка сооб­щений;
  • servicestart — опе­рации запус­ка сер­висов.

Поч­ти все сек­ции име­ют сле­дующий фор­мат:

"Название секции" {
"Время операции (от начала запуска)" {
"Имя параметра, который отслеживается (к примеру, для sendnet это может быть desthost, destport и др.)": "Значение параметра"
}
}

Альтернативы: DroidScope и Android Hooker

DroidScope осно­ван на плат­форме для динами­чес­кого ана­лиза DECAF (Dynamic Executable Code Analysis Framework). В отли­чие от DroidBox, который внед­ряет свой код в Android, DECAF (а сле­дова­тель­но, и DroidScope) смот­рит поток выпол­нения эму­лято­ра в целом. Это, с одной сто­роны, поз­воля­ет уви­деть некото­рые низ­коуров­невые опе­рации, с дру­гой же — без пла­гинов, выделя­ющих полез­ную информа­цию, его при­мене­ние прак­тичес­ки невоз­можно.

Пла­гина­ми в DroidScope мож­но реали­зовать сле­дующее:

  • трас­сиров­ку API — в том чис­ле и обмен меж­ду натив­ным кодом и кодом Java, который про­исхо­дит с помощью JNI;
  • трас­сиров­ка как натив­ных инс­трук­ций, так и инс­трук­ций Dalvik VM;
  • от­сле­жива­ние сен­ситив­ных дан­ных, что поз­воля­ет опре­делить их утеч­ки.

К сожале­нию, в откры­том дос­тупе есть толь­ко пла­гин трас­сиров­ки инс­трук­ций Dalvik, а име­ющееся на офи­циаль­ном сай­те окру­жение вклю­чает в себя вер­сию Android Gingerbread, которая на дан­ный момент, мяг­ко говоря, уста­рела. Так что для при­мене­ния на прак­тике DroidScope при­дет­ся дораба­тывать.

Android Hooker исполь­зует фрей­мворк Substrate для отсле­жива­ния поведе­ния при­ложе­ний и обра­щения к API. По сло­вам авто­ра, он пред­назна­чен для ана­лиза поведе­ния не отдель­ного при­ложе­ния, но целых мар­кетов, для чего все дей­ствия мож­но записы­вать в БД elasticsearch. Одна­ко, как и в слу­чае с DroidBox, воз­можнос­ти отсле­живать натив­ные вызовы нет, что авто­мати­чес­ки ста­вит под сом­нение соот­ветс­твие при­ложе­ния дек­лариру­емым целям. Помимо это­го, Substrate работа­ет на более высоком уров­не, чем DroidBox, — соот­ветс­твен­но, уве­личи­вает­ся риск обна­руже­ния Android Hooker.

Пе­рей­дем к фай­лу трас­сиров­ки. Его струк­тура при­веде­на во врез­ке, здесь же мы рас­смот­рим дей­ствия, которые в этот файл записа­лись. За все вре­мя трас­сиров­ки при­ложе­ние получи­ло дос­туп к одним и тем же фай­лам как минимум нес­коль­ко сотен раз, при­чем сра­зу пос­ле обра­щения к фай­лу сле­дова­ло обра­щение к нему же, но уже с рас­ширени­ем enc (оче­вид­но, злов­ред чита­ет фай­лы, шиф­рует их и пишет резуль­тат в новые).

"accessedFiles": {
"100012523": "/mnt/sdcard/Download/original.jpg",
"1000285190": "/mnt/sdcard/Download/images-26825-27541-hd-wallpapers.jpg",
"1000303735": "/mnt/sdcard/Download/original.jpg",
"1000425910": "/mnt/sdcard/Download/images-26825-27541-hd-wallpapers.jpg.enc",
<...>
},

На 0,9 секун­де было исполь­зовано неч­то из крип­тоAPI, ско­рее все­го свя­зан­ное с генера­цией клю­ча, — об этом нам говорит сек­ция CryptoUsage. Там же ука­зан и алго­ритм (AES), и сам ключ (та‑дам!).

"cryptousage": {
"0.9651350975036621": {
"algorithm": "AES",
"key": "95, -81, 109, <...>",
"operation": "keyalgo",
"type": "crypto"
}
<...>
},

Сек­ция dataleaks пус­та — зна­чит, уте­чек сен­ситив­ных дан­ных (IMEI), по всей веро­ятности, не было:

"dataleaks": {},

В сек­ции fdaccess мы видим, что при­ложе­ние пос­тоян­но откры­вает, чита­ет и пишет фай­лы, выпол­няя шиф­рование... Но мы видим еще и запись в файл /data/data/org.simplelocker/app_bin/torrctether.

"fdaccess": {
"1.334583044052124": {
"data": "<...>",
"id": "1456730989",
"operation": "write",
"path": "/data/data/org.simplelocker/app_bin/torrctether",
"type": "file write"
},
<...>
}

Пре­обра­зуем стро­ку с шес­тнад­цатерич­ными дан­ными (в лис­тинге вмес­то нее "<...>") в ASCII и видим кусок кон­фига Tor. Чуть ниже, на 1,41 секун­де, будет запись в файл /data/data/org.simplelocker/app_bin/privoxy.config. Сно­ва пре­обра­зуем стро­ку... это начало кон­фига Privoxy. Даль­ше у нас ничего инте­рес­ного не будет, поэто­му перей­дем к сетевым опе­раци­ям (ибо сек­ция phonecalls пус­та).

При­ложе­ние ожи­дает дан­ных с пор­та 9051, который явля­ется управля­ющим пор­том Tor (раз­раб явно позабо­тил­ся о сво­ей кон­фиден­циаль­нос­ти). Дан­ные, кста­ти, тек­сто­вые, так что стро­ку мож­но опять же перекон­верти­ровать в ASCII. А отправ­ляет оно дан­ные на тот же порт — зада­ет парамет­ры Tor-соеди­нения.

"recvnet": {
"16.08561396598816": {
"data": "<...>",
"host": "127.0.0.1",
"port": "9051",
"type": "net read"
},
<...>
},
"sendnet": {
"8.150573968887329": {
"data": "<...>",
"desthost": "127.0.0.1",
"destport": "9051",
"fd": "148",
"operation": "send",
"type": "net write"
},
<...>
},

Мал­варь реаги­рует толь­ко на два интента ("ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" и "BOOT_COMPLETED") и запус­кает служ­бу — но это дос­таточ­но лег­ко узнать и без исполь­зования DroidBox, обыч­ным ста­тичес­ким ана­лизом.

"recvsaction": {
".SDCardServiceStarter": "android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE",
".ServiceStarter": "android.intent.action.BOOT_COMPLETED"
},

Вы­воды: за нес­коль­ко минут ана­лиза мы выяс­нили, что кон­крет­но зашиф­ровал наш локер, узна­ли о воз­можнос­ти получе­ния команд через сеть Tor и раз­добыли ключ для рас­шифров­ки фай­лов. Если бы мы дей­стви­тель­но под­цепили эту мал­варь на свой девайс, то лег­ко смог­ли бы вер­нуть все свои дан­ные, прос­то скри­нув их на комп и рас­шифро­вав с помощью OpenSSL и получен­ного клю­ча.

info

Ни один мар­кет не будет отправ­лять SMS на корот­кие номера, тем более нес­коль­ко раз

Веб-сервисы для анализа Android-приложений

  • Andrubis — допол­нение к широко извес­тно­му в узких кру­гах веб‑сер­вису anubis.iseclab.org, эму­лиру­ет Android 2.3.4, по всей видимос­ти (если судить по фор­мату отче­та), явля­ется допилен­ной вер­сией DroidBox. По каким‑то при­чинам он не смог запус­тить APK Simplocker, но зато Android.OBad.a перева­рил безо вся­ких проб­лем.
  • CopperDroid (copperdroid.isg.rhul.ac.uk) — еще один инс­тру­мент, осно­ван­ный на DroidBox. Это вид­но из самого фор­мата отче­та, который сов­пада­ет с фор­матом отче­та, генери­руемым выше­упо­мяну­тым инс­тру­мен­том. Но, в отли­чие от DroidBox, CopperDroid уме­ет отсле­живать сис­темные вызовы. По неиз­вес­тным при­чинам некото­рые из моих сем­плов он ана­лизи­ровать не захотел.
  • ApkScan (apkscan.nviso.be) — бель­гийская раз­работ­ка, эму­лиру­ет Android 4.1. Опять же осно­вана на DroidBox, пре­дос­тавля­ет в том чис­ле лог‑файл, генери­руемый logcat. Ничем осо­бен­ным не отли­чает­ся. Два моих сем­пла он не перева­рил, что, по‑видимо­му, свя­зано с тре­бова­ниями ими прав адми­нис­тра­тора устрой­ства.
 

Fakemart

Сле­дующим злов­редом будет Fakemart — при­ложе­ние, мас­киру­ющееся под магазин при­ложе­ний и рас­сыла­ющее плат­ные SMS. Запус­каем его и изоб­ража­ем обыч­ного поль­зовате­ля, ожи­дая заг­рузки чего‑то — веро­ятно, «репози­тория». «Заг­рузка», понят­ное дело, до кон­ца не про­ходит — видимо, с рас­четом на то, что его опять запус­тят. Пос­ле нес­коль­ких попыток (мы ведь обыч­ные поль­зовате­ли, прав­да?) оста­нав­лива­ем трас­сиров­ку и смот­рим, что у нас выш­ло.

Fakemart
Fakemart

Гра­фик по вре­мени показы­вает, что в пер­вые мгно­вения была отправ­лена SMS, затем была запись в файл, затем нес­коль­ко сетевых опе­раций, затем сно­ва мно­го записей в файл.

Fakemart. График распределения операций по времени
Fakemart. Гра­фик рас­пре­деле­ния опе­раций по вре­мени

Ди­аграмма рас­пре­деле­ния показы­вает, что да, боль­шую часть опе­раций занима­ет запись в файл, затем идут сетевые опе­рации, а уже потом — доволь­но тол­стый (если срав­нивать с опе­раци­ей заг­рузки клас­сов, DEXLOAD) стол­бик отправ­ки SMS.

Fakemart. Диаграмма общего распределения операций
Fakemart. Диаг­рамма обще­го рас­пре­деле­ния опе­раций

Что ж, пос­мотрим трейс. На сей раз спи­сок фай­лов, к которым при­ложе­ние име­ло дос­туп, дос­таточ­но мал, поэто­му лис­тать дол­го не при­дет­ся. Смот­рим, что никаких вызовов крип­тоAPI про­изве­дено не было, уте­чек дан­ных не зафик­сирова­но, и со спо­кой­ной совестью перехо­дим к записям в фай­лы.

В файл /data/data/com.android.blackmarket/shared_prefs/XMBPSP.xml зачем‑то записы­вает­ся номер, на который, как мы выяс­ним поз­же, про­исхо­дит отправ­ка SMS. Боль­ше это при­ложе­ние ни в какие фай­лы не пишет.

"fdaccess": {
"2.016759157180786": {
"data": "<...>",
"id": "312838054",
"operation": "write",
"path": "/data/data/com.android.blackmarket/shared_prefs/XMBPSP.xml",
"type": "file write"
},
<...>
}

Се­тевые опе­рации — попыт­ка открыть соеди­нение с опре­делен­ным адре­сом по 80-му пор­ту и затем попыт­ки при­нимать и отправ­лять дан­ные. Впро­чем, сер­вер отве­чает Forbidden, что и неуди­витель­но.

"opennet": {
"2.080552101135254": {
"desthost": "83.XXX.XXX.XXX",
"destport": "80",
"fd": "21",
"type": "net open"
},
},
"recvnet": {
"2.3735501766204834": {
<...>
}
<...>
"sendnet": {
"2.1825380325317383": {
<...>
}

От­прав­ка SMS про­изош­ла три раза, каж­дый раз при попыт­ке запус­ка при­ложе­ния.

"sendsms": {
"2.0525059700012207": {
"message": "AP",
"number": "XXXXX",
"type": "sms"
},
<...>
}

Вы­воды: сек­ция "sendsms" крас­норечи­во показы­вает, с чем мы стол­кну­лись. Ни один мар­кет не будет отправ­лять SMS на корот­кие номера, тем более нес­коль­ко раз. DroidBox выдал SMS-тро­яна с пот­рохами. Инте­рес­но, кста­ти, что раз­рабы явно соз­дали защиту от бло­киров­ки плат­ных номеров: опе­рации обме­на дан­ными с сер­вером и записи в файл — это, оче­вид­но, попыт­ка обновле­ния плат­ного номера.

 

iBanking

А это уже бан­ков­ский тро­ян. Один из его вари­антов, который мы раз­берем, мас­киру­ется под анти­вирус. Пос­ле уста­нов­ки он зап­рашива­ет пра­ва адми­нис­тра­тора устрой­ства.

Один из экземпляров банковского трояна
Один из экзем­пля­ров бан­ков­ско­го тро­яна

Гра­фик по вре­мени показал, что SMS была отправ­лена в пер­вые секун­ды, затем пошел гре­бень сетевых опе­раций. Диаг­рамма рас­пре­деле­ния показа­ла, что сетевые опе­рации были самыми интенсив­ными, по срав­нению с ними отправ­ка SMS на диаг­рамме прак­тичес­ки незамет­на.

График распределения операций по времени одного из банковских троянов
Гра­фик рас­пре­деле­ния опе­раций по вре­мени одно­го из бан­ков­ских тро­янов
Тот же самый банковский троян. Диаграмма общего распределения операций
Тот же самый бан­ков­ский тро­ян. Диаг­рамма обще­го рас­пре­деле­ния опе­раций

В трей­се же вид­на утеч­ка ICCID. И там же ука­зан спо­соб утеч­ки — SMS. По сети пос­тоян­но совер­шают­ся попыт­ки отпра­вить зап­рос POST.

"dataleaks": {
"1.6918201446533203": {
"message": "i am (89014103211118510720 + Unknown Full Android on Emulator)",
"number": "+XXXXXXXXXXXXXX",
"sink": "SMS",
"tag": [
"TAINT_ICCID"
],
"type": "sms"
}
}

И это все. Нес­мотря на то что iBanking — один из самых фун­кци­ональ­ных тро­янов для Android, DroidBox поч­ти ничего не смог нам о нем рас­ска­зать. При­чина это­му прос­та: злов­ред ожи­дает команд от сер­вера, и, если их нет, он прос­то спит. Для иссле­дова­ния подоб­ного соф­та при­дет­ся исполь­зовать ста­тичес­кий ана­лиз с его километ­ровыми лис­тинга­ми smali, деоб­фуска­цией и про­чими при­ятностя­ми.

 

Заключение

В целом DroidBox весь­ма удо­бен, но выг­лядит край­не сыро. Работа­ет толь­ко с опре­делен­ной вер­сией Android (даже мень­ше — толь­ко на эму­лято­ре) и под­держи­вает исклю­читель­но Java API, так что сме­шан­ный код ему под­совывать смыс­ла не име­ет. Сто­ит толь­ко при­ложе­нию обра­тить­ся через JNI к биб­лиоте­кам или, тем паче, к сис­темным вызовам, как оно сра­зу же выходит из поля зре­ния.

Кро­ме того, DroidBox отлавли­вает далеко не все воз­можные дей­ствия и перева­рива­ет не всех злов­редов. Нап­ример, тот самый Android.OBad.a при­ложе­ние отка­залось ана­лизи­ровать, выдав ошиб­ку «Failed to analyze the APK. Terminate the analysis». DroidBox не вно­сит изме­нения в сам эму­лятор, так что при­ложе­ние впол­не спо­соб­но опре­делить, что оно работа­ет под кол­паком. Спо­собов для это­го дос­таточ­но — начиная от баналь­ного ICCID и номера телефо­на до хит­ровывер­нутых инс­трук­ций ARM-ассем­бле­ра.

Оставить мнение