Хакеры, связанные с КНДР, усложнили кампанию XCTDH, превратив обычные транзакции Ethereum в канал передачи адресов управляющих серверов. Новый механизм HashHiding кодирует IP-адрес и порт прямо в адресе получателя перевода. Заражённому компьютеру не требуется домен, смарт-контракт или заранее известный адрес сервера. Чтобы изменить инфраструктуру, оператору достаточно отправить новую транзакцию.

Адрес Ethereum занимает 20 байт. Вредонос читает первые шесть байт как четыре компоненты IPv4-адреса и номер порта. Последовательность B5 D6 95 94 превращается в 181.214.149.148, а следующие два байта 01 BB дают порт 443. Остальная часть адреса служит для дополнительных данных и заполнения. Сам адрес получателя используется только для передачи информации; у атакующих нет приватного ключа к нему.

Большинство отправленных транзакций не содержали ни одного wei, лишь несколько передавали по 150 wei. Вредоносного кода внутри транзакции нет. Для внешнего наблюдателя это выглядит как обычный перевод, смысл раскрывается только после расшифровки заражённой программой.

Подобный метод раньше назывался NullReceiver и описан в августе 2026 года. Анализ блокчейна показал, что операторы XCTDH начали применять эту схему раньше публичного раскрытия. Первый обнаруженный сигнал датирован 23 июня. С 23 июня по 21 сентября один управляющий кошелёк отправил 2 655 транзакций с интервалом около 49 минут в среднем.

За три месяца хакеры четыре раза меняли закодированный адрес управляющего сервера. Сначала вредонос обращался к 23.27.20.187 через порты 80 и 443, затем инфраструктура переехала на 181.214.149.147:443 и 181.214.149.148:443. Для заражённых машин переход почти незаметен: модуль регулярно просматривает свежие блоки Ethereum, находит нужную транзакцию, извлекает новый IP и работает уже с новым сервером.

HashHiding встроен в JavaScript-модуль _Z. После снятия двух уровней обфускации он сокращается до примерно 8,8 КБ рабочего кода. Модуль выбирает один из публичных Ethereum RPC-сервисов, узнаёт номер последнего блока, просматривает транзакции и ищет заданный фрагмент адреса отправителя. Обнаружив подходящую запись, код извлекает адрес управляющего сервера, запрашивает путь /boot и запускает полученный Node.js-код скрытым процессом.

Главное преимущество этой схемы для атакующих — отказоустойчивость. Вредонос одновременно использует три независимых канала: жёсткий IP-адрес, старую цепочку XCTDH через TRON, Aptos и BNB Smart Chain, теперь ещё Ethereum. Все каналы работают параллельно, поэтому блокировка одного IP или RPC-сервиса не разрывает управление заражённой системой.

Предыдущие версии XCTDH уже использовали блокчейны для доставки компонентов. TRON и Aptos служили указателями на транзакции BNB Smart Chain, где в calldata хранился зашифрованный JavaScript. В сентябрьской версии архитектура расширилась до четырёх блокчейнов: Ethereum передаёт адрес управляющего сервера, TRON и Aptos помогают находить нужные записи, BNB Smart Chain хранит вредоносные полезные нагрузки.

В цепочку входит троян DEV#POPPER.js размером около 2 500 строк Node.js-кода. Он записывает нажатия клавиш, отслеживает буфер обмена, запускает командную оболочку и выполняет удалённый код. Вторая ветка атаки устанавливает Python 3.13 и 7-Zip, затем загружает OmniStealer. Стилер охотится за данными браузеров, менеджеров паролей, облачных сервисов и 153 целями, связанными с криптовалютными кошельками.

Точка входа знакома по кампании Contagious Interview. Северокорейские операторы рассылают фальшивые предложения о работе, направляют разработчиков в заражённые GitHub-репозитории или предлагают установить вредоносные npm-пакеты. После запуска проекта скрытый загрузчик получает дальнейшие компоненты через блокчейн и разворачивает полный набор инструментов для удалённого доступа и кражи данных.

Новый подход отличается от EtherHiding. EtherHiding прячет код или ссылки в данных транзакций и смарт-контрактах, поэтому защитники могут искать характерные обращения к контрактам и необычное содержимое calldata. HashHiding не требует ни контракта, ни поля с полезной нагрузкой. Управляющий адрес скрывается в самом адресе получателя, и новый C2 можно развернуть без изменения вредоносной программы.

Для обнаружения активности исследователи предлагают отслеживать изменения адресов получателей у сигнального кошелька, запросы eth_getBlockByNumber к публичным Ethereum RPC-сервисам с последующими подключениями к необычным IP-адресам, а также процессы Node.js с характерными параметрами запуска. Главным индикатором остаётся кошелёк 0x33ff3edaf55a8e03dcbc7cb40d498a49cd499891. Смена управляющего IP требует одной новой транзакции, поэтому обычные списки блокировки адресов быстро устаревают.