Содержание статьи
Введение
Как ты, скорее всего, знаешь, существует два метода анализа приложений: статический и динамический. Первый включает в себя дизассемблирование, декомпиляцию, исследование манифеста приложения. Второй предполагает запуск приложения в специальном окружении, позволяющем произвести анализ его поведения в так сказать реальных условиях. На практике, как правило, применяются оба метода, притом одновременно. Но так как статический метод анализа мы уже рассматривали (статья «Анатомия с препарацией», № 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.
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) кажется редким. Действия же пользователя на эту диаграмму не влияют.
Хакер #191. Анализ безопасности паркоматов
Структура файла трассировки 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. Запускаем его и изображаем обычного пользователя, ожидая загрузки чего‑то — вероятно, «репозитория». «Загрузка», понятное дело, до конца не проходит — видимо, с расчетом на то, что его опять запустят. После нескольких попыток (мы ведь обычные пользователи, правда?) останавливаем трассировку и смотрим, что у нас вышло.
График по времени показывает, что в первые мгновения была отправлена SMS, затем была запись в файл, затем несколько сетевых операций, затем снова много записей в файл.
Диаграмма распределения показывает, что да, большую часть операций занимает запись в файл, затем идут сетевые операции, а уже потом — довольно толстый (если сравнивать с операцией загрузки классов, DEXLOAD) столбик отправки SMS.
Что ж, посмотрим трейс. На сей раз список файлов, к которым приложение имело доступ, достаточно мал, поэтому листать долго не придется. Смотрим, что никаких вызовов крипто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-ассемблера.