Описание
Вредоносная программа для ОС Android, сочетающая в себе функции рекламного трояна и кликера. Впервые была обнаружена в каталоге Google Play, где распространялась под видом безобидных приложений. Представляет собой бота, который выполняет команды злоумышленников. Android.Circle.1 написан на языке программирования Kotlin и создан с использованием механизма Multiple APKs, позволяющего разработчикам размещать в Google Play несколько модификаций одного приложения для поддержки работы с различными устройствами.
Принцип действия
Android.Circle.1 встроен в различные приложения, такие как сборники изображений, программы с гороскопами, системные утилиты, фоторедакторы, игры и т. п. После установки они выполняют заявленные функции. При их запуске троян соединяется с управляющим сервером, передает на него сведения об инфицированном устройстве и ждет дальнейших команд.
Некоторые модификации бота после установки выдают себя за системное приложение, чтобы пользователю было сложнее обнаружить и удалить трояна. В списке установленных программ в системном меню они сопровождаются стандартным значком Android-приложения и представлены как программа с именем com.google.security.
Структура трояна
Android.Circle.1 создан с использованием механизма Multiple APKs. Он позволяет размещать в Google Play многочисленные модификации одного приложения, которые поддерживают работу на определенных моделях устройств и процессорных архитектурах. Кроме того, в трояне реализован механизм разделения основного apk на несколько отдельных apk-файлов (split APKs), которые содержат различные компоненты программы. После установки на устройство такие apk воспринимаются операционной системой как единое приложение.
Часть вредоносных функций Android.Circle.1 вынесена в нативную библиотеку libnative-lib.so, которая располагается в одном из таких вспомогательных apk.
Прием и выполнение команд
Связь с сервером осуществляется через защищенный HTTPS-канал, при этом все передаваемые данные дополнительно шифруются алгоритмом AES.
Троян отправляет на сервер следующую информацию о зараженном устройстве:
- packages – список установленных приложений;
- device_vendor – производитель устройства;
- isRooted – наличие root-доступа;
- install_referrer – информация о ссылке, по которой было установлено приложение;
- version_name – константа со значением «1.0»;
- app_version – константа со значением «31»;
- google_id – идентификатор пользователя в сервисах Google;
- device_model – модель устройства;
- device_name – имя устройства;
- push_token – идентификатор Firebase;
- udid – уникальный идентификатор;
- os_version – версия операционной системы;
- sim_provider – оператор мобильной связи.
После этого троян ожидает заданий, которые поступают в виде сообщений сервиса Firebase Cloud Messaging. В них содержатся команды, представляющие собой скрипты библиотеки BeanShell.
Среди выполняемых ботом действий могут быть следующие:
- удаление значка троянского приложения из списка ПО в меню главного экрана;
- удаление значка троянского приложения и загрузка в веб-браузере заданной в команде ссылки;
- нажатия (клики) на интерактивные элементы на загружаемых сайтах;
- демонстрация рекламных баннеров;
- другие действия, для выполнения которых у трояна есть необходимые системные разрешения.
После получения заданий Android.Circle.1 сохраняет их в конфигурационный файл prefs.xml, как показано на следующем примере:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="parent_class_name">com.app.bestwallblack.ui.HostActivity</string>
<string
name="push_data">H4sIAAAAAAAA/zTSx46jSgBA0X+pLX4N2Jhg6S2IxgFMY4JhMwKKpoAigwmt/vfRjDR3f3fnG4xrm4
ITgClOx/SSNDXYgRyC03/0Dgx9Ak5AZ4aL+C/dsx2fUAxxFTgaqlaguXY8FTpCWMXD/anbtXYp7lQTqNe0ZCPYkjWjEcWtE
xhlJcONj3MudhZ0ribzLFN000t8b/ede+zIdMgczyEUX5pkwjAfgffGd3/GVem45sHL36xX2a037TPYkF25qjzXcAtB3d9jaMo
UpF9PLtE9Z0I48t+t8LUVaavINjTwKkI/lFhOLeNEs3yesa5mV/DFEqpzqBmaybb0cXGlbdibKtJKjLljPZPsLdPgWhlaNJS8eEt
Utl+uebgZaH+1x5LdhAtzCO3l3LMDU3lhbFzNl8w6QaNsZ5JaPwnMDbjzgpDjPh3Cpy/UYeDZzH/iubveFEmEvJmnm6Sox2
Aj5gLVNeEQpLSar6rWMwuKt20v00jxgnw9pg8qKm/dw9LKubRjWjfCEJVvzfeWsRIEJnzpg2k8nosB+4xF6zS5qHsw/Tn76
kNubF7zygn6l4DdoKhZ77Bl5GFg+RjahIXs/aqpBeVZFiVNmxjFliuLovg/2AEUDQicANgB2FRRXoMTQOPYnkgyyfsEpx+wb
3LYfvQTCXYgSsa8qX/9UfR3icYInL5/fn4HAAD//xcoBbVtAgAA</string>
<boolean name="ready_to_work" value="true" />
<string name="uuid">95aefbfa-000b-45db-aa0c-e781310074d8</string>
<string name="base_url">https://circle.*****droid.ru/</string>
<string name="library_version">31</string>
</map>
где push_data – полученное через Firebase сообщение, которое упаковано в zip-архив и зашифровано Base64.
После расшифровки этого сообщения рассматриваемый пример задания имеет следующий промежуточный вид:
{"type":"deleteIcon","id":-1,"src":"H4sIAAAAAAAAAHVRTW+DMAy971dEPYFURbujHhhlElsLSHRnFIjL0oYEJek6adp/n4
F+jKq94Dy/Zz8bi7bTxhGmuNGC01orB8rRrqU5q/esgTVT+DWBuC+MNOYVvlLWwlmkTUN3Viv6VmRpVu2gdo/qkyE87o
7x+0LvtZNC0d1XS7cHVTuhlaWvp9fzjepDCRdMlyAdWZB67EkbcFPW84PJNqj8jxZEwZFMFN6p15xUBzs2NEhFkll75nw/6
KgFdymMFask8AKcE6rxJiZzMh2JRtk6z9I43ZRxGr6s4mVZbMJNXC6TYoDzG/0yQ+l7slqVYZ77QT+W1I03s86gWSlwqJK
DBAd8NiezBDE5Yz+wjhnn+T+/ByNXmnHgPdAKz2C1hDVYiy5eO0akKqOPFkwkRb1HMZZhkvFWVxtm994ZXHsNMOSxM
drg6hyuuUhqO4rGgfrZ7toXwy79Hf9lUYjn6V3zg/3s68bdR+PhR2yFEj0VPP0BuzAabPUCAAA=","hash":"","domain":"http
://circle.***idp.ru/","action_id":"","data":{}}
где src – строка с BeanShell-скриптом, который также упакован в zip-архив и закодирован Base64. После его расшифровки исходный скрипт с командой имеет следующий вид:
import android.content.pm.PackageManager;
import android.content.ComponentName;
import org.json.JSONObject;
import android.content.Intent;
import android.content.Context;
import kotlin.jvm.functions.Function0;
import kotlin.Unit;
PackageManager p = context.getPackageManager();
ComponentName componentName = new ComponentName(context, bus.getParentClass(context));
p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
bus.log("string_icon_deleted", "Icon deleted");
start() {}
urlLoaded() {}
onConsoleMessage(message) {}
browserClicked(url) {}
admobTask() {}
admobLoaded() {}
admobAdError(code) {}
admobAdClosed() {}
deleteIcon() {}
onConsoleMessage(String consoleMessage) {}
newTaskPush() {}
bus.loaded();
bus.finish();
Данный скрипт выполняет удаление значка трояна из списка приложений на главном экране операционной системы.
После выполнения задания троян уведомляет об этом сервер, передавая отчет вида:
{"version_name":"1.0","app_version":"31","device_vendor":"Philips","event":"SWNvbiBkZWxldGVk\n","event_name":
"string_icon_deleted","device_model":"Philips S337","device_name":"Philips
S337","event_type":0,"os_version":"22","udid":"0c6a2d40-48a6-315c-d52c-a8b382d71e9e","type":"string"}