СОДЕРЖАНИЕ

Весной 2026 года специалисты направления Threat Intelligence экспертного центра безопасности (PT ESC) обнаружили необычную атаку на пользователей Саудовской Аравии с использованием неизвестного ранее APK-файл с именем Chrome.apk. Образец заинтересовал: за милой картинкой обновления Google Chrome и неожиданным требованием для работы «специальных возможностей» мы выявили тщательно защищенную от анализа цепочку запуска Android-шпиона.

Интерфейс при запуске вредоносного ПО
Интерфейс при запуске вредоносного ПО

В ходе анализа мы обнаружили, что исследуем ранее неизвестное ВПО и назвали его DragonDoll. Данный образец адаптируется для атак на жертв из различных стран, включая Россию, Китай, Корею и некоторые страны MENA. Мы разобрали его функциональность, особенности работы и сетевое взаимодействие. В ходе ретроспективного анализа нашли источник распространения и коллекцию вредоносного ПО.

Цепочка загрузки

При первом осмотре мы заметили интересную особенность: сам APK-файл защищен от непосредственной распаковки с помощью стандартных архиваторов техникой Tampered Headers — злоумышленники портят заголовки APK-архива (он же ZIP), создавая тем самым проблемы при анализе. В данном случае атакующие изменили поля Flags в заголовке, имея проставленный флаг Encrypted file. Как таковое шифрование не использовали, и при замене флагов анализ можно продолжать:

python3 -c "import re; f=open('file.apk', 'rb'); d=bytearray(f.read()); f.close(); [d.__setitem__(m.start()+6, 0) for m in re.finditer(b'\x50\x4b\x03\x04', d)]; [d.__setitem__(m.start()+8, 0) for m in re.finditer(b'\x50\x4b\x01\x02', d)]; open('fixed.apk', 'wb').write(d)"

Распаковав архив и открыв AmdroidManifest.xml, обнаруживаем там интересное разрешение: запрос на установку дополнительных пакетов android.permission.REQUEST_INSTALL_PACKAGES.

Список разрешений в манифесте Chrome.apk
Список разрешений в манифесте Chrome.apk

При вызове главного метода происходит загрузка некого K3iwv7VF.apk из ресурсов приложения с использованием PackageInstaller. При этом загружается страница-приманка horror.html с помощью методов WebView. Эта страница имитирует установку и обновление Google Chrome и выставляет содержимое в зависимости от состояния установки полезной нагрузки.

Проверка статуса загрузки и отрисовка контента
Проверка статуса загрузки и отрисовка контента

Кроме того, страница-приманка проверяет параметры navigator.userLanguage и navigator.language. В зависимости от языка интерфейса пользователя будет меняться содержимое документа-приманки. В данном установщике были заготовки текста для 34 различных языков, включая русский, украинский, корейский, японский, китайский, иврит, персидский и арабский.

Русский текст для наполнения страницы-приманки
Русский текст для наполнения страницы-приманки

Открыв образец K3iwv7VF.apk, мы находим большое количество требуемых разрешений в манифесте, но в главном методе видим только скромную загрузку нативной библиотеки crypto_4775h3.

Список разрешений в манифесте K3iwv7VF.apk
Список разрешений в манифесте K3iwv7VF.apk

Основные разрешения требуются на классы для пакета com.me4dymbu.ysbf4ghb, который отсутствует в этом APK-файле. Значит, все самое интересное происходит в библиотеке.

Библиотека является дроппером, расшифровывающим файл из ресурсов программы с помощью стандартного AES-256-GCM. Анализ библиотеки усложнен LLVM-обфускацией, включающей в себя MBA и CFF. Также дроппер делает проверки, усложняя анализ:

  • Проверяет, запущен ли образец под отладчиком (Frida или другим). При обнаружении признаков отладки файл не будет корректно расшифрован.

  • Проверяет наличие сетевого соединения: при его отсутствии файл так же не будет расшифрован.

  • Все важные строчки накрыты несколькими вариациями алгоритмов XOR c 8-байтовым ключом.

В случае успешного выполнения расшифровывается файл с названием config_[0-9a-z]{6,8}_[0-9a-z]{2,4}.json, который является очередной библиотекой.

Схема загрузки DragonDoll
Схема загрузки DragonDoll

