SHA1-хеши:
- 3b9338986f0f7fc50d77a783f4245bc1625343f0 (com.yippo.ai version 1.3.5 «Creation Magic World»)
- c8466dd1f57bb38a984b3adb7a7e6a7c9f20fba3 (com.yippo.ai version 1.3.6 «Creation Magic World»)
Описание
Некто от лица разработчика SHENZHEN RUIREN NETWORK CO., LTD выпустил несколько приложений. По геймплею все они являются клонами популярных мобильных игр:
- Creation Magic World — песочница, напоминающая майнкрафт. Легко узнаваемый кубический мир со схожими механиками;
- Cute Pet House — игра по принципу тамагочи, где требуется ухаживать за мультяшным питомцем;
- Amazing Unicorn Party — тоже тамагочиподобная игра с единорогами;
- Академия мечты Сакура — симулятор жизни школьников в аниме-стиле;
- Theft Auto Mafia — имитация серии GTA, симулятор жизни криминальных элементов;
- Open World Gangsters — как и пример выше, песочница с преступниками всех мастей.
В первоначальных версиях вредоносного ПО не было. 28/29 сентября в игры встраивают Android.Phantom.2.origin. 15/16 октября после обновлений появляется Android.Phantom.5. Пример типичного инжекта для приложений на примере Creation Magic World:
Android.Phantom.2.origin активизируется при запуске приложения, в тот момент, когда владелец устройства кликает по иконке. Сначала Android.Phantom.2.origin создает задачу java.util.TimerTask для выполнения регулярных запросов к управляющему серверу hxxps[:]//playstations[.]click. Эта задача выполняется параллельно с приложением, в остальное время она неактивна.
Передача данных между троянцем и сервером дополнительно защищена при помощи шифрования AES в режиме ECB. Ключ к шифру в формате base64 выглядит так: ZDgyNjEhKDk1RjBjYzExZUVAODE5XzUyNDA4QmEyNWI=.
Затем Android.Phantom.2.origin проверяет возможность использовать WebRTC. В троян встроена возможность действовать использовать два сценария: signaling и phantom. Данная проверка покажет, как троян будет действовать дальше. Программа проверяет ряд характеристик смартфона на соответствие требованиям:
- минимум 4х ядерный процессор;
- версия ОС Android 13 или новее;
- доступен класс org.webrtc.PeerConnectionFactory:
-
выполняется одно из следующих условий:
- класс org.webrtc.EglBase, доступен метод create;
- класс org.webrtc.EglBase$-CC, доступен метод create;
- класс org.webrtc.EglBase$CC, доступен метод create.
Указанные выше классы не являются частью стандартного набора инструментов и библиотек, входящих в Android SDK. В играх из магазина приложений GetApps этих классов нет. Поэтому трояну необходимо загрузить недостающую для работы с WebRTC библиотеку другим путем. Например, через троянца Android.Phantom.5, который также встроен в исследуемое приложение.
Если устройство отвечает этим требования, то Android.Phantom.2.origin отправляет POST-запрос на адрес hxxps[:]//dllpgd[.]click/api/signaling/check-plugin-start. Параметры запроса на сервер:
JSON объект, параметр atom:
| Параметр | Тип | Описание |
|---|---|---|
| deviceId | String | ID устройства |
| deviceInfo | DeviceInfo | Информация об устройстве |
| version | long | Версия |
| appPackageName | String | Имя пакета приложения |
| appVersion | String | Версия приложения |
| gaId | String | Google Analytics ID |
| sessionId | String | ID сессии |
| appChannel | String | Канал приложения |
| pluginInfos | Array | Список информации о плагинах |
| isGeneratedBySubProcess | Boolean | Флаг генерации подпроцессом |
DeviceInfo:
| Параметр | Тип | Описание |
|---|---|---|
| timezone | String | Часовой пояс устройства |
| locale | String | Локаль устройства |
| phoneTimestamp | long | Метка времени телефона |
| phoneModel | String | Модель телефона |
| androidVersion | String | Версия Android |
Ответ сервера определяет сценарий дальнейшего заражения:
- SDK signaling будет применен, если троян получит ответ с параметром run: true в JSON объекте.
- SDK phantom используется, если устройство технически не соответствует варианту signaling, или от сервера не получен положительный ответ.
Оба SDK имеют общий принцип действия. Они загружают заданные злоумышленниками сайты в WebView вместе с JavaScript кодом для симуляции действий пользователя. Также троян добавляет JavaScriptInterface «apicmob». Он дает следующие возможности коду, выполняемому в WebView:
- screenshot()— скриншот сайта в base64, использует виртуальный экран;
- scroll(px, py, p2x, p2y, duration) — скролл с заданной скоростью;
- setConfig(s, s1) — сохранить JSON строку s в памяти;
- getConfig()— получить сохраненный JSON;
- getGAID()— получить рекламный ID;
- isSignaling()— используется ли signaling sdk;
- setTime(t) — сохранить timestamp;
- touch(x, y) — симуляция кликов по экрану;
- updateSignalStatus(s) — статус выполнения задачи;
- upload_event(s) — загрузить информацию о событии на сервер;
- upload_log(s) — отправить лог на сервер.
Signaling way
Задачи для этого сценария действий Android.Phantom.2.origin получает по адресу hxxps[:]//playstations[.]click/h5/get_job_by_offer. Signaling SDK подключается к серверу сигнализации WebRTC по протоколу WebSockets wss[:]//dllpgd[.]click/signaling_ws. Для установления соединения между узлами WebRTC использует данные ICE сервера:
- turn:101.36.120[.]3:3478 user:wumitech pass:wumitech.com@123
- turn:106.75.153[.]105:3478 user:wumitech pass:wumitech.com@123
Затем Android.Phantom.2.origin транслирует злоумышленникам видео с виртуального экрана, на котором размещает WebView с загруженным сайтом. Вместе с целевым сайтом в WebView загружается JavaScript с адреса hxxps[:]//playstations[.]click/h5/js_file_for_signaling. Для удаленного управления загруженным в WebView контентом, по DataChannel WebRTC приходят команды в формате JSON:
- «click» — кликнуть,
- «close» — отключить трансляцию,
- «drag» — перетащить из точки 1 в 2,
- «dragEnd» — перетащить из точки 1,
- «dragStart» — перетащить в точку 2,
- «goBack» — перейти назад в WebView,
- «keyInput» — ввод с клавиатуры,
- «paste» — вставить текст в поле для ввода с помощью JS.
Если при выполнении какой-либо из этих команд происходит ошибка, троян отправляет отчет об ошибке в DataChannel WebRTC. Это позволяет отслеживать ошибки и реагировать на возникновение проблем.
В результате, человек или автоматизированная система удаленно и скрытно, при помощи видеосвязи, использует встроенный в приложение браузер.
Phantom way
Если смартфон не отвечает условиям проверки, или в приложении нет необходимой библиотеки для связи по стандарту WebRTC, или сервер не дал команду работать в режиме signaling, то Android.Phantom.2.origin использует по умолчанию режим работы phantom SDK. Задачи троянец получает с сервера hxxps[:]//playstations[.]click/phantom/task. Троян загружает модель для фреймворка TensorFlowJS по ссылкам:
- hxxps[:]//app-download[.]cn-wlcb[.]ufileos[.]com/dllpgd_plugin/ai_model/js_v3/model[.]json,
- hxxps[:]//app-download[.]cn-wlcb[.]ufileos[.]com/dllpgd_plugin/ai_model/js_v3/group1-shard1of2[.]bin,
- hxxps[:]//app-download[.]cn-wlcb[.]ufileos[.]com/dllpgd_plugin/ai_model/js_v3/group1-shard2of2[.]bin,
в директорию jv3 в файлах приложения.
Троянец содержит специальный WebViewClient, который дает возможность JavaScript коду загружать файлы из директории jv3 приложения. Пример ссылки для загрузки модели, которая может быть использована в JavaScript коде: /apicmob_tf_model/model.json.
Затем Android.Phantom.2.origin обращается по адресу hxxps[:]//playstations[.]click/phantom/file. Отсюда скачивается файл JavaScript, который содержит все необходимые функции для работы модели и взаимодействия с веб-страницей: фреймворк TensorFlowJS, логику загрузки файлов модели, логику выполнения кликов и других действий на сайте. SHA-1 дешифрованного файла: sha1:654b3dd6f39cfd1bd7bcd34dc41bfa6e4b55a696. Этот файл JavaScript загружается одновременно с другим контентом целевого сайта, что позволяет JS выполнять действия на страницах. Интерфейс apicmob позволяет делать скриншоты, которые скрипт анализирует через TensorFlowJS в сценариях, когда необходимо найти кнопку закрытия всплывающей рекламы Vignette Ad. Например, троян запускает этот анализ когда не может обнаружить объект для клика другими методами.
Фрагмент кода с вызовом функции, использующей TensorFlowJS
Пример перехваченной задачи для phantom way:
task Expand source
{ad_page_bounce_rate: 0.211,
anchor_close_ctr: 0.0897,
content_type: "game",
cookie_confirm_xpaths: ["//div[text()='Privacy Information']/following-sibling::div/*",
"//button[contains(translate(text,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'accept all cookies')]",
"//*[contains(translate(@aria-label,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'cookie')]//*[contains(translate(@aria-label,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'close')]",
"//div[contains(@class,'ecomsend__Modal__CloseButton')]",
"//div[@class='fc-consent-root']//button[contains(@class, 'fc-button') and (contains(@class, 'fc-cta-do-not-consent') or contains(@class, 'fc-cta-consent'))]",
"//*[@id='userAgree']",
"//*[contains(@class,'cookie-notification-bar__accept') or contains(@id,'banner-accept')]",
"//div[contains(@class,'needsclick')]//button[@aria-label='Close dialog']",
"//*[contains(@aria-labelledby,'cookie')]//*[contains(text(),'Agree')]",
"//*[@data-cookie-set='accept']",
"//button[contains(translate(text(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'allow all cookies')]",
"//*[contains(@class,'cookie') or contains(@class,'consent') or contains(@id,'cookie') or contains(@id,'consent')]//*[contains(@class,'accept') or contains(@id,'accept')]",
"//*[contains(@*,'acceptCookies')]",
"//div[@id='questions-interstitial']//span[@data-bs-dismiss='modal']",
"//*[contains(text(),'cookie')]/..//*[text()='OK']",
"//*[text()='We Value Your Privacy']/..//*[text()='Accept']",
"//*[contains(@class, 'cookie-confirm')]//*[contains(@id, 'confirm')] | //*[@aria-label='Aceptar']",
"//*[@id='onetrust-accept-btn-handler']",
"//div[@aria-label='privacy banner']//button[@aria-label='Accept All']",
"//div[@id='CookieDialog']//span[text()='Got it']",
"//*[contains(@id,'Cookie')]//*[text()='Allow all']",
"//*[contains(@id,'cookies')]//*[contains(@class,'accept')]",
"//*[contains(text(),'cookie')]/..//*[@id='truste-consent-button']",
"//button[@id='accept-cookies']",
"//div[@id='hcpModal']//a[text()='YES']",
"//*[@class='cky-consent-bar']//*[translate(@aria-label,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='close']",
"//button[@data-cookiedays]",
"//div[@class='bx-wrap']//button[@data-click='close']",
"//button[contains(text(),'Accept') or contains(text(),'Aceptar')]",
"//div[contains(@id,'newsletter-popup')]//div[@class='modal__centered']//button[contains(@class,'modal__close')]",
"//*[@id='onetrust-close-btn-container']",
"//div[@id='entryModal']//*[text()='OK']/..",
"//*[contains(@class,'tm-cookie-banner')]//*[contains(@class,'js-accept')]",
"//*[translate(@*,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='close cookie policy']"
],
fast_bounce: false,
offer: {job_id: "XXXXXXXXXX",
offer_id: "apico[.]top",
site_url: hxxps://www[.]apico[.]top
},
pages: [{ads: [{ctr: 0.035,
format: "interstitial",
name: "top_inter"
}
],
pattern: "^hxxps://(www.)?apico[.]top.*#google_vignette"
},
{ads: [{ctr: 0.035,
name: "top_top"
},
{ctr: 0.024,
format: "lazy_banner",
name: "top_sidebar"
},
{ctr: 0.02,
format: "lazy_banner",
name: "top_bottom"
},
{ctr: 0.034,
format: "anchor_banner",
name: "top_anchor"
}
],
pattern: "^hxxps://(www.)?apico[.]top/(game|category)",
xpath: "//a[contains(@href, '/category/')] | //div[contains(@class, 'item-grid')]//a"
},
{ads: [{ctr: 0.035,
name: "top_top"
},
{ctr: 0.024,
format: "lazy_banner",
name: "top_sidebar"
},
{ctr: 0.02,
format: "lazy_banner",
name: "top_bottom"
},
{ctr: 0.034,
format: "anchor_banner",
name: "top_anchor"
}
],
pattern: "^hxxps://(www.)?apico[.]top",
xpath: "//a[contains(@href, '/game/')]"
}
],
pv: 2,
random_swipe: true,
random_swipe_level: "high",
region: "RU",
type: "web_adx"
}
Цель этой задачи – увеличить количество целевых кликов на рекламные объявления на сайте hxxps[:]//www[.]apico[.]top. Из другой задачи мы узнали аналогичный сайт hxxps[:]//qaz[.]baouy[.]top. На них размещены различные браузерные игры со множеством рекламных объявлений.
Также обнаружили что троян Android.Phantom.2.origin распространяется через:
-
сайты с модами spotify:
- hxxps[:]//spotipro[.]top/
- hxxps[:]//spotipro[.]top/
- hxxps[:]//spotiplus[.]xyz/
-
сайты с модами:
- hxxps[:]//apkmody[.]mobi
- hxxps[:]//moddroid[.]com
-
telegram-каналы:
- hxxps[:]//t[.]me/spoti_pro/
- hxxps[:]//t[.]me/moddroid_co_OF
- hxxps[:]//t[.]me/spotify_premium_channel
- hxxps[:]//t[.]me/apkmodyOF
-
discord-сервера:
- hxxps[:]//discord[.]com/invite/aybQHENK4B
- hxxps[:]//discord[.]gg/TXxc5cqQ6a
- hxxps[:]//discord[.]gg/6Um7CV8nPg
Матрица MITRE
| Этап | Техника |
|---|---|
| Первоначальный доступ | Управление версиями приложений (T1661) |
| Выполнение | Интерпретаторы командной строки и сценариев (T1623) |
| Предотвращение обнаружения |
Управление версиями приложений (T1661) Загрузка нового кода во время выполнения (T1407) Инъекция ввода (T1516) Обфускация файлов или информации (T1406) Обход виртуализации или песочницы (T1633) Системные проверки (T1633.001) |
| Обнаружение |
Получение информации о системе (T1426) Получение конфигурации сети системы (T1422) |
| Сбор данных | Захват экрана (T1513) |
| Организация управления |
Протокол прикладного уровня (T1437) Зашифрованный канал (T1521) Симметричное шифрование (T1521.001) Передача инструментов из внешней сети (T1544) ПО для удаленного доступа (T1663) |
| Деструктивное воздействие |
Генерация трафика с устройства жертвы (T1643) Инъекция ввода(T1516) |