DarkSword «P7»: утёкшая iOS-цепочка уровня госзаказчика теперь крадёт данные криптокошельков

Одно посещение веб-страницы с iPhone на iOS 18.4–18.7 — и через несколько секунд в SpringBoard работает имплант, который расшифровывает связку ключей прямо на устройстве, находит seed-фразы и keystore криптокошельков и отправляет их на сервер. Ещё год назад так выглядела операция, доступная единицам заказчиков. По нашей оценке, сегодня эта цепочка работает внутри сервиса доставки эксплойтов с партнёрскими «каналами», а приманками служат сайты китайских онлайн-казино.
8 октября iVerify описала криминальный вариант эксплойт-цепочки DarkSword, который назвала «P7». Мы разобрали его по открытым данным и нашли то, чего в публикации нет: третью сборку P7 с новой приманкой и новым командным сервером, побайтовое сравнение импланта с оригинальным GHOSTBLADE и кластер доставки «qqtime», работающий как минимум с июля 2026 года. Заодно пришлось исправить ошибку атрибуции, которая кочевала по ранним публикациям о мартовской кампании TA446.
## Что такое DarkSword и как он утёк
DarkSword — полная эксплойт-цепочка для iOS, написанная на JavaScript. В марте 2026 года Google Threat Intelligence Group (GTIG) описала её в отчёте «The Proliferation of DarkSword». Цепочка использует шесть уязвимостей, три из которых на момент использования были zero-day:
CVE | Компонент | Роль в цепочке |
|---|---|---|
CVE-2025-31277, CVE-2025-43529 | JavaScriptCore | RCE в браузере (iOS ниже и выше 18.6) |
CVE-2026-20700 | dyld | Обход PAC |
CVE-2025-14174 | ANGLE | Из WebContent в GPU-процесс |
CVE-2025-43510 | XNU | Из GPU-процесса в mediaplaybackd |
CVE-2025-43520 | XNU VFS (гонка) | Повышение привилегий до ядра |
Apple закрыла их в iOS 18.7.2, 18.7.3, 26.1, 26.2 и 26.3.
До утечки у GTIG было три известных пользователя цепочки: UNC6748 (Саудовская Аравия, ноябрь 2025, бэкдор GHOSTKNIFE), PARS Defense, которую GTIG характеризует как турецкого поставщика средств коммерческой слежки (бэкдор GHOSTSABER) и UNC6353 — предположительно российская шпионская группа, которая атаковала украинские сайты по схеме watering hole сначала с Coruna, а с декабря 2025 года с DarkSword и имплантом-сборщиком данных GHOSTBLADE. По оценке GTIG, GHOSTBLADE, вероятно, написали сами разработчики DarkSword. Кто они — публично не установлено.
22 марта 2026 года полная сборка (кит UNC6353 вместе с GHOSTBLADE) оказалась в открытом доступе. Через несколько дней её уже переиспользовали другие: в том числе российская группа TA446 / Star Blizzard против гражданского общества. К сентябрю iVerify насчитала около 17 000 доменов со вторым поколением DarkSword и Coruna и ввела термин «DarkCoruna» для развёртываний, совмещающих обе цепочки: Coruna закрывает iOS 13–17.2.1, DarkSword — 18.x.
Что iVerify назвала P7
В посте «Sleep, Beacon, Steal, Repeat» от 8 октября iVerify описывает P7 по заражённому устройству клиента. Имплант живёт в SpringBoard, каждые 15 секунд по HTTP/1.0 стучится на /beacon, принимает команду sleep, отправляет данные на /result, /a, /event, /u, /nb, /p и /war, использует жёстко заданную строку User-Agent для iOS 18.5 и фиксированный разделитель multipart, а связку ключей разбирает в JSON прямо на устройстве. Префикс p7_ в коде агента дал варианту имя.
iVerify опубликовала хеши десяти компонентов P7. На момент нашего анализа на VirusTotal были только два из них, а сам агент — нигде.
Как мы работали: только пассивные источники
Принципиальное ограничение этого расследования: мы не обращались ни к одному хосту атакующих. Всё получено из того, что уже лежит в открытом доступе:
urlscan.io — публичные сканы страниц-приманок. urlscan хранит тела ответов, и их можно достать по хешу. Восстановленные файлы мы сверяли с хешами независимого краулера там, где они были.
tria.ge — публичная песочница; 3 октября туда кто-то загрузил архив с полным китом DarkSword.
MWDB CERT Polska — образец GHOSTBLADE, опубликованный GTIG, и сентябрьский кит DarkSword из фида MalwareBazaar как эталоны для сравнения.
VirusTotal, Hybrid Analysis, AlienVault OTX, Validin — только метаданные: даты первого появления, пассивный DNS, данные WHOIS и нечёткие хеши. Никаких файлов мы никуда не загружали.
Код анализировался статически, офлайн, без исполнения JavaScript в каком-либо рантайме на базе WebKit или JavaScriptCore.
Находка 1: третья сборка P7
Архив test.zip (SHA-256 ef9263b1…, 437 КБ), загруженный в tria.ge 3 октября 2026 года, содержит полное развёртывание DarkSword с файлами от 29 сентября.
Файл | Размер | Назначение |
|---|---|---|
| 51 385 Б | Приманка: китайское онлайн-казино «通博娱乐 – www.iospc8[.]com», ссылки на |
| 2 215 Б | Стартовая страница: пять скрытых iframe с интервалом 1,5 с, блокировки в sessionStorage ( |
| 836 Б | Сторож: перезагружает страницу, если эксплойт завис |
| 7 318 Б | Выбор стадии в стиле утёкшего кита, но с включённой телеметрией ( |
| 173 079 Б | RCE-модуль CVE-2025-31277, SHA-256 |
| 45 КБ / 520 КБ | Воркеры для iOS 18.4–18.5 и 18.6–18.7 |
| 400 КБ / 310 КБ | Выход из песочницы |
| 793 879 Б | Эксплойт ядра + бандл импланта. На 15 КБ больше утёкшего оригинала — здесь и живёт P7 |
Домен приманки iospc8[.]com зарегистрирован 23 сентября 2026 года (GoDaddy, DNS Cloudflare) — за шесть дней до сборки кита. По регистрационным и DNS-данным, командный сервер www.y21t8bcya6q9b7155a[.]cc зарегистрирован 25 мая 2026 года через Gname.com, страной регистранта указан Китай; домен работает за Cloudflare, а до переезда за CDN кратковременно разрешался в адрес Alibaba Cloud в Гонконге. Провайдеры здесь упомянуты только как элементы инфраструктуры. Ни одного из этих доменов нет в индикаторах iVerify.
Шапка агента откровенна: «C2 Agent Payload – persistent loop in SpringBoard. Communicates with command.py via HTTP … replaced by server.py at load time». Судя по этому комментарию, серверная часть — Python-приложение, которое при выдаче подставляет URL командного сервера в имплант. Ещё интереснее константа C2_CHANNEL_CODE: она уходит полем source в каждой регистрации, heartbeat и инвентаризации. Код канала — это то, чем партнёрские программы считают трафик. Его наличие означает, что кит обслуживает нескольких распространителей, а не одного конечного пользователя. Тот же механизм мы потом нашли в цепочке доставки.
Находка 2: что P7 на самом деле меняет
Помодульное сравнение с GHOSTBLADE
pe_main.js — webpack-бандл. Помимо эксплойт-библиотеки в нём строками зашиты четыре полезные нагрузки: loader.js, c2_agent.js, keychain_copier.js и MigFilterBypassThread.js. Мы извлекли их и сравнили с соответствующими модулями образца GHOSTBLADE, опубликованного GTIG (SHA-256 2e5a56be…).
Модуль | GHOSTBLADE | P7, сборка 3 | Вердикт |
|---|---|---|---|
| 10 096 Б | 10 096 Б | Побайтово идентичен. «P7 loader» из публичных списков хешей — это оригинальный загрузчик GHOSTBLADE; отсюда ноль детектов на VirusTotal |
| 3 797 строк | 3 797 строк | Код идентичен, отличается только форматирование закрывающих скобок в конце |
| 350 строк | 360 строк | Версия GHOSTBLADE плюс WAL/SHM-файлы |
| 3 740 строк, одноразовый эксфил на | 4 756 строк | Переписан. Общий только класс-хелпер |
| есть | нет | Удалены — а вместе с ними все строки YARA-правила GTIG |
Иначе говоря, авторы P7 не трогали самую сложную часть DarkSword — библиотеку удалённых вызовов TaskRop и обход MIG-фильтра — и заменили бизнес-логику. Это значит, что «новый» имплант большей частью состоит из байтов утёкшего.
Командный агент
c2_agent.js внедряется в SpringBoard и работает до перезагрузки. Он регистрирует устройство (/a), затем в цикле раз в 15 секунд отправляет beacon {uuid, device_info, status: "idle"}, выполняет полученную команду и отправляет результат на /result с идентификаторами команды и задачи. Транспорт — HTTP/1.0 через CFStream с kCFStreamSSLValidatesCertificateChain = false, то есть принимается любой сертификат.
Обработчики: basic_info, disk_scan, ios_app_data, wallet_extract, wallet_scan, memo_scan, photo_scan, photos, apps, download, upload, file_upload, exec, eval, execute_command, sleep, exit. Один только execute_command реализует около пятидесяти shell-подобных подкоманд (ls, cat, find, grep, ps, netstat, ifconfig, hexdump, memdump, httpspy и другие) — интерактивный доступ к устройству без настоящего шелла.
Нацеленность на кошельки прямая. Агент находит контейнеры приложений по bundle ID для imToken, TokenPocket, Trust Wallet, Bitget / BitKeep, Phantom, Solflare, Uniswap, Tonhub, Bitpie и TronLink, читает базы React Native AsyncStorage, а для imToken расшифровывает Ethereum keystore v3 прямо на устройстве (PBKDF2, AES-CTR, HMAC-SHA256 реализованы на JavaScript) паролем, найденным в расшифрованной связке ключей. Результат вместе с дампом keychain уходит на /war.
«P7 Phase 2»: AppleKeyStore как оракул
По-настоящему новая инженерия — не в агенте, а в самом pe_main.js, в блоке, который авторы подписали «P7 Phase 2: V4 Local SQLite + Remote AKS Oracle Pipeline».
После эксплойта ядра pe_main.js внедряет keychain_copier.js в configd (тот копирует keychain-2.db и keybag’и в /tmp), а loader.js и c2_agent.js — в SpringBoard. Дальше:
«будит»
securitydтремя вызовамиSecItemCopyMatching;поднимает канал удалённых вызовов в
securityd;из контекста
securitydоткрывает IOKit-сервисAppleKeyStore;использует
aks_unwrapкак оракул, чтобы развернуть ключи классов для элементов из локальной копии базы keychain;пишет расшифрованные элементы в
/private/var/tmp/keychain_c2_dump.json, затем четырёхбайтный маркер.done, который агент опрашивает до 180 секунд, прежде чем собрать пакет кошельков.
GHOSTBLADE лишь копировал файлы связки ключей на сервер. P7 расшифровывает её на устройстве, поэтому эксфильтрация может быть маленькой, точечной и сразу пригодной к использованию. Это и есть «разбор keychain в JSON на устройстве» из поста iVerify.
У этой фазы свой журнал — /private/var/tmp/p7_debug.log, который пишется через буферизованную обёртку над fopen/fwrite; ветка кошельков в агенте пишет /private/var/tmp/c2_wallet_debug.log. Утверждение iVerify, что в P7 убрано отладочное логирование, относится только к HTTP- и syslog-логам. Файловое логирование оставлено намеренно — и это надёжный форензик-артефакт.
Находка 3: кластер доставки «qqtime»
Живая цепочка из архива urlscan
Сайт cryptonewstrack[.]com, оформленный как криптоновостной ресурс, публично сканировался на urlscan.io 17 июля, 5 и 15 сентября 2026 года. Сентябрьские сканы захватили всю цепочку доставки P7, кроме финальной стадии, которая отдаётся только user agent с iOS 18. Мы достали тела ответов из хранилища urlscan; SHA-1 восстановленного group.html совпал с хешем тела, независимо записанным краулером Validin 19 сентября.
Цепочка:
Страница грузит
hxxps://oss.gotoiphone[.]com/alicdn/a5a62a47e2914d88ab7b34b2ebea8b25.js(2 660 Б) из Alibaba Object Storage.Скрипт создаёт скрытый iframe 1×1 на
hxxps://cdn.gotoiphone[.]com/group.htmlи каждые пять секунд отправляет публичный IP посетителя, версию ОС и URL страницы наhxxps://goo[.]wang/alicdn/a5a62a47…/visit.goo[.]wangрезолвится в тот же адрес Alibaba Cloud, что иjs.gotoiphone[.]com— командный сервер P7 из отчёта iVerify. Телеметрия посетителей и C2 живут на одном хосте.group.html(с комментариями на китайском) грузитloader.jsдля всех посетителей, а если в user agent есть «18» — ещё иrce_loader.js, точку входа DarkSword. Страница перезагружается каждые 120 секунд.loader.js(47 605 Б) — не DarkSword. Это обфусцированный загрузчик Coruna: таблица модулей с ключами SHA-1, модули догружаются по имени вида SHA-256(соль + имя), сольcecd08aa6ff548c2, пороги версии iOS 13.0 и 16.0, коды результата 1000/1001/1003.
Значит, cdn.gotoiphone[.]com — это DarkCoruna: Coruna для iOS 13–17.2.1 и DarkSword для 18.x с одного iframe. В посте iVerify про P7 половина с Coruna не упоминается.
Тот же загрузчик с июля
Загрузчик Coruna достаточно характерен, чтобы использовать его признаки для поиска связанной инфраструктуры. Поиск в urlscan по заголовку страницы, имени файла и соли дал ту же сборку — те же имена функций, таблица модулей, соль и константы — ещё на пяти хостах:
Впервые замечен | Хост / путь | Что там |
|---|---|---|
2026-07-16 |
| Загрузчик |
2026-07-17 |
| Загрузчик лежит прямо на сайте-приманке, отчёт на |
2026-07-31 |
| Тот же файл, что на cryptonewstrack |
2026-08-04 |
| Первое появление ветки DarkSword |
2026-09-05 → 2026-10-03 |
|
|
Имя проекта у оператора видно невооружённым глазом: «qqtime» в путях и <title>; одно развёртывание называется «foxtimes».
routers.js (883 Б) читается без деобфускации. Он разбирает версию iOS из user agent и при версии 18.4 и выше грузит ds_rce_loader.js (DarkSword), иначе — загрузчик Coruna с параметром ?channelcode=1df7afe33d3bf512f124136cf405f57a. Значение channelcode совпадает с именем каталога развёртывания: каждый распространитель получает свой путь. Это тот же механизм, что C2_CHANNEL_CODE в агенте третьей сборки P7.
Домен gotoiphone[.]com спал с 2020 года и был перерегистрирован 28 июля 2026 года через Dominet (HK) с DNS Alibaba; поддомен доставки переехал на Alibaba OSS 5 сентября. Ни один из этих хостов — как и cryptonewstrack[.]com, ipsadminuser[.]shop и goo[.]wang — не входит в списки индикаторов iVerify и GTIG, и ни одного из восстановленных файлов нет на VirusTotal.
Установить, был ли cryptonewstrack[.]com взломан или контролировался оператором, не удалось. В рамках этого расследования его следует рассматривать как сайт-приманку, а не как подтверждённый C2, и не блокировать как инфраструктуру управления.
Общая серверная часть?
Корневая страница mzpo30[.]cam — второго хоста доставки P7 по iVerify — отдаёт 49-байтную заглушку <p>.</p> с Server: openresty, Cache-Control: no-cache, no-store и Access-Control-Allow-Origin: * за CloudFront. Корень nuih22[.]cc — DarkSword-хоста, на который в приложении iVerify указывают 14 разных приманок, — отдаёт идентичное тело и заголовки за Cloudflare, и оба используют путь /assets/js/group.html. 49-байтная заглушка — слабый отпечаток, поэтому общий оператор или общий серверный шаблон кита мы оцениваем лишь как вероятный, со средней уверенностью.
Почему блокировка по хешам не работает
Из 185 хешей в приложении iVerify к DarkSword на VirusTotal есть только 38 (21 %); на MalwareBazaar — ни одного по тегу, на Hybrid Analysis — ни одного. Шесть из 38 найденных имеют ноль детектов. Кит пересобирается под каждый хост, публичные хеш-листы отстают на месяцы. Неизменным с марта остался только rce_module.js.
Картина по экосистеме это подтверждает. В приложении iVerify 229 пар «приманка — бэкенд»; имена — pinyin-салат вокруг китайских брендов, казино-домены cgwin*, крипта и фейковые «iOS-сервисы». 94 приманки (41 %) грузят кит с одного хоста, cf.r5dz2dz88wuideu[.]xyz, ещё 14 — с nuih22[.]cc. Около половины «17 000 доменов» — одноразовые сайты-приманки для одного-двух общих серверов доставки. Это платформа, а не толпа.
Обнаружение следует строить по артефактам, сетевому поведению и строкам кода — ниже.
Атрибуция
Со средней уверенностью мы оцениваем, что P7 и кластер qqtime — работа китайскоязычной финансово мотивированной группы, которая держит сервис доставки эксплойтов для нескольких распространителей. Основания: приманки казино и крипты для китайскоязычной аудитории; функциональность импланта сосредоточена на краже seed-фраз и связки ключей; коды каналов и в загрузчике, и в импланте; телеметрия посетителей, характерная для брокеров трафика; китайские комментарии в страницах доставки; одноразовые домены, зарегистрированные через Gname и GoDaddy и использующие сервисы Cloudflare, CloudFront и Alibaba; признаков причастности этих компаний к операции нет.
Признаков участия государства в P7 мы не видим. Тезис «вредонос под iOS редок, значит, за ним государство» после утечек Coruna и DarkSword больше не работает: полные iOS-цепочки стали товаром, и iVerify фиксирует следы заражения на 5 % устройств, оставшихся на уязвимых версиях. Инструментом государственного уровня здесь является только сама эксплойт-цепочка — до утечки ею пользовались три заказчика шпионского профиля. Её исходный разработчик публично не установлен. P7 построен поверх утечки, поэтому связь его авторов с разработчиками DarkSword этим анализом не подтверждается и не опровергается.
Поправка к ранним публикациям о кампании TA446
В ряде мартовских публикаций о кампании TA446 static.cdncounter[.]net и sqwas.shapelie[.]com описывались как «исходная инфраструктура DarkSword (UNC6748)». По данным GTIG это инфраструктура UNC6353: sqwas.shapelie[.]com — сервер эксфильтрации GHOSTBLADE. UNC6748 — другой кластер (Саудовская Аравия, GHOSTKNIFE). TA446 переиспользовал утёкший кит UNC6353 вместе с его сервером эксфильтрации как есть; это две разные группы, связь между ними — через утечку, а не операционная. Кроме того, GHOSTBLADE — обозначение GTIG, а не Proofpoint, как иногда указывалось.
Детектирование
Артефакты на устройстве
Пути живут до перезагрузки или очистки и видны в sysdiagnose или образе файловой системы:
Путь | Кто пишет | Содержимое |
|---|---|---|
|
| Расшифрованные элементы keychain в JSON; маркер готовности |
|
| Журнал конвейера расшифровки |
|
| Трасса упаковки кошельков («[WALLET-HQ]») |
|
| Результат извлечения keystore imToken |
|
| Копии базы Apple Notes |
|
| База keychain и keybag’и (наследие GHOSTBLADE) |
|
| Вывод |
В браузере после атаки остаются ключи localStorage, по которым видно, какое развёртывание посетило устройство: lab_device_uuid, __ds_inflight_worker, __ds_skip_workers (сборка gotoiphone) и _x_pe_done, _x_try, _x_ok (сборка mzpo30).
Сеть
HTTP/1.0 POST с iPhone на
/beaconкаждые 15 секунд, а также на/a,/event,/u,/nb,/p,/warтого же хоста; multipart boundary------HqBound; JSON-поляlhu,source(32-символьный hex — код канала),channel_code.TLS-сессии из кода в контексте SpringBoard без проверки цепочки сертификатов к свежим доменам
.cc/.cam/.lolза Cloudflare.На стороне веба: скрытые iframe на
*/group.html, скриптыrce_loader.js,ds_rce_loader.js,routers.js, запросы на*/apiс параметромchannelcode, периодические POST сvisitorIp/deviceVersion/sourceUrl.
Домены ротируются еженедельно, а протокол за три сборки не изменился — оповещения стоит настраивать по шаблону поведения, а не по спискам доменов.
YARA
Правило GTIG G_Hunting_DarkSwordExploitChain_ImplantLib_FilePaths_1 срабатывает на бандл pe_main.js P7 (webpack-пути в нём сохранились), но не на извлечённый агент. G_Datamine_GHOSTBLADE_1 на P7 не срабатывает вообще. Мы подготовили два черновых правила для поиска угроз (проверены на одной сборке P7, ноль ложных срабатываний на GHOSTBLADE, сентябрьском ките и страницах доставки; перед блокирующим режимом — перепроверить на других сборках):
P7_DarkSword_C2Agent_Strings— строкиp7_(более 20 вхождений),------HqBound,/beacon,/war,/nb,keychain_c2_dump,p7_debug.log,c2_wallet_debug.log,_hq_notestore,ios_disk_scan.txt,wallet_scan,memo_scan,execute_command,disk_scan,iPhone OS 18_5 like Mac OS X.P7_DarkSword_LocalStorage_Markers(страницы доставки) —lab_device_uuid,__ds_inflight_worker,__ds_skip_workers,_x_pe_done,cecd08aa6ff548c2,obChTK,ds_rce_loader.js,34ef644ff217a50beadde64dc8e23a7d.
Полный текст правил приведён в машиночитаемом приложении к этому материалу.
Индикаторы компрометации (выборка)
Помеченные «iVerify» повторены из публикации вендора для полноты.
Тип | Значение | Роль |
|---|---|---|
Домен |
| C2 P7, сборка 3 |
Домен |
| Приманка P7, сборка 3 (казино) |
Домен |
| C2 P7 (iVerify) |
Домен |
| C2 P7 (iVerify) |
Домен |
| Доставка DarkCoruna (iVerify) |
Домен |
| Доставка P7 (iVerify) |
Домен |
| Хост инжектора |
Домен |
| Телеметрия посетителей |
Домен |
| Приём отчётов загрузчика Coruna |
Домен |
| Хосты загрузчика Coruna (qqtime) |
Домен |
| Роутер DarkCoruna («foxtimes») |
URL |
| Эксфильтрация keychain и кошельков |
URL |
| Инжектор |
URL |
| Телеметрия |
IP |
| Alibaba Cloud: gotoiphone[.]com, js.gotoiphone[.]com, goo[.]wang (контекст) |
SHA-256 |
|
|
SHA-256 |
|
|
SHA-256 |
|
|
SHA-256 |
|
|
SHA-256 |
| Загрузчик Coruna, cdn.gotoiphone |
SHA-256 |
|
|
Строка |
| Код канала P7, сборка 3 |
Строка |
| channelcode qqtime (pages[.]dev) |
Строка |
| Соль загрузчика Coruna во всех сборках qqtime |
Адрес 47[.]79[.]48[.]200 — общий эндпоинт Alibaba OSS, через него работают десятки посторонних доменов. Его блокировать нельзя; cryptonewstrack[.]com — приманка неустановленного статуса, не C2.
Выводы и рекомендации
Обновляйтесь. Как минимум до iOS 18.7.3, а в ветке iOS 26 — до 26.3 или новее: именно 26.3 закрывает последнюю из шести уязвимостей. Устройства на iOS 13–17.2.1 уязвимы для Coruna-половины страницы DarkCoruna, устройства на iOS 18.4–18.7.2 — для DarkSword-половины.
Lockdown Mode для пользователей с высоким риском: он закрывает точки входа в JavaScriptCore, которые используют обе цепочки.
Хантинг на управляемых устройствах по путям из таблицы артефактов и ключам localStorage. Достаточно sysdiagnose.
В сети оповещать по шаблону HTTP/1.0 beacon и boundary
------HqBound, а не на списки доменов.Хеш-фиды по этому семейству — низкой ценности: каждое развёртывание приносит уникальные файлы эксплойта.
Владельцам криптокошельков на iPhone: если устройство заходило на подобные страницы, считайте скомпрометированными все seed-фразы и keystore в imToken, TokenPocket, Trust Wallet, Bitget, Phantom, Solflare, Uniswap, Tonhub, Bitpie и TronLink. Переводите средства с чистого устройства.
Главный вывод шире P7: цепочка, которая полгода назад была инструментом трёх заказчиков шпионского профиля, теперь — модуль партнёрской программы с кодами каналов и казино-приманками. Логика «мы не цель для государства, нас это не касается» для iPhone больше не работает.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.