Эта библиотека аналогична предыдущей, только в конце она загружает интересующий нас пакет com.me4dymbu.ysbf4ghb и передает управление на метод x1. Расшифрованный APK-файл является шпионом DragonDoll.

DragonDoll

DragonDoll — это развитое шпионское ПО, имеющее возможность удаленного управления мобильным устройством и сбора информации об устройстве в реальном времени. DragonDoll может контролировать ввод и нажатия пользователя, подменять overlay приложения, контролировать звонки, контакты и СМС-сообщения, а также воровать данные из мессенджеров. Кроме этого, он оповещает злоумышленников об изменении состояния устройства с помощью множества настроенных ресиверов.

Начнем анализ шпиона c класса x1, а именно с метода onCreate.

Запуск x1.onCreate
Запуск x1.onCreate

Шпион проверяет доступ к сети и запускает необходимые для работы сервисы и методы. Сам шпион имеет модульную структуру, состоящую из нескольких компонентов:

  • bgs, BackgroundService — отвечает за отправку собранных данных и подготовку сообщений для отправки их на C2-сервер, а так же собирает некоторую информацию об устройстве (подробнее — в главе Сетевое взаимодействие). Сами сообщения отправляются с помощью методов класса NetworkUtil. Компонент также регистрирует ресиверы для сбора информации в фоновом режиме.

    ❗ Интересно, что в некоторых случаях злоумышленники используют слова с ошибками: например, в методе onTrimMemory злоумышленники создают сообщение о состоянии памяти, при этом составленный JSON-файл имеет ошибку в константе message.

  • wbs, WebSocketService — отвечает за обработку входящих сообщений от командного сервера.

  • acs — отвечает за запрос необходимых для работы разрешений, прикидываясь обновлением Google Chrome. Интересно, что при запросе необходимых для работы расширений шпион подстраивается под жертву: он содержит просьбу обновить браузер на 27 языках.

  • mpsr, MediaProjectionService — сервис для создания скриншотов.

  • msrv, MainService — основной класс для управления и поддержки VNC-сервиса.

Данные сервисы не единственные, которые использует DragonDoll. В шпионе также реализованы:

  • ntfy (extends NotificationListenerService) — необходим для перехвата всех уведомлений на телефоне.

  • ajs (extends JobService) — сервис для обработки событий от JobScheduler.

  • jin (extends AppCompatActivity) — класс для выполнения команд, связанных с injection (подробнее — в главе Команды).

  • acss (extends AccessibilityService) — сервис для перехвата действий, чтения текста, экрана, кнопок и др.

Доступ к промежуточным значениям, требуемым для межсервисного доступа (например, ключ для шифрования или ID жертвы), осуществляется с помощью класса MyAppPreference. Для хранения данных используется MMKV — мобильная платформа для хранения данных типа «ключ — значение», используемая в приложении WeChat.

Для хранения результатов и журналирования событий используется класс DatabaseHelper, отвечающий за запросы, создание и заполнение базы данных SQLite с именем device_status.db. При инициализации DragonDoll создает ряд таблиц, в которых будет хранить результаты выполнения команд, системные сообщения и информацию об устройстве:

  • device_logs — содержит информацию о состоянии сервисов и полученные ресиверами сообщения, а так же сообщения о работе шпиона;

  • acsb_log — сообщения от AccessibilityService;

  • notification_logs — нотификации, полученные сервисом ntfy;

  • sms_logs — сообщения, полученные от ресиверов smsdr и smrcv;

  • current_status — содержит информацию о текущем состоянии устройства (подключен ли к сети, заряжен ли телефон и другое);

  • app_config — не используется.

Последним этапом инициализации является HTML-приманка с имитацией обновления Google Chrome. Сам шпион не обфусцирован, за исключением зашифрованных алгоритмом XOR строк и частично удаленной информации о названии классов и методов.

Конфигурация DragonDoll
Конфигурация DragonDoll

В классе BuildConfig находится конфигурация DragonDoll. Некоторые ее параметры не использовались в работе или не были назначены. В ней определена версия (в данном образце это 9.4), название приложения, под которое маскируется шпион, и адреса командных серверов. В данном случае c2 channelzones[.]co.

Сетевое взаимодействие

Для сетевого взаимодействия используется два примитива: класс wbs для создания обработчиков текущего соединения и класс NetworkUtils для первичной аутентификации и отправки результатов. Первый класс работает на основе Socket.IO, второй — на основе OkHttp3.

