В апреле 2025 года мы рассказывали про новую на тот момент версию бэкдора Triada, заразившую прошивки поддельных Android-устройств, которые распространялись через популярные маркетплейсы. Зловред располагался в системных разделах прошивок и проникал в Zygote — родительский процесс для всех приложений в системе — что приводило к заражению любого приложения на устройстве. Благодаря этому троянец мог, например, похищать учетные данные от мессенджеров и социальных сетей.
Находка побудила нас провести исследование и поискать другие угрозы, содержащиеся в прошивках Android-устройств. Так мы обнаружили новый бэкдор — Keenadu — который, как и Triada, встраивался в прошивки и заражал каждое приложение, запущенное на устройстве. Бэкдор оказался весьма распространенным — после его обнаружения наши пользователи стали массово обращаться в службу поддержки за дополнительной информацией об этой угрозе. Цель данного отчета — ответить на большинство вопросов и рассказать о новой угрозе.
Наши выводы в двух словах.
- Мы обнаружили новый бэкдор, который назвали Keenadu, в прошивках устройств нескольких брендов. Он попадал туда на этапе сборки — вредоносная статическая библиотека линковалась с
libandroid_runtime.so. Уже на устройстве она, как и Triada, заражала процессZygote. В некоторых случаях вредоносная прошивка загружалась с OTA-обновлением. - Копия бэкдора попадает в адресное пространство каждого приложения при его запуске на устройстве. Зловред представляет собой многоуровневый загрузчик, который предоставляет операторам неограниченные возможности для контроля устройства жертвы.
- Нам удалось получить полезные нагрузки, которые скачивает Keenadu. В зависимости от зараженного приложения, они подменяют поисковые запросы в браузере, монетизируют установки новых программ, а также скрытно взаимодействуют с рекламными элементами.
- Одна из полезных нагрузок, полученная в ходе исследования, также обнаружилась в множестве приложений, которые распространялись как через неофициальные источники, так и через Google Play и Xiaomi GetApps.
- В прошивках некоторых устройств Keenadu был встроен в важные системные приложения: сервис для распознавания лиц, приложение для рабочего стола и т. д.
- В ходе исследования нам удалось установить связь крупнейших Android-ботнетов: Triada, BADBOX, Vo1d и Keenadu.
Полная цепочка заражения выглядит следующим образом.
Решения «Лаборатории Касперского» детектируют описанные ниже угрозы со следующими вердиктами:
HEUR:Backdoor.AndroidOS.Keenadu.*
HEUR:Trojan-Downloader.AndroidOS.Keenadu.*
HEUR:Trojan-Clicker.AndroidOS.Keenadu.*
HEUR:Trojan-Spy.AndroidOS.Keenadu.*
HEUR:Trojan.AndroidOS.Keenadu.*
HEUR:Trojan-Dropper.AndroidOS.Gegu.*
Вредоносный дроппер в libandroid_runtime.so
В самом начале исследования наше внимание привлекли подозрительные библиотеки, расположенные по путям /system/lib/libandroid_runtime.so и /system/lib64/libandroid_runtime.so (в дальнейшем для краткости будем использовать представление /system/lib[64]/ для обозначения этих двух директорий). Такая библиотека есть в оригинальном Android. В частности, в ней определен нативный метод println_native для класса android.util.Log. Приложения используют его для записи в журнал логов logcat. В подозрительных библиотеках реализация этого метода отличалась от легитимной вызовом одной функции.
Подозрительная функция расшифровывала данные из тела библиотеки c использованием RC4 и записывала их по пути /data/dalvik-cache/arm[64]/system@framework@vndx_10x.jar@classes.jar. Эти данные представляют собой полезную нагрузку, которая подгружается с помощью DexClassLoader. Точкой входа в ней является метод main класса com.ak.test.Main, где ak, вероятно, отсылает к авторскому названию зловреда: это буквосочетание используется и в других местах в коде. В частности, разработчики оставили много кода, который пишет сообщения об ошибках в ходе работы зловреда в журнал logcat. Для этих сообщений используется тег AK_CPP.
Полезная нагрузка проверяет, не запущена ли она в системных приложениях из числа сервисов Google, а также в системных приложениях операторов Sprint и T-Mobile. Последние, как правило, встречаются в специальных версиях устройств, которые операторы продают по заниженной цене с условием, что покупатель заключит с ними договор на предоставление услуг связи. Если зловред запущен в таких процессах, то он завершает свою работу. Также в нем реализован механизм завершения работы, если в системных директориях присутствуют файлы с определенными именами.
Далее троянец проверяет, запущен ли он в процессе system_server. Этот процесс управляет всей системой и имеет максимальные привилегии. Его запускает процесс Zygote в начале своей работы. Если результат проверки положительный, троянец создает экземпляр класса AKServer, если же код работает в любом другом процессе — создается экземпляр класса AKClient. У созданного объекта вызывается метод, которому передается имя процесса приложения. Названия классов намекают на то, что в основе троянца лежит клиент-серверная архитектура.
Процесс system_server создает и запускает различные системные сервисы с помощью класса SystemServiceManager. В основе этих сервисов лежит архитектура «клиент-сервер», а клиенты для них запрашиваются в коде приложений с помощью вызова метода Context.getSystemService. Общение с серверной частью осуществляется с помощью примитива межпроцессной коммуникации в Android — binder. У такого подхода есть множество преимуществ, в том числе с точки зрения безопасности. К ним относится, например, возможность ограничивать некоторым приложениям доступ к различным системным сервисам и их функциональности, а также наличие абстракций, позволяющих упростить использование этого доступа для разработчиков и одновременно защитить систему от возможных уязвимостей в приложениях.
Авторы Keenadu спроектировали его похожим образом. Основная логика расположена в классе AKServer, который работает в процессе system_server. AKServer фактически представляет собой вредоносный системный сервис, а AKClient — интерфейс для обращения к AKServer с помощью binder. Для удобства мы приводим схему устройства бэкдора ниже.
Тут стоит отметить, что Keenadu в очередной раз компрометирует ключевые принципы безопасности Android. Во-первых, поскольку он встроен в libandroid_runtime.so, он работает в контексте каждого приложения на устройстве, получая таким образом доступ ко всем их данным и делая бессмысленной изоляцию приложений друг от друга, которая предусмотрена системой. Во-вторых, он предоставляет интерфейсы для обхода разрешений (о них мы расскажем ниже), при помощи которых регулируются права приложений в системе. Таким образом, Keenadu представляет собой полноценный бэкдор, позволяющий атакующим получить практически неограниченный контроль над устройством жертвы.
Как устроен AKClient
AKClient устроен достаточно просто. Он встраивается во все запускаемые на устройстве приложения и получает экземпляр интерфейса для общения с сервером с помощью защищенного широковещательного сообщения (protected broadcast) com.action.SystemOptimizeService. Этот интерфейс через механизм binder посылает вредоносному AKServer запрос с именем attach, передавая в нем IPC-обертку над функциональностью для загрузки произвольных DEX-файлов в контексте зараженного приложения. Это позволяет AKServer реализовать логику для запуска вредоносных полезных нагрузок в зависимости от приложения.
Как устроен AKServer
AKServer в начале своей работы рассылает два защищенных широковещательных сообщения (protected broadcast): com.action.SystemOptimizeService и com.action.SystemProtectService. Первое сообщение, как мы уже описывали, передает другим процессам, зараженным AKClient, экземпляр интерфейса для взаимодействия с AKServer. Вместе с сообщением com.action.SystemProtectService также передается экземпляр другого интерфейса для взаимодействия с AKServer. С помощью этого интерфейса вредоносные модули, скачиваемые в контекстах других приложений, могут:
- выдавать любые разрешения произвольному приложению на устройстве;
- отзывать любые разрешения у произвольного приложения на устройстве;
- получать геолокацию устройства;
- получать информацию об устройстве.
После того как взаимодействие серверной и клиентской части настроено, AKServer запускает основную вредоносную задачу под названием MainWorker. MainWorker при первом запуске сохраняет текущее время. После этого зловред проверяет язык устройства и его часовой пояс. Если язык интерфейса является одним из диалектов китайского, а само устройство расположено в одном из китайских часовых поясов, то он прекращает работу. Также он не отработает, если на устройстве отсутствует магазин приложений или сервисы Google Play. Если же оно прошло проверки, троянец запустит задачу PluginTask. PluginTask в начале своей работы расшифровывает адреса командных серверов из кода следующим образом.
- Строка с зашифрованным адресом декодируется с помощью Base64.
- Полученные данные — сжатый с помощью gzip буфер — распаковываются.
- Распакованные данные расшифровываются с помощью AES-128 в режиме CFB. Ключ для расшифрования — MD5 от строки
ota.host.ba60d29da7fd4794b5c5f732916f7d5c, IV — строка0102030405060708.
Расшифровав адреса командных серверов, троянец собирает данные об устройстве жертвы: модель, IMEI, MAC-адрес, версию ОС и т. д. и шифрует их таким же образом, как и адреса серверов, только в качестве AES-ключа используется MD5 от строки ota.api.bbf6e0a947a5f41d7f5226affcfd858c. Зашифрованные данные отправляются на командный сервер POST-запросом по пути /ak/api/pts/v4. В параметры запроса передается два значения:
- m — MD5 от IMEI устройства;
- n — тип подключения к сети (w — Wi-Fi, m — мобильный интернет).
Ответ от командного сервера содержит поле code, в котором может находиться код ошибки, возвращаемый сервером. Если значение этого поля равно нулю, то ошибки нет. В этом случае в ответе будет поле data — зашифрованный аналогично данным из запроса JSON с информацией о полезных нагрузках.
Как Keenadu попал в libandroid_runtime.so
После анализа первых стадий заражения мы решили выяснить, как именно бэкдор попадал в прошивки Android-устройств. Мы практически сразу обнаружили в открытых источниках в Сети жалобы от пользователей планшетов производителя Alldocube на подозрительные DNS-запросы от устройств. Этот вендор ранее уже признавал наличие вредоносного ПО в одной из моделей планшетов. В опубликованном компанией заявлении, однако, не содержалось никаких подробностей о том, какой именно зловред попал на устройства и каким образом это случилось. Мы постараемся ответить на эти вопросы.
DNS-запросы, описанные автором жалобы, нам тоже показались странными. По нашим данным, полученные на тот момент C2-домены Keenadu разрешались в IP-адреса, приведенные ниже.
- 67.198.232[.]4
- 67.198.232[.]187
В эти же адреса разрешались домены keepgo123[.]com и gsonx[.]com, что может свидетельствовать о том, что планшет автора жалобы тоже заражен Keenadu. Однако одного совпадения IP-адресов недостаточно для того, чтобы уверенно это утверждать. Чтобы проверить гипотезу, необходимо изучить само устройство. Мы рассматривали опцию приобрести такую же модель планшета, однако это не понадобилось: как выяснилось, Alldocube публикует архивы с прошивками для своих устройств в открытом доступе, так что любой желающий может проверить их на наличие вредоносного ПО.
Чтобы проанализировать прошивку, сначала нужно изучить, в каком формате хранится содержимое. Прошивки для устройств Alldocube представляют из себя RAR-архивы, которые содержат различные образы и другие файлы, а также утилиту для прошивки в формате исполняемого файла для Windows. Наибольшую ценность с точки зрения анализа представляет файловая система Android. Основные ее разделы, включая системный, находятся в одном из образов под названием super.img. Это файл Android Sparse Image. Для краткости изложения опустим описание этого формата (его можно, к примеру, восстановить из кода libsparse); отметим лишь, что существуют утилиты с открытым исходным кодом для извлечения разделов из таких файлов в виде образа файловой системы.
Мы извлекли libandroid_runtime.so из прошивки для Alldocube iPlay 50 mini Pro (T811M) от 18 августа 2023 года. Изучив библиотеку, мы обнаружили в ней бэкдор Keenadu. Более того, мы расшифровали полезную нагрузку и извлекли оттуда адреса командных серверов, которые располагались на доменах keepgo123[.]com и gsonx[.]com, что подтверждает подозрения пользователя — его устройства заражены этим же бэкдором. Более того, все последующие версии прошивок для данной модели тоже оказались зараженными, включая те, которые вышли уже после публикации заявления вендора.
Отдельное внимание следует уделить прошивкам для модели Alldocube iPlay 50 mini Pro NFE. Аббревиатура NFE (Netflix Enabled) в ее названии означает, что такие устройства имеют дополнительный DRM-модуль, позволяющий пользоваться стриминговыми сервисами в высоком качестве. Для этого они должны соответствовать стандарту Widevine L1 по системе защиты премиальных медиа Google Widevine DRM. Соответственно, они обрабатывают медиа в TEE (Trusted Execution Environment), что уменьшает риск доступа к фильму или сериалу со стороны недоверенного кода и, как следствие, не позволяет несанкционированно копировать медиа. Хотя сертификация по Widevine не защитила эти устройства от заражения, в отличие от других моделей, самая первая прошивка Alldocube iPlay 50 mini Pro NFE, выпущенная 7 ноября 2023 года, была чистой. При этом все остальные, включая самую свежую версию от 20 мая 2024 года, содержали Keenadu.
В ходе анализа прошивок для устройств Alldocube мы обнаружили, что они все имеют валидную подпись. Это значит, что для внедрения бэкдора в libandroid_runtime.so злоумышленнику недостаточно было взломать сервер с OTA-обновлениями. Помимо этого нужно было каким-то образом завладеть ключами для их подписи, которые в норме не должны быть доступны с OTA-сервера. Вероятнее всего, троянец попал в прошивку на этапе сборки.
Также нам удалось обнаружить статическую библиотеку libVndxUtils.a (ca98ae7ab25ce144927a46b7fee6bd21), содержащую код Keenadu, что дополнительно подтверждает нашу гипотезу. Эта вредоносная библиотека написана на языке C++ и собрана с помощью системы сборки CMake. Интересно, что в библиотеке также остались пути до файлов с исходным кодом на машине разработчика.
- D:\work\git\zh\os\ak-client\ak-client\loader\src\main\cpp\__log_native_load.cpp — в этом файле расположен код дроппера.
- D:\work\git\zh\os\ak-client\ak-client\loader\src\main\cpp\__log_native_data.cpp — в этом файле находится зашифрованная с помощью RC4 полезная нагрузка, а также ее размер.
Точкой входа дроппера является функция __log_check_tag_count. Злоумышленник вставил вызов этой функции в реализацию метода println_native.
По нашим данным, вредоносная зависимость располагалась в репозитории с исходным кодом прошивки по следующим путям.
- vendor/mediatek/proprietary/external/libutils/arm/libVndxUtils.a
- vendor/mediatek/proprietary/external/libutils/arm64/libVndxUtils.a
Интересно, что троянец в libandroid_runtime.so расшифровывает и записывает на диск полезную нагрузку по пути /data/dalvik-cache/arm[64]/system@framework@vndx_10x.jar@classes.jar. Вероятнее всего, злоумышленник таким образом пытался замаскировать вредоносную зависимость libandroid_runtime.so под якобы легитимный компонент vndx с проприетарным кодом от вендора MediaTek. В действительности же такого компонента в продуктах MediaTek не существует.
Наконец, по данным нашей телеметрии, троянец встречается не только в устройствах Alldocube, но и в устройствах других производителей. Во всех случаях бэкдор встроен в прошивки для планшетов. Мы предупредили вендоров о заражении.
Исходя из всего вышесказанного, мы считаем, что Keenadu попал в прошивки Android-устройств в результате атаки на цепочку поставок — один из этапов цепочки поставок прошивок оказался скомпрометирован, из-за чего в их исходные коды попала вредоносная зависимость. Таким образом, вендоры могли не подозревать, что их устройства заражены еще до поступления в продажу.
Модули бэкдора Keenadu
Как мы уже отметили, Keenadu в силу своей архитектуры позволяет атакующим получить практически неограниченный контроль над устройством жертвы. Чтобы понять, как именно они воспользовались этой особенностью бэкдора, мы решили проанализировать скачиваемые им полезные нагрузки. Для этого мы создали запрос якобы от лица зараженного устройства для командного сервера. На наш первый запрос С2-сервер не отправил никаких файлов. Вместо этого он вернул время для следующего запроса — через 2,5 месяца после первого. В ходе анализа командного сервера методом «черного ящика» нам удалось установить, что в запросе содержится время активации бэкдора и, если с его момента не прошло 2,5 месяца, то C2 не возвращает полезные нагрузки. Вероятно, это сделано с целью затруднить анализ и уменьшить вероятность обнаружения этих нагрузок. После того как мы изменили в запросе время активации на достаточно давнее, командный сервер вернул нам список полезных нагрузок для анализа.
Сервер злоумышленников присылает информацию о полезных нагрузках в виде массива объектов. Каждый из таких объектов содержит ссылку на скачивание полезной нагрузки, а также ее MD5, имена пакетов целевых приложений, имена целевых процессов и др. Пример такого объекта приведен ниже. В качестве сервиса для построения CDN злоумышленники выбрали Alibaba Cloud.
Скачиваемые Keenadu файлы имеют свой формат, в котором хранится зашифрованная полезная нагрузка и ее конфигурация. Описание формата файла на псевдокоде представлено ниже (struct KeenaduPayload).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
struct KeenaduChunk { uint32_t size; uint8_t data[size]; } __packed; struct KeenaduPayload { int32_t version; uint8_t padding[0x100]; uint8_t salt[0x20]; KeenaduChunk config; KeenaduChunk payload; KeenaduChunk signature; } __packed; |
После скачивания Keenadu проверяет целостность файла с помощью MD5. Также авторы троянца реализовали механизм подписи кода при помощи алгоритма DSA, которая проверяется перед расшифрованием и запуском полезной нагрузки. Это означает, что только злоумышленник, владеющий приватным ключом, может создавать вредоносные полезные нагрузки. В случае успешной проверки подписи конфигурация и вредоносный модуль расшифровываются с помощью AES-128 в режиме CFB. Ключом для расшифрования является MD5-хэш, посчитанный от конкатенации строки 37d9a33df833c0d6f11f1b8079aaa2dc и «соли» (salt), вектором инициализации — строка 0102030405060708.
Конфигурация содержит информацию о точках входа и выхода модуля, его название и версию. Пример конфигурации одного из модулей приведен ниже.
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "stopMethod": "stop", "startMethod": "start", "pluginId": "com.ak.p.wp", "service": "1", "cn": "com.ak.p.d.MainApi", "m_uninit": "stop", "version": "3117", "clazzName": "com.ak.p.d.MainApi", "m_init": "start" } |
Теперь, когда мы описали алгоритм загрузки бэкдором вредоносных модулей, перейдем к их анализу.
Загрузчик Keenadu
Этот модуль (MD5: 4c4ca7a2a25dbe15a4a39c11cfef2fb2) нацелен на популярные онлайн-магазины со следующими именами пакетов.
- com.amazon.mShop.android.shopping (Amazon)
- com.zzkko (SHEIN)
- com.einnovation.temu (Temu)
Его точкой входа является метод start класса com.ak.p.d.MainApi. Этот класс запускает вредоносную задачу под названием HsTask. Она представляет собой загрузчик, концептуально похожий на AKServer. В начале своей работы загрузчик собирает данные о зараженном устройстве (модель устройства, IMEI, MAC-адрес, версия ОС и т. д.), а также информацию о приложении, в котором он работает. Полученные данные кодируются таким же образом, как и запросы от AKServer по пути /ak/api/pts/v4. После кодирования загрузчик отправляет данные POST-запросом на C2-сервер по пути /ota/api/tasks/v3.
В ответ сервер злоумышленников возвращает список модулей для скачивания и выполнения, а также список APK-файлов для установки на устройство жертвы. Интересно, что в новых версиях Android доставка этих APK реализована через установочные сессии. Вероятно, зловред таким образом пытается обойти ограничения, введенные в последних версиях ОС: приложения из сторонних источников не могут в них получить доступ к опасным разрешениям, в частности к «специальным возможностям».
К сожалению, в ходе исследования нам не удалось получить примеры модулей и APK-файлов, которые скачивает этот загрузчик. Однако пользователи в Сети жаловались, что зараженные планшеты добавляли товары в корзины маркетплейсов без ведома пользователя.
Загрузчик кликеров
Такие модули (пример: ad60f46e724d88af6bcacb8c269ac3c1) встраиваются в следующие приложения.
- Системный менеджер обоев (com.android.wallpaper)
- YouTube (com.google.android.youtube)
- Facebook (com.facebook.katana)
- Цифровое благополучие (com.google.android.apps.wellbeing)
- Системное приложение для рабочего стола (com.android.launcher3)
В начале работы вредоносный модуль получает данные о местоположении и IP-адрес устройства с помощью сервиса GeoIP, развернутого на командном сервере злоумышленников. Полученные данные, а также тип подключения к Сети и версия ОС отправляются на командный сервер. Тот в ответ возвращает файл специального формата, в котором содержится зашифрованный JSON с информацией о полезных нагрузках, а также ключ для расшифрования JSON с помощью XOR. Структура такого файла описана ниже с использованием псевдокода.
|
1 2 3 4 5 6 |
struct Payload { uint8_t magic[10]; // == "encrypttag" uint8_t keyLen; uint8_t xorKey[keyLen]; uint8_t payload[]; } __packed; |
Полученный после расшифрования JSON представляет собой массив объектов, содержащих ссылки на скачивание полезных нагрузок, а также информацию о точках входа. Пример такого объекта приведен ниже. Полезные нагрузки зашифрованы по такому же принципу, что и JSON с информацией о них.
При исследовании мы получили несколько полезных нагрузок, основная цель которых — взаимодействие с рекламными элементами на сайтах различной тематики (сайты с играми, сайты с рецептами, новостные сайты). Конкретный модуль взаимодействует с одним конкретным сайтом, адрес которого зашит в его коде.
Модуль для браузера Chrome
Модуль (MD5: 912bc4f756f18049b241934f62bfb06c) нацелен на браузер Google Chrome (com.android.chrome). В самом начале своей работы он регистрирует обработчик событий жизненного цикла активностей приложения (Activity Lifecycle Callbacks). При запуске каждой активности в целевом приложении этот обработчик проверяет ее имя. Если оно совпадает с ChromeTabbedActivity, троянец ищет поле для ввода текста (поисковых запросов и адресов веб-сайтов) под названием url_bar.
Если такой элемент найден, зловред отслеживает изменения текста в нем. Все поисковые запросы, вводимые пользователем в url_bar, отправляются на сервер злоумышленников. Помимо этого, после окончания ввода запроса троянец также может подменять поисковик пользователя в зависимости от конфигурации, полученной с сервера злоумышленника.
Надо сказать, что подмена поисковика может не сработать, если пользователь выберет формулировку запроса из подсказок, потому что в этом случае не происходит нажатия клавиши Enter/кнопки поиска в поле url_bar, которое должно сигнализировать зловреду о запуске поиска. Однако злоумышленники оказались готовы и к этому. Троянец пытается найти в текущей активности элемент omnibox_suggestions_dropdown, который представляет из себя группу графических элементов (ViewGroup) — подсказок поисковика. Троянец отслеживает нажатия на подсказки и подменяет поисковик.
Кликер Nova (Phantom)
Модуль в самом начале (MD5: f0184f6955479d631ea4b1ea0f38a35d) представлял из себя кликер, который встраивался в системный менеджер обоев (com.android.wallpaper). Параллельно с нами его обнаружили исследователи из Dr.Web, которые, однако, не упомянули в своем отчете вектор распространения кликера через бэкдор Keenadu. Модуль использует технологии машинного обучения и WebRTC для взаимодействия с рекламными элементами. Коллеги из Dr.Web назвали его Phantom, однако в ответе от командного сервера он называется Nova. Более того, запускаемая в коде задача также называется NovaTask. Исходя из этого, мы считаем, что оригинальное название кликера — Nova.
Отметим также, что спустя некоторое время после публикации отчета про этот кликер командный сервер Keenadu начал удалять его с зараженных устройств. Вероятнее всего, злоумышленники таким образом стараются избежать обнаружения.
При этом в запросе на выгрузку модуль Nova имел несколько другое название. Мы считаем, что под новым названием скрывается последняя версия модуля, которая представляет собой загрузчик и может скачивать следующие модули.
- Кликер Nova.
- Шпионский модуль, который загружает различную информацию об устройстве жертвы на сервер злоумышленников.
- Дроппер Gegu SDK. Этот модуль, по нашим данным, представляет собой многоуровневый дроппер, который запускает два других кликера.
Монетизация установок
Модуль с MD5-хэшем 3dae1f297098fa9d9d4ee0335f0aeed3 встраивается в системное приложение для рабочего стола (com.android.launcher3). В начале своей работы он проверяет окружение на артефакты виртуальной машины. Если они не найдены, зловред регистрирует обработчик событий сессионной установки приложений.
Параллельно с этим модуль запрашивает конфигурацию с командного сервера. Пример такой конфигурации приведен ниже.
Когда на устройстве запускается установка приложения, троянец отправляет информацию об этом приложении на командный сервер. В ответ командный сервер предоставляет информацию о рекламном объявлении, которое его продвигает.
Для каждой успешно завершенной установочной сессии троянец выполняет GET-запросы по ссылке из поля tracking_link в ответе, а также по первой ссылке из массива click. Ссылки из массива click, судя по коду, представляют из себя шаблоны, в которые подставляются различные рекламные идентификаторы. Скорее всего, таким образом злоумышленники пытаются монетизировать установки приложений. Для этого троянец имитирует трафик с устройства жертвы, убеждая рекламные платформы, что приложение было установлено после перехода из рекламы.
Модуль для Google Play
Хотя AKClient прекращает выполнение, если обнаруживает себя в процессе Google Play, нам удалось получить с C2-сервера полезную нагрузку для этого процесса. Этот модуль (MD5: 529632abf8246dfe555153de6ae2a9df) получает рекламный идентификатор Google Ads и сохраняет его с помощью глобального экземпляра класса Settings по ключу S_GA_ID3. В дальнейшем другие модули могут использовать его как идентификатор жертвы.
Другие векторы распространения Keenadu
В ходе исследования мы решили поискать другие источники заражения Keenadu. В результате мы обнаружили, что некоторые модули, описанные выше, фигурировали в атаках, не связанных с заражением libandroid_runtime.so. Расскажем о них подробнее.
Системные приложения
По данным нашей телеметрии, загрузчик Keenadu встречался в различных системных приложениях в прошивках некоторых устройств. Одним из таких приложений (MD5: d840a70f2610b78493c41b1a344b6893) оказалась служба для распознавания лиц с именем пакета com.aiworks.faceidservice. В ней содержится набор обученных моделей машинного обучения, позволяющий распознавать лица, чтобы, в частности, авторизоваться с их помощью. Для этого приложение определяет сервис com.aiworks.lock.face.service.FaceLockService, который используется системным интерфейсом (com.android.systemui) для разблокировки устройства с помощью распознавания лица.
В методе onCreate сервиса com.aiworks.lock.face.service.FaceLockService, который будет вызван при создании сервиса, регистрируются три ресивера, которые отслеживают события включения и выключения экрана, старта зарядки, а также появления доступа к Сети. Каждый из ресиверов вызывает метод startMars, основная цель которого — инициализировать вредоносный загрузчик с помощью вызова метода init класса com.hs.client.TEUtils.
Загрузчик является немного измененной версией загрузчика Keenadu. Эта версия использует нативную библиотеку libhshelper.so для загрузки модулей, а также для установки APK. Для этих целей библиотека определяет соответствующие нативные методы класса com.hs.helper.NativeMain.
Такой вектор атаки — встраивание загрузчика в системные приложения — сам по себе не является новинкой. До этого мы уже описывали подобные случаи, например загрузчик Dwphon, который встраивался в системные приложения для OTA-обновлений. Однако мы впервые сталкиваемся с троянцем в сервисе для распознавания лиц.
Помимо сервиса распознавания лиц мы обнаружили и другие системные приложения, зараженные загрузчиком Keenadu. Среди них — приложение для рабочего стола (launcher) на некоторых устройствах (MD5: 382764921919868d810a5cf0391ea193). В такие приложения был встроен вредоносный сервис com.pri.appcenter.service.RemoteService, инициирующий запуск троянца.
Также мы обнаружили загрузчик Keenadu в приложении с именем пакета com.tct.contentcenter (d07eb2db2621c425bda0f046b736e372). В него встроен рекламный SDK fwtec, который получал конфигурацию при помощи запроса HTTP GET по адресу hxxps://trends.search-hub[.]cn/vuGs8 c отключенным перенаправлением по умолчанию. В ответ троянец ждал код 302 (перенаправление) с URL в заголовке Location, в параметрах которого и содержалась конфигурация SDK. Один из параметров — hsby_search_switch — регулировал запуск загрузчика Keenadu: если его значение было равно 1, загрузчик запускался в приложении.
Загрузка другими бэкдорами
При анализе нашей телеметрии мы обнаружили необычную версию загрузчика Keenadu (MD5: f53c6ee141df2083e0200a514ba19e32) в директориях различных приложений во внешнем хранилище, расположенных по пути вида /storage/emulated/0/Android/data/%PACKAGE%/files/.dx/. Судя по коду, загрузчик был рассчитан на работу в системе со скомпрометированным процессом system_server. При этом названия binder-интерфейсов в нем отличались от интерфейсов AKServer. Загрузчик использовал следующие интерфейсы.
- com.androidextlib.sloth.api.IPServiceM
- com.androidextlib.sloth.api.IPermissionsM
Такие же binder-интерфейсы определяет другой бэкдор, устроенный похожим образом и также обнаруженный в libandroid_runtime.so. Запуск этого бэкдора на зараженных устройствах происходит следующим образом: libandroid_runtime.so импортирует вредоносную функцию __android_log_check_loggable из библиотеки liblog.so (MD5: 3d185f30b00270e7e30fc4e29a68237f). Эта функция вызывается в реализации нативного метода println_native класса android.util.Log. Она расшифровывает с помощью однобайтового XOR полезную нагрузку, зашитую в теле библиотеки, и запускает ее в контексте всех приложений на устройстве.
Полезная нагрузка имеет много сходств с бэкдором BADBOX — комплексной вредоносной платформой, которую впервые описали исследователи из HUMAN Security. В частности, совпадают пути на С2-серверах, на которые троянец отправляет HTTP-запросы. Поэтому мы считаем, что это одна из версий BADBOX.
В этом бэкдоре мы обнаружили и binder-интерфейсы, которые использовал упомянутый выше загрузчик Keenadu. Это указывает на то, что соответствующие экземпляры Keenadu устанавливал именно BADBOX.
Модификации популярных приложений
К сожалению, если в вашей прошивке не обнаружен Keenadu или другой предустановленный бэкдор, это не значит, что троянец вам не угрожает. Так, кликер Nova (Phantom) параллельно с нами обнаружили исследователи из Dr.Web. В их отчете описан другой вектор распространения, а именно — через модификации популярных программ, доставляемых преимущественно через неофициальные источники, а также различные приложения в магазине GetApps.
Google Play
Зараженные приложения проникли и в Google Play. В ходе исследования мы обнаружили троянизированное ПО для умных камер, опубликованное в официальном магазине Android-приложений. Суммарное число скачиваний превышало 300 тысяч.
В каждое из этих приложений был встроен сервис com.arcsoft.closeli.service.KucopdInitService, который запускал все тот же кликер Nova. Мы предупредили Google о наличии зараженных приложений в магазине, и разработчики удалили их. Интересно, что вредоносный сервис присутствовал во всех приложениях, но мог запускаться только в одном из них — с именем пакета com.taismart.global.
Фантастическая четверка: как связаны Triada, BADBOX, Vo1d и Keenadu
Обнаружив, что BADBOX скачивает один из модулей Keenadu, мы решили провести дополнительное исследование и выяснить, нет ли еще каких-нибудь признаков связи этих троянцев. В результате мы обнаружили, что BADBOX и Keenadu имеют сходства в коде полезной нагрузки, которую расшифровывает и запускает вредоносный код в libandroid_runtime.so. Также мы обнаружили сходства загрузчика Keenadu и модуля BB2DOOR троянца BADBOX. Учитывая, что в коде есть и явные различия, а также тот факт, что BADBOX скачивал загрузчик Keenadu, мы полагаем, что это все же разные ботнеты, а разработчики Keenadu, скорее всего, вдохновлялись кодом BADBOX. Более того, авторы Keenadu нацелены преимущественно на Android-планшеты.
В нашем последнем отчете про бэкдор Triada мы упомянули, что командный сервер одного из скачиваемых им модулей располагался на том же домене, что и один из командных серверов ботнета Vo1d, что может свидетельствовать о связи этих двух троянцев. Однако в ходе текущего исследования нам удалось обнаружить связь Triada и с ботнетом BADBOX. Как оказалось, в директориях, куда BADBOX скачивал загрузчик Keenadu, также располагались другие полезные нагрузки для различных приложений. Их описание заслуживает отдельного отчета, и для краткости изложения мы не будем вдаваться в детали в текущей статье, ограничившись анализом полезной нагрузки для клиентов Telegram и Instagram* (MD5: 8900f5737e92a69712481d7a809fcfaa). Точкой входа этой полезной нагрузки является класс com.extlib.apps.InsTGEnter. Она предназначена для кражи учетных данных от аккаунтов жертв в зараженных сервисах. Интересно, что в ней также есть код для кражи учетных данных из клиента WhatsApp, который, однако, никак не используется.
Адреса командных серверов, на которые троянец загружает данные с устройства, хранятся в коде в зашифрованном виде. Они декодируются с помощью base64 и расшифровываются с помощью XOR со строкой xiwljfowkgs.
Мы расшифровали командные серверы зловреда и обнаружили уже известный нам домен zcnewy[.]com. Этот домен мы встречали в 2022 году во вредоносных модификациях WhatsApp, содержащих Triada. Тогда мы полагали, что участок кода, предназначенный для похищения учетных данных из клиента WhatsApp, и вредоносный дроппер относятся к Triada. Учитывая, что выше мы показали, что домен zcnewy[.]com связан с BADBOX, мы считаем, что в 2022 году зараженные модификации WhatsApp, описанные нами, содержали два разных троянца — Triada и BADBOX. Чтобы подтвердить эту гипотезу, мы повторно изучили одну из этих модификаций (caa640824b0e216fab86402b14447953) и выяснили, что в нее был встроен код дроппера Triada и модуля BADBOX, похожего по функциональности на описанный выше. Троянцы, хоть и запускались из одной точки входа, между собой никак не взаимодействовали и были устроены совершенно по-разному. Исходя из этого, мы считаем, что в 2022 году мы наблюдали совместную атаку BADBOX и Triada.
Таким образом, можно сделать вывод, что несколько крупнейших Android-ботнетов взаимодействуют друг с другом. На данный момент нам удалось подтвердить связь Triada с Vo1d и BADBOX, а также Keenadu с BADBOX. Исследователи из HUMAN Security также отмечали пересечения между Vo1d и BADBOX. При этом описанные отношения не являются транзитивными. Например, из связи Triada и Keenadu с BADBOX вовсе не следует, что Triada и Keenadu связаны между собой; последнее утверждение требует отдельного доказательства. Однако мы не удивимся, если в скором времени появятся отчеты, которые позволят доказать транзитивность этих связей.
Жертвы
По данным нашей телеметрии, с Keenadu или его модулями столкнулись 13 715 пользователей по всему миру. Наибольшее число пользователей, атакованных зловредом, наши защитные решения зафиксировали в России, Японии, Германии, Бразилии и Нидерландах.
Наши рекомендации
Нашу службу технической поддержки часто спрашивают, какие действия необходимо предпринять, если защитное решение обнаружило на устройстве Keenadu. В этом разделе рассмотрим все возможные сценарии борьбы с троянцем.
Если заражена библиотека libandroid_runtime.so
В современных версиях Android системный раздел, в котором в том числе находится libandroid_runtime.so, смонтирован в режиме «только для чтения». Даже если теоретически допустить возможность редактирования этого раздела, зараженную библиотеку libandroid_runtime.so не получится удалить без повреждения прошивки: устройство попросту перестанет загружаться. Поэтому устранить угрозу штатными средствами ОС Android не получится. Эксплуатация зараженного бэкдором Keenadu устройства при этом может быть сопряжена с большим количеством неудобств.
Например, в отзывах к зараженным устройствам покупатели жалуются на назойливую рекламу, а также на появление различных звуков, источник которых установить не удается.
Если вы столкнулись с бэкдором Keenadu, мы рекомендуем сделать следующее.
- Проверить наличие обновлений ПО. Возможно, для вашего устройства уже вышла чистая прошивка. После обновления необходимо проверить с помощью надежного защитного решения, что проблема устранена.
- Если чистого обновления прошивки от производителя для вашего устройства не существует, можно установить чистую прошивку самостоятельно. При этом важно помнить, что самостоятельная прошивка устройства может вывести его из строя.
- До замены или обновления прошивки мы рекомендуем отказаться от использования зараженного устройства.
Если заражено одно из системных приложений
К сожалению, как и в предыдущем случае, удалить такое приложение с устройства не получится, поскольку оно находится в системном разделе. Если вы столкнулись с загрузчиком Keenadu в системном приложении, мы рекомендуем следующее.
- Если это возможно, найти замену приложению. Например, если заражено приложение для рабочего стола, можно скачать любой аналог, не содержащий вредоносного ПО. Если же аналогов для приложения не существует (например, заражен сервис для распознавания лиц), мы рекомендуем по возможности не использовать соответствующую функциональность.
- Отключить зараженное приложение с помощью ADB, если для него был найден аналог или от его функциональности можно отказаться. Это можно сделать командой
adb shell pm disable --user 0 %PACKAGE%.
Если на устройство установили зараженное приложение
Это один из наиболее простых случаев заражения. Если защитное решение обнаружило на вашем устройстве приложение, зараженное Keenadu, достаточно просто удалить приложение, следуя указаниям защитного решения.
Заключение
Разработчики предустановленных бэкдоров в прошивках Android-устройств всегда отличались высокой квалификацией. В случае с Keenadu это тоже так: авторы зловреда хорошо понимают устройство Android и процесс запуска приложений, а также основные принципы безопасности операционной системы. В ходе исследования нас удивил размах кампаний Keenadu: помимо основного бэкдора в прошивках его модули встречались в системных приложениях и даже в приложениях из Google Play. Это ставит троянца по масштабам в один ряд с такими зловредами, как Triada или BADBOX. Появление нового предустановленного бэкдора такого масштаба означает, что эта категория зловредов — отдельный рынок с большой конкуренцией.
Keenadu представляет из себя масштабную и сложно устроенную вредоносную платформу, которая предоставляет атакующим неограниченный контроль над устройством жертвы. Хотя на данный момент нам удалось показать, что бэкдор используется преимущественно для разного рода рекламного мошенничества, мы не исключаем, что в дальнейшем зловред может, к примеру, пойти по пути Triada и начать похищать учетные данные.
Индикаторы компрометации
Дополнительные индикаторы компрометации, технические подробности и правило YARA для детектирования активности Keenadu доступны клиентам сервиса Threat Intelligence. Для получения более подробной информации свяжитесь с нами по адресу crimewareintel@kaspersky.com.
Вредоносные библиотеки libandroid_runtime.so
bccd56a6b6c9496ff1acd40628edd25e
c4c0e65a5c56038034555ec4a09d3a37
cb9f86c02f756fb9afdb2fe1ad0184ee
f59ad0c8e47228b603efc0ff790d4a0c
f9b740dd08df6c66009b27c618f1e086
02c4c7209b82bbed19b962fb61ad2de3
185220652fbbc266d4fdf3e668c26e59
36db58957342024f9bc1cdecf2f163d6
4964743c742bb899527017b8d06d4eaa
58f282540ab1bd5ccfb632ef0d273654
59aee75ece46962c4eb09de78edaa3fa
8d493346cb84fbbfdb5187ae046ab8d3
9d16a10031cddd222d26fcb5aa88a009
a191b683a9307276f0fc68a2a9253da1
65f290dd99f9113592fba90ea10cb9b3
68990fbc668b3d2cfbefed874bb24711
6d93fb8897bf94b62a56aca31961756a
Нагрузки Keenadu
2922df6713f865c9cba3de1fe56849d7
3dae1f297098fa9d9d4ee0335f0aeed3
462a23bc22d06e5662d379b9011d89ff
4c4ca7a2a25dbe15a4a39c11cfef2fb2
5048406d8d0affa80c18f8b1d6d76e21
529632abf8246dfe555153de6ae2a9df
7ceccea499cfd3f9f9981104fc05bcbd
912bc4f756f18049b241934f62bfb06c
98ff5a3b5f2cdf2e8f58f96d70db2875
aa5bf06f0cc5a8a3400e90570fb081b0
ad60f46e724d88af6bcacb8c269ac3c1
dc3d454a7edb683bec75a6a1e28a4877
f0184f6955479d631ea4b1ea0f38a35d
Системные приложения, зараженные загрузчиком Keenadu
07546413bdcb0e28eadead4e2b0db59d
0c1f61eeebc4176d533b4fc0a36b9d61
10d8e8765adb1cbe485cb7d7f4df21e4
11eaf02f41b9c93e9b3189aa39059419
19df24591b3d76ad3d0a6f548e608a43
1bfb3edb394d7c018e06ed31c7eea937
1c52e14095f23132719145cf24a2f9dc
21846f602bcabccb00de35d994f153c9
2419583128d7c75e9f0627614c2aa73f
28e6936302f2d290c2fec63ca647f8a6
382764921919868d810a5cf0391ea193
45bf58973111e00e378ee9b7b43b7d2d
56036c2490e63a3e55df4558f7ecf893
64947d3a929e1bb860bf748a15dba57c
69225f41dcae6ddb78a6aa6a3caa82e1
6df8284a4acee337078a6a62a8b65210
6f6e14b4449c0518258beb5a40ad7203
7882796fdae0043153aa75576e5d0b35
7c3e70937da7721dd1243638b467cff1
9ddd621daab4c4bc811b7c1990d7e9ea
a0f775dd99108cb3b76953e25f5cdae4
b841debc5307afc8a4592ea60d64de14
c57de69b401eb58c0aad786531c02c28
ca59e49878bcf2c72b99d15c98323bcd
d07eb2db2621c425bda0f046b736e372
d4be9b2b73e565b1181118cb7f44a102
d9aecc9d4bf1d4b39aa551f3a1bcc6b7
e9bed47953986f90e814ed5ed25b010c
Приложения, зараженные кликером Nova
0bc94bc4bc4d69705e4f08aaf0e976b3
1276480838340dcbc699d1f32f30a5e9
15fb99660dbd52d66f074eaa4cf1366d
2dca15e9e83bca37817f46b24b00d197
350313656502388947c7cbcd08dc5a95
3e36ffda0a946009cb9059b69c6a6f0d
5b0726d66422f76d8ba4fbb9765c68f6
68b64bf1dea3eb314ce273923b8df510
9195454da9e2cb22a3d58dbbf7982be8
a4a6ff86413b3b2a893627c4cff34399
b163fa76bde53cd80d727d88b7b1d94f
ba0a349f177ffb3e398f8c780d911580
bba23f4b66a0e07f837f2832a8cd3bd4
d6ebc5526e957866c02c938fc01349ee
ec7ab99beb846eec4ecee232ac0b3246
ef119626a3b07f46386e65de312cf151
fcaeadbee39fddc907a3ae0315d86178
CDN для доставки полезных нагрузок
ubkt1x.oss-us-west-1.aliyuncs[.]com
m-file-us.oss-us-west-1.aliyuncs[.]com
pkg-czu.istaticfiles[.]com
pkgu.istaticfiles[.]com
app-download.cn-wlcb.ufileos[.]com
C2-серверы
110.34.191[.]81
110.34.191[.]82
67.198.232[.]4
67.198.232[.]187
fbsimg[.]com
tmgstatic[.]com
gbugreport[.]com
aifacecloud[.]com
goaimb[.]com
proczone[.]com
gvvt1[.]com
dllpgd[.]click
fbgraph[.]com
newsroomlabss[.]com
sliidee[.]com
keepgo123[.]com
gsonx[.]com
gmsstatic[.]com
ytimg2[.]com
glogstatic[.]com
gstatic2[.]com
uscelluliar[.]com
playstations[.]click
* Instagram принадлежит корпорации Meta, которая признана экстремистской в Российской Федерации






































Разделяй и властвуй: как новый бэкдор Keenadu помог выявить связи между крупными Android-ботнетами