Агентства кибербезопасности Великобритании, США, Австралии, Канады и Новой Зеландии опубликовали совместный отчёт о новом вредоносном наборе компонентов, ориентированном на Android-устройства. Данная угроза, получившая название Infamous Chisel, связывается с деятельностью группировки Sandworm. Основной целью кампании стали мобильные устройства, используемые украинскими военными.
Описание
Согласно документу, опубликованному британским Национальным центром кибербезопасности (NCSC) совместно с АНБ, CISA, ФБР, а также аналогичными структурами Новой Зеландии, Канады и Австралии, вредонос представляет собой коллекцию утилит, обеспечивающих постоянный удалённый доступ к заражённому устройству и эксфильтрацию конфиденциальных данных. Infamous Chisel спроектирован для работы через сеть Tor и включает в себя средства для мониторинга трафика, сбора информации о системе и локальной сети.
Основными функциями набора являются сканирование файлов по заданным расширениям и регулярная отправка обнаруженных данных на сервер злоумышленников. Кроме того, вредонос способен сканировать локальную сеть на предмет активных хостов, открытых портов и баннеров. Для удалённого доступа используется скрытый сервис Tor, который перенаправляет соединения на модифицированную версию Dropbear SSH-сервера.
Исследователи отмечают, что Infamous Chisel состоит из нескольких компонентов. Ключевым элементом является модуль netd, который заменяет легитимный системный процесс netd на Android-устройстве. Такая замена обеспечивает закрепление в системе и выполнение с привилегиями root. Заражение начинается с того, что злоумышленники помещают вредоносный netd вместо оригинального файла по пути /system/bin/netd. При запуске через init проверяется, является ли родительский процесс именно init. Если да, netd запускает резервную копию легитимного процесса netd_ с теми же параметрами, сохраняя нормальную работу системы, но при этом сам остаётся активным с повышенными правами.
Компонент killer, напротив, предназначен для остановки вредоносного netd. Он завершает процесс, если он не является резервной копией. Для сжатия и запуска Tor используется программа blob. Именно blob распаковывает и конфигурирует исполняемый файл td (стандартный Tor без изменений) и создаёт файл конфигурации /data/local/prx.cfg. В этой конфигурации задаются локальный порт SOCKS4 127.0.0.1:1129, каталог данных /data/local/prx/ и скрытый сервис на порту 34371. После этого blob регулярно проверяет доступность сети через подключение к домену www.geodatatool[.]com через SOCKS-прокси.
Как показал анализ международных агентств, вредонос включает в себя многокомпонентные двоичные файлы db, ndbr_armv7l и ndbr_i686, которые содержат Dropbear, Dropbearkey, SSH, SCP, собственный сетевой сканер nmap, а также вспомогательные утилиты watchdog, rmflag и mkflag. Последние отвечают за создание каталогов и файлов-флагов, а также за настройку iptables для разрешения входящих TCP-соединений на 34371 порт. Модификации в Dropbear затрагивают функции аутентификации: злоумышленники заменили стандартные процедуры getpwnam, getpwuid и getspnam на собственные версии, которые проверяют жёстко заданные имя пользователя и идентификатор 0xbeef. Если эти значения совпадают, возвращается предопределённая структура данных, что позволяет обойти парольную защиту.
Сбор информации выполняется с интервалами. Каждые 86 000 секунд (около 24 часов) netd запускает поиск файлов по расширениям (.dat, .bak, .xml, .txt, .ovpn, .db, .pdf, .xlsx, .csv, .zip, .png, .jpg, .kml и другие) в нескольких директориях, включая /sdcard, /data/media, а также каталоги приложений: OpenVPN, Telegram, Signal, WhatsApp, Google Authenticator, криптовалютные кошельки и другие. Дополнительно выполняется скрипт сбора системной информации: android_id, список установленных пакетов, IP-конфигурация, GPS-координаты, сведения о производителе и батарее. Собранные данные временно сохраняются в /data/local/tmp/.syscache.csv и других файлах, затем отправляются на сервер через HTTPS POST-запросы.
Интервал эксфильтрации конфигурационных файлов (с расширениями .json и .json.bak) составляет 10 минут. Каждые 172 000 секунд (почти двое суток) проводится сканирование локальной сети с помощью встроенного сканера minmap. Результаты записываются в файл .ndata.csv и также отправляются. Для предотвращения повторной отправки одних и тех же файлов используется файл .google.index, в который записываются MD5-хеши уже отправленных данных. При достижении лимита в 16 384 хеша запись начинается с начала, что может привести к дублированию.
Трафик эксфильтрации шифруется с использованием TLS. Сначала попытка соединения выполняется на жёстко заданный локальный IP-адрес и порт (предположительно через VPN-туннель), а при неудаче - на внешний домен через DNS-запрос к dns.google. В HTTP-заголовках используется User-Agent, характерный для Windows, что может быть замечено при глубоком анализе, но в шифрованном трафике это сложно выявить.
Отчёт отмечает, что сложность Infamous Chisel оценивается как низкая или средняя. Разработчики не применяли изощрённых методов обфускации или скрытия активности. Однако замена системного демона netd и модификация аутентификации Dropbear требуют хорошего знания C++ и понимания механизмов загрузки Linux. На большинстве Android-устройств отсутствуют системы обнаружения хостовых угроз, поэтому злоумышленники могли не считать маскировку необходимой.
Сбор специфических данных, связанных с военными приложениями, в том числе конфигураций VPN, мессенджеров и криптокошельков, прямо указывает на целевую направленность атаки. Несмотря на примитивность отдельных компонентов, вредонос представляет серьёзную угрозу из-за объёма информации, которую он способен извлечь. Международные агентства рекомендуют операторам мобильных устройств, особенно в силовых структурах, применять усиленные меры защиты: обновлять прошивки, ограничивать установку сторонних приложений, использовать решения для мобильной безопасности и регулярно проверять целостность системных файлов. Данная кампания подтверждает тенденцию роста целенаправленных атак на мобильные платформы со стороны государственных злоумышленников.
Индикаторы компрометации
MD5
- 04d0606d90bba826e8a609b3dc955d4d
- 0905e83411c0418ce0a8d3ae54ad89a6
- 1f2c118b29e48cc5a5df46cddd399334
- 2cfa1f3e0467b8664cbf3a6d412916d6
- 452b6c35f44f55604386849f9e671cc0
- 4bdf7f719651d9a762d90e9f33f6bb01
- 512eb94ee86e8d5b27ec66af98a2a8c4
- 7e548ef96d76d2f862d6930dcc67ef82
- c4b5c8bdf95fe636a6e9ebba0a60c483
SHA1
- 2df1e320851b26947ab1ea07eaccbd4d3762c68e
- 500b953d63a0dbdc76dc3f51c32e3acab92f3ddc
- 7d11aefc26823712ad8de37489f920fae679b845
- 917db380b22fad02e7f21f11d1b4e8a5ad47c61c
- ad6eb2a7096b0e29cd93b8b1f60052fed7632ab9
- b681a2b64d150a4b16f64455913fbacd97d9b490
- cdad1bee2e88581b7fa7af5698293435667d2550
- f6368ae2eec8cf46a7e88559f27dbbe4e7c02380
- ffaeba9a9fb4260b981fb10d79dbb52ba291fc94
SHA256
- 001208a304258c23a0b3794abd8a5a21210dfeaf106195f995a6f55d75ef89cd
- 140accb18ba9569b43b92da244929bc009c890916dd703794daf83034e349359
- 2d19e015412ef8f8f7932b1ad18a5992d802b5ac62e59344f3aea2e00e0804ad
- 338f8b447c95ba1c3d8d730016f0847585a7840c0a71d5054eb51cc612f13853
- 33a2be6638be67ba9117e0ac7bad26b12adbcdf6f8556c4dc2ff3033a8cdf14f
- 3cf2de421c64f57c173400b2c50bbd9e59c58b778eba2eb56482f0c54636dd29
- 5866e1fa5e262ade874c4b869d57870a88e6a8f9d5b9c61bd5d6a323e763e021
- 5c5323bd17fd857a0e77be4e637841dad5c4367a72ac0a64cc054f78f530ba37
- ef466e714d5250e934e681bda6ebdecd314670bb141f12a1b02c9afddbd93428
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | rule netd_CreatedFiles { meta: author = "NCSC" description = "Unique file paths created by netd" date = "2023-08-31" strings: $ = "/data/local/tmp/.aid.cache" $ = "/data/local/tmp/.syscache.csv" $ = "/data/local/tmp/.syspackages.csv" $ = "/data/local/tmp/.sysinfo.csv" $ = "/data/local/tmp/.ndata.csv" $ = "/data/local/tmp/.ndata.tmp" $ = "/data/local/tmp/.android.cache.sh" condition: uint32(0) == 0x464C457F and any of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | rule netd_ScrapedApps { meta: author = "NCSC" description = "Application directories strings searched by netd" date = "2023-08-31" strings: $ = "/data/data/com.android.providers.contacts" $ = "/data/data/com.android.providers.telephony" $ = "/data/data/com.google.android.gm" $ = "/data/data/de.blinkt.openvpn" $ = "/data/data/eu.thedarken.wldonate" $ = "/data/data/net.openvpn.openvpn" $ = "/data/data/org.telegram.messenger" $ = "/data/data/org.thoughtcrime.securesms" condition: uint32(0) == 0x464C457F and all of them } |
| 1 2 3 4 5 6 7 8 9 10 11 | rule netd_Uri { meta: author = "NCSC" description = "POST request strings present in netd" date = "2023-08-31" strings: $ = "POST /server.php?ver=16&bid=%s&type=%d" $ = "User-Agent: curl/7.47" condition: uint32(0) == 0x464C457F and all of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 | rule netd_Paths { meta: author = "NCSC" description = "db and td path strings found in netd" date = "2023-08-31" strings: $ = "/data/local/db" $ = "/data/local/prx.cfg" $ = "/data/local/td" condition: uint32(0) == 0x464C457F and all of them } |
| 1 2 3 4 5 6 7 8 9 10 | rule netd_FileExtensionString { meta: author = "NCSC" description = "File extension strings" date = "2023-08-31" strings: $ = ".dat,.bak,.xml,.txt,.ovpn,.xml,wa.db,msgstore.db,.pdf,.xlsx,.csv,.zip,telephony.db,.png,.jpg,.jpeg,.kme,database.hik,database.hik-journal,ezvizlog.db,cache4.db,contacts2.db,.docx,.gz,.rar,.tar,.7zip,.zip,.kmz,locksettings.db,mmssms.db,telephony.db,signal.db,mmssms.db,profile.db,accounts.db,PyroMsg.DB,.exe,.kml" condition: uint32(0) == 0x464C457F and any of them } |
| 1 2 3 4 5 6 7 8 9 10 | rule netd_Blob { meta: author = "NCSC" description = "blob path string found in netd" date = "2023-08-31" strings: $ = "/data/local/tmp/blob" condition: uint32(0) == 0x464C457F and any of them } |
| 1 2 3 4 5 6 7 8 9 10 | rule netd_TorDomainPath { meta: author = "NCSC" description = "Tor hostname path string found in netd" date = "2023-08-31" strings: $ = "/data/local/prx/hs/hostname" condition: uint32(0) == 0x464C457F and any of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 | rule netd_TriageCommands { meta: author = "NCSC" description = "Shell script commands found in netd" date = "2023-08-31" strings: $ = "settings get secure android_id" $ = "pm list packages" $ = "getprop" condition: uint32(0) == 0x464C457F and all of them } |
| 1 2 3 4 5 6 7 8 9 10 | rule netd_waitloop { meta: author = "NCSC" description = "netd wait loop" date = "2023-08-31" strings: $ = {38 23 F9 18 01 23 5B 42 01 22 18 00 ?? ?? ?? ?? 0F 20} condition: uint32(0) == 0x464C457F and any of them } |
| 1 2 3 4 5 6 7 8 9 10 | rule netd_pidloop { meta: author = "NCSC" description = "netd pid for loop" date = "2023-08-31" strings: $ = {1B 68 8A 4A 93 42 ?? ?? ?? ?? C0 46} condition: uint32(0) == 0x464C457F and any of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | rule blob_TorCommandLine { meta: author = "NCSC" description = "Tor configuration file strings in blob" date = "2023-08-31" strings: $ = "SocksPort 127.0.0.1:1129" $ = "DataDirectory /data/local/prx/" $ = "/data/local/prx/hs/" $ = "HiddenServicePort 34371 127.0.0.1:34371" condition: uint32(0) == 0x464C457F and 2 of them } |
| 1 2 3 4 5 6 7 8 9 10 | rule blob_waitloop { meta: author = "NCSC" description = "blob wait on event loop" date = "2023-08-31" strings: $ = {0C 23 F9 18 01 23 5B 42 01 22 18 00 ?? ?? ?? ?? 03 1E} condition: uint32(0) == 0x464C457F and any of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 | rule killer_Strings { meta: author = "NCSC" description = "killer binary strings" date = "2023-08-31" strings: $ = "netd_" $ = "/proc/%d/exe" $ = "/proc/%d/status" condition: uint32(0) == 0x464C457F and uint8(4) == 0x1 and uint16(18) == 0x0028 and all of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | rule db_androidpaths { meta: author = "NCSC" description = "db Android path strings" date = "2023-08-31" strings: $ = "/data/local/tmp/sessions.log.d/.ssh/remove_file.flag" $ = "/data/local/tmp/sessions.log.d" $ = "/data/local/tmp/sessions.log.d/.ssh" $ = "/data/local/tmp/sessions.log.d/.ssh/authorized_keys" $ = "/data/local/tmp/sessions.log.d/.ssh/know_host" $ = "/data/local/tmp/sessions.log.d/dropbear_rsa_host_key" $ = "/data/local/tmp/sessions.log.d/dropbear_dss_host_key" $ = "/data/local/tmp/sessions.log.d/dropbear_ecdsa_host_key" $ = "/data/local/tmp/sessions.log.d/session.key" $ = "/data/local/tmp/sessions.log.d/.bash_history" $ = "/data/local/tmp/sessions.log.d/dropbear_ed25519_host_key" $ = "/data/local/tmp/sessions.log.d/" $ = "/data/local/tmp/sessions.log.d" condition: uint32(0) == 0x464C457F and uint8(4) == 0x1 and uint16(18) == 0x0028 and all of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | rule ndbr_ScanStrings { meta: author = "NCSC" description = "ndbr scan strings" date = "2023-08-31" strings: $ = "INTERFACE = %s" $ = "SOURCE = %s" $ = "IP begin = %s" $ = "IP end = %s" $ = "PORT = top" $ = "PORT begin = %hu" $ = "PORT end = %hu" $ = "PING %s" $ = "SCAN %s" $ = "*******start*scan********" $ = "Host %s:" condition: uint32(0) == 0x464C457F and uint8(4) == 0x1 and uint16(18) == 0x0028 and all of them } |