Общая схема сетевого взаимодействия DragonDoll
Общая схема сетевого взаимодействия DragonDoll

При отправке сообщений используется гибридное шифрование: все переданные сообщения шифруются AES-256-CBC, ключ случайно генерируется и передается серверу, накрытый RSA OAEP. NetworkUtils используется для отправки сообщения пользователю и соответствующей реакции на него в зависимости от переданного состояния (state). Начальное сетевое взаимодействие выглядит следующим образом:

  1. State REGISTER_DEVICE — при первичном подключении серверу отправляется сообщение из нулевого хедера — сигнал запроса от DragonDoll на получение UUID-клиента и публичного ключа.

  2. C2-сервер отправляет хедер с новым client_id в формате JSON, из которого и достают публичный ключ RSA.

  3. State REGISTER_DEVICE_2 — клиент отправляет сгенерированный AES-ключ, накрытый RSA.

  4. Передача ключей успешно завершена. Отправка информационного сообщения серверу.

Для каждых последующих сообщений сохраняется формат хедеров. Если данные накрыты AES, IV генерируется случайным образом и передаются в каждом сообщении.

HEADER:

 0      1          5           21   length    
 | type | data_size | client_id | data |

Формат данных:

  0   16           length 
  | IV | aes_encr_data | 

После успешного обмена ключами происходит отправка информационного сообщения с помощью метода сервиса bgs. Кроме стандартной информации для отправки (результатов срабатываний ресиверов и прочей накопившейся в базе данных информации) к стартовому сообщению добавляют большое количество информации об устройстве:

  • информацию об аккаунтах на устройстве;

  • список контактов и собственных номеров;

  • информацию о включенных разрешениях для приложения, а также есть ли на устройстве root и запущено ли приложение от device owner;

  • список установленных приложений на устройстве;

  • hardware-информацию: модель, серийный номер, IMEI, bootloader, информация о CPU.

NetworkUtil взаимодействует с bgs для отправки информационных сообщений и запроса необходимых для работы файлов. Для этого в NetworkUtils выделены следующие состояния:

  • GET_OVERLAY_APPS — запрос overlay файлов, необходимых для команды ENABLE_INJECT.

  • GET_OVERLAY_APP — получение overlay файлов для команды ENABLE_INJECT.

  • SEND_DATA — отправка сообщения контрольному серверу, включая информационное сообщение.

  • PING_TEST — просто heartbeat (не используется).

  • KEY_EXCHANGE — не назначены действия.

В то же время wbs-сервер организует обработку входящих соединений. Благодаря возможностям Socket IO устанавливается постоянное соединение, по которому данные могут передаваться в любое время. Все текущие сообщения обрабатываются шестью разными обработчиками — под каждый тип сообщений.

Первые три обработчика — стандартные: они просто отмечают факт подключения, отключения и наличия ошибок. А вот остальные обработчики наиболее интересны: они и образуют основной список выполняемых DragonDoll команд. Разберем подробнее.

Команды

Перечислим здесь обработчики сообщений и команды, которые они могут получить.

Команда на получение действия (Action)

Обработчик onActionMsg события fe78a618, или обработчик сообщений типа Action, получает JSON для выполнения одного из действий на устройстве. При этом по итогам их выполнения ничего не возвращается в ответ, и результат этих действий не записывается в базу данных.

Можно совершить одно из действий:

  • POWER — открыть меню выключения телефона;

  • VOLUME_UP — увеличить громкость;

  • VOLUME_DOWN — уменьшить громкость;

  • LOCK_SCREEN — включить или выключить экран, в зависимости от его состояния;

  • RECENT_APPS — отобразить недавние использованные приложения;

  • HOME — вернуться на домашнюю страницу;

  • BACK — вернуться назад;

  • NOTIFICATIONS — открыть нотификацию;

  • KEY_PRESS — нажать любой символ.

Команда на действия с экраном (ScreenView)

Следующим рассмотрим обработчик onSreenViewMsg события bdb22236, или сообщения типа ScreenView. Он также получает JSON для совершения одного из взаимодействий с экраном:

  • lastClickedNode — по переданным границам на экране находят элемент, на который можно кликнуть, и кликают по нему, используя метод performAction.

  • clickNode — похоже на предыдущее действие, только поиск элемента ведется по всем окнам, а не только по последнему открытому. Интересно, что в отличие от предыдущего метода, злоумышленники используют тут несколько уловок, чтобы наверняка выполнить клик. Если по переданным границам находится нужный элемент accessibilityNode, используют метод performAction для создания клика. Если обычное действие не дает результата, то метод сначала фокусируется на элементе.

    Фокусировка и клик по найденному элементу
    Фокусировка и клик по найденному элементу

А затем уже производит нажатие. Для клавиатуры и элементов, для которых не удалось получить accessibilityNode, производят сложный клик с использование класса GestureDescription.

Создание долгого нажатия по заданным координатам
Создание долгого нажатия по заданным координатам
  • textSender — в элемент, на котором находится сейчас фокус, вставляется переданный текст.

  • gensureScrol — сгенерировать движение скрола.

  • enableBlackScreen — сделать экран черным, нечувствительным к прикосновениям, и продолжить активную работу.

  • disableBlackScreen — отменить предыдущую команду.

  • buttonAction — с использованием метода performGlobalAction имитирует нажатие на одну из четырех кнопок HOME, BACK, NOTIFY (открыть уведомления) и RECENTS (экран недавно запущенных приложений).

Команда на сложное действие (Task)

Обработчик onTaskMsg события e019c6a0 получает сообщения типа Task. Это выполнение более сложных команд, сопровождающихся журналированием и отправкой результатов. Интересно, что только данные сообщения кодируются AES CBC (ключом, о котором мы рассказывали в разделе об установке сетевого соединения).

Обработка сообщения в методе onTaskMsg
Обработка сообщения в методе onTaskMsg
Cписок всех команд

ID

Name

1

APP_HIDE

2

APP_UNHIDE

3

HIDE_ICON

6

APP_UNINSTALL

7

SEND_NOTIFICATION

8

PING

9

LOCK_SCREEN

10

UNLOCK_SCREEN

11

OPEN_URL

12

KILL_SELF

13

APP_INSTALL

14

REFRESH_DELAY

15

LAUNCH_APP

16

FORCE_STOP_APP

17

CALL_PHONE

18

SEND_SMS

19

DELETE_ALL_SMS

20

DELETE_SMS

21

DELETE_ALL_CALLS

22

DELETE_CALL

23

ADD_NEW_CONTACT

24

DELETE_ALL_CONTACTS

25

DELETE_CONTACT

27

REFRESH_ALL_DATA

28

START_VNC

29

STOP_VNC

30

ENABLE_BLACK_OVERLAY

31

DISABLE_BLACK_OVERLAY

32

ENABLE_UPDATE_OVERLAY

33

DISABLE_UPDATE_OVERLAY

34

START_HVNC

35

STOP_HVNC

36

RELOAD_INJECTS

37

ENABLE_INJECT

38

PIN_SOLVER

39

REQUEST_PERMISSION

40

DISABLE_INJECT

41

HIDE_SMS

42

UNHIDE_SMS

43

PIN_SOLVER2

44

SEND_BULK_SMS

PIN_SOLVER и PIN_SOLVER2 — команды для ввода пароля: первая — для текстовых паролей, вторая эмулирует движение одним касанием по указанным точкам, предположительно для ввода картинки-пароля. Интересно, как происходит процесс ввода:

  • Для ввода пароля ищут подходящий accessibilityNode по viewID (например, com.android.systemui: id/password_entry, android: id/text1), проверяют, что поле ввода предназначено для текста, вводят туда пароль, а затем так же ищут enter.

    Рис. 16. Ввод пароля для найденного accessibilityNode
    Рис. 16. Ввод пароля для найденного accessibilityNode
  • Для пин-кода применяется похожая схема: ищут узлы (com.android.keyguard: id/key, com.android.systemui: id/key и другие) с необходимой цифрой для нажатия и производят клик.

ENABLE_INJECT, DISABLE_INJECT и RELOAD_INJECTS: команды для внедрения инъекции экрана, то есть замены overlay приложения. При получении задания на создание inject передается только имя пакета и совершаются следующие действия:

  • создают директорию <context.getFilesDir()>/ov1/ — создается файл <context.getFilesDir()>/ov1/<package_name>.so

  • в hashset overlay_htmls_files создают пару «пакет + путь до файла»

  • ставится флаг true для значения overlay_enabled_<package_name>

В классе acss, который будет описан ниже, метод onAccessibilityEvent обрабатывает события типа TYPE_WINDOW_CONTENT_CHANGED методом processContentChangedEvent и дальнейшим вызовом метода updateCurrentPackageAndOverlay. Он проверяет, находится ли пакет в overlay_htmls_files и стоит ли true в overlay_enabled_<package_name>. Если да, то создает Intent для класса jin.

В нем инициализируется экземпляр WebView с карт-бланшем на действия со страницей, в который загружаются данные из <context.getFilesDir()>/ov1/<package_name>.so. В качестве интерфейса для JavaScript используется класс inject_interface, состоящий из трех методов: returnResult, sendData, send_log_injects. Все методы делают одно и то же: составляют JSON-сообщения для злоумышленников с введенными пользователем данными и названием текущего пакета.

В ресурсах отсутствуют необходимые файлы для имитации overlay (они сохраняются при поступлении специальной команды от сервера GET_OVERLAY_APP), поэтому мы предполагаем, что с помощью этой команды осуществляется имитация банковских приложений и других регистрационных форм для сбора паролей.

START_VNC\STOP_VNC: команды для старта завершения сервера VNC. При запуске команды START_VNC DragonDoll получает параметры соединения: хост и порт (адрес подключения), пароль, флаг pointers (параметр для переключения состояния мыши между клиентами), флаг view_only (режим просмотра) и ключ доступа.

После происходит инициализация VNC-сервера. Его реализация основана на открытом проекте droidVNC-NG, предоставляющем удаленный доступ к устройству без root-доступа. Проект устроен как связка Java-компонентов и нативной библиотеки, загружаемой в MainService (msrv):

  • Native-библиотека загружается через System.loadLibrary и используется для управления сетевым соединением. В нее экспортируются функции vncStartServer, vncStopServer, vncConnectReverse, vncConnectRepeater, vncIsActive и другие.

  • Java-обвязка отвечает за все, что завязано на Android framework: жизненный цикл foreground service, уведомления, разрешения, MediaProjection, AccessibilityService, обработка Intents, сетевые изменения, автозапуск и взаимодействие с UI.

    Сопоставление констант главного метода VNC-сервиса
    Сопоставление констант главного метода VNC-сервиса
Java-обвязка в DragonDoll. Основные методы.
  • msrv, MainService — главный оркестратор он принимает команды, стартует VNC-сервер (используя экспортируемые из библиотеки функции), настраивает захват экрана, регистрирует сервис в локальной сети и отслеживает подключенных клиентов.

  • mpsr, MediaProjectionService — сервис для захвата экрана. Использует API MediaProjection для создания виртуального экрана, полностью повторяет код проекта.

  • mpra, MPRequestActivity — именно этот класс отслеживает появление обращения на создание соединения с параметрами от командного сервера и установку передачи файлов с media projection сервера.

  • srv, InputService — перехватывает ввод пользователя: клики, нажатия, свайпы, клавиатурный ввод.

Интересно, что при создании канала нотификаций используется название пакета Chrᴏme, но вместо символа «o» латиницей здесь используется спецсимвол U+1D0F.

START_HVNC\STOP_HVNC — команды для включения и выключения HVNC-сервера, основанного только на использовании Accessibility. При получении команды START_HVNC сервером собирается полная иерархия nodes по всем активным окнам. Для каждого окна сервер как бы делает слепок интерфейса, посылая дерево JSON-сообщений с информацией о текущем узле.

Составление JSON-сообщения о характеристиках текущего интерфейса
Составление JSON-сообщения о характеристиках текущего интерфейса

После этого ожидается получение от сервера сообщений типа ScreenView, которые имитируют удаленное управление устройством. До тех пор пока HVNC-сервер не выключат, DragonDoll будет отсылать информацию командному серверу при каждом событии TYPE_WINDOW_CONTENT_CHANGED и при специфических событиях пакетов.

Специальные возможности

В пакете acsb есть только один класс acss, расширяющий системный сервис AccessibilityService. Этот сервис давно используется различным ВПО в связи с его огромными возможностями. Как описывалось ранее, класс acss используется для выполнения большинства команд от сервера.

Кроме этого, в классе переопределяют метод onKeyEvent, который перехватывает ввод пользователя. Также переопределен метод onAccessibilityEvent, благодаря чему DragonDoll получает информацию о многих событиях: кликах, фокусировке и вводе текста в возможные поля для ввода паролей и перенаправляет их в соответствующие обработчики.

Но на этом действия вредоноса не ограничиваются. Используя перехваченные AccessibilityNodeInfo, шпион собирает информацию о мессенджерах. Он нацелен на три мессенджера, дополнительно для всех остальных применяет общую схему сбора информации.

Signal

DragonDoll ворует данные о чатах, группах и статусах пользователя. Также собирается список контактов и в случае открытия чата — последние сообщения, а также информация о том, когда и с каким контактом ведется беседа. Для этого вредоносное ПО использует следующую схему. При помощи метода findAccessibilityNodeInfosByViewId находит интересующие его элементы интерфейса мессенджера по интересным ему ViewId, содержащие данные о чатах и пользователях. Например, используя ViewId org.thoughtcrime.securesms: id/conversation_list_item_name похищаются сообщения чата, включающие отправителя, текст сообщения и дату отправки.

Telegram

Кроме того, что шпион собирает все видимые читаемые элементы интерфейса, используя метод извлечения сообщений (подробнее см. главу Остальные мессенджеры), злоумышленник интересным образом собирает нотификации. Из всех элементов он ищет тот, который занимает верхнее положение экрана.

Поиск элемента в верхней части экрана
Поиск элемента в верхней части экрана

Затем проверяет количество элементов в родительском подклассе. Оно должно быть больше четырех. Если посмотреть в открытых источниках описание структур интерфейса приложения, можно найти как раз два XML-файла, описывающих элемент с пятью дочерними объектами, — это разметка большой и маленькой нотификации. Уже после шпион вытаскивает текст нотификации и сохраняет его.

Поиск по всем дочерним элементам
Поиск по всем дочерним элементам

Пройдясь по всем дочерним элементам, он смотрит все возможные связанные элементы нотификаций и так же сохраняет их текст.

WhatsApp*

Шпион действует по аналогии с Signal: используя известный ViewId приложения, собирает информацию о чатах, контактах и содержании сообщений.

*Принадлежит компании Мeta, запрещенной в Российской Федерации.

Используемые view_id для сбора данных из WhatsApp
Используемые view_id для сбора данных из WhatsApp
Остальные мессенджеры

Для Viber и всех пакетов с подстрокой messenger используется простой метод extractGenericMessagingContent, в котором из всех поступающих элементов просто вытаскивается текст, рекурсивно обходя все подэлементы.

Стандартное извлечения текста для других мессенджеров
Стандартное извлечения текста для других мессенджеров

Receivers

В классе bgs регистрируется множество классов ресиверов. Они собирают информацию об интересных событиях на устройстве, сохраняя их в базе данных. Сами классы имеют говорящие названия — коротко опишем их работу и собираемую информацию:

  • air — записывает время включения авиарежима;

  • btr — собирает информацию о состоянии батареи;

  • btrcv — сохраняет события, связанные с перезагрузкой устройства;

  • btrs — записывает время включения режима энергосбережения;

  • dlr — описывает время блокировки телефона;

  • rig — при изменении режима звонка записывает текущее состояние (беззвучный или обычный режим);

  • ir — собирает информацию о подключении к сети и о типе соединения;

  • pr — собирает информацию об установке, удалении и обновлении приложений на устройстве;

  • scrv — записывает события включения или выключения экрана;

  • ssrcv — передает текущее состояние сим-карты;

  • uus — записывает время и информацию о подключение устройства по USB к другим устройствам (например, к ПК);

  • wrcv — передает параметры подключения к сети Wi-Fi (включая IP, MAC-адрес, скорость подключения).

Кроме того, в bgs инициализируется SecurityReceiver. Этот класс не является ресивером как таковым: вместо этого он регистрирует экземпляр класса ContentObserver, который реагирует на все глобальные изменения Settings.Global.CONTENT_URI. Проверяются потенциально интересные изменения: development_settings, adb, selinuxStatus и другие.

Также класс проверяет возможные root-права по наличию специфических файлов в системе:

secure_file = {"/system/app/Superuser.apk", "/system/xbin/su", "/system/bin/su", "/sbin/su", "/system/su", "/system/bin/.ext/.su"};

Кроме данных пассивных BroadcastReceiver есть специальные классы, отличающиеся по использованию:

  • almr — внутренний менеджер событий, необходимый для работы AlarmManager.

  • dar — расширяет класс DeviceAdminReciver, отслеживает события повышения привилегий. Применяется для проверки доступных прав через системный сервис DevicePolicyManager. Также записывает события, связанные с вводом пароля, установкой имени пользователя, сменой пароля, входом и выходом из режима блокировки.

  • smrcv — реагирует на действия android.provider.Telephony.SMS_RECEIVED. Собирает данные по отправителю, тексту сообщения и времени получения.

  • smsdr — реагирует на действия android.provider.Telephony.SMS_DELIVER. Собирает данные по отправителю, тексту сообщения и времени получения.

Распространение

В исследуемом образце мы обратили внимание на специфические классы APK-дроппера:

  • InstallDropSession;

  • PermissionPollService;

  • PkgAddedReceiver;

  • PkgPollService.

Проведя поиск дополнительных файловых индикаторов компрометации, мы обнаружили ряд пакетов с аналогичным названием исходных файлов и схожими названиями классов. Большая часть была загружена из России, а также было несколько загрузок из Испании и Саудовской Аравии. Исходной точкой загрузки одного из файлов послужила ссылка, указывающая на GitHub-репозиторий nowayintheland.

Активность в GitHub-проекте злоумышленика
Активность в GitHub-проекте злоумышленика

Злоумышленники зарегистрировали аккаунт kesmanta24 на почту kesmantes52@outlook.com, с которой и обновляли бэкдор с 6 марта по 6 мая 2026 года, согласно истории коммитов. В течение двух месяцев с этого аккаунта было загружено около 150 уникальных образцов ВПО.

Однако все семплы мало чем отличались друг от друга. Обнаруженные пакеты загружали итоговую полезную нагрузку по аналогичной схеме, а согласно конфигурации бэкдора в проект загружалось две версии DragonDoll: 9.3 и 9.4. Проведя анализ, мы не обнаружили больших изменений в функциональности бэкдора. Основным отличием являлось дополнительное введение планировщика задач JobScheduler для большинства методов и ресиверов, что делало DragonDoll более устойчивым к перезагрузкам. Также в обновленном бэкдоре появились новые команды. Конфигурация шпиона тоже не подверглась сильным изменениям: во всех семплах адрес C2-сервера был channelzones[.]co.

ID

Name

Description

40

ENABLE_OVERLAY_MAINTENANCE

Аналогично команде inject, но указанный overlay будет включен поверх всех приложений

41

DISABLE_OVERLAY_MAINTENANCE

Отключить предыдущую команду

47

START_SOCKS_TUNNEL

Инициализировать socks5-туннель с указанными параметрами host, port, device_id, token. Сами функции, необходимые для туннеля, импортируются из native-библиотеки

48

STOP_SOCKS_TUNNEL

Остановить работу тунеля

49

SELF_UNINSTALL

Удаление собственного пакета приложения

50

OPEN_INJECT

Открыть уже записанный файл overlay

Ссылка на данный GitHub-проект указала нам на фишинговый сайт datewithmealways[.]site, с которого и производилось распространение DragonDoll.

Фишинговая страница
Фишинговая страница

Эта страница сообщала пользователю о необходимости срочного обновления Google Chrome. При согласии на обновление браузера и клике на соответствующий элемент пользователю будет загружен шпион DragonDoll.

Ссылка на загрузку DragonDoll
Ссылка на загрузку DragonDoll

Кроме этого, по объединяющим сетевым признакам были обнаружены следующие адреса распространения DragonDoll:

datewithmealways[.]online
digitaladstracking[.]com

Как и сам APK-файл, сайт адаптирован ко множеству языков. На данный момент остается неясным источник распространения ссылок на фишинговые сайты. Также любопытным остается тот факт, что в качестве C2-сервера злоумышленники используют российский хостинг.

Экспертный центр безопасности, Positive Technologies (PT ESC)

(Про индикаторы компрометации, вердикты продуктов Positive Technologies для данного ВПО и хакерские техники из матрицы MITRE ATT&CK, используемые шпионом, читайте в полной версии исследования).