Специалисты по информационной безопасности зафиксировали сразу два образца вредоносного программного обеспечения ValleyRAT, появившихся на платформе MalwareBazaar с разницей в несколько дней. Оба экземпляра нацелены на китайскоязычных пользователей и распространяются через троянизированное программное обеспечение, однако их командная инфраструктура демонстрирует принципиально разные подходы к организации каналов управления.
Описание
Первый образец, получивший название malware64.dll, представляет собой модуль связи, реализующий протокол KCP (надёжный транспортный уровень на базе UDP, популярный в китайском игровом и туннелирующем программном обеспечении). Всё чаще злоумышленники из китайских APT-группировок (групп целевых атак) используют KCP благодаря его свойствам обхода NAT и меньшей заметности по сравнению с TCP. Сервер управления и команд (C2) этого образца расположен по адресу 103.215.77[.]17:4488, причём хостинг-провайдером выступает гонконгская компания LANLIAN INTERNATIONAL HOLDING GROUP LIMITED.
Самый показательный артефакт - имя импортируемого родительского модуля: "上线模块.dll", что в переводе с китайского означает "DLL модуля выхода в онлайн". Подобная внутренняя маркировка на китайском языке является характерным признаком ValleyRAT и сопутствующей экосистемы загрузчиков. Согласно данным VirusTotal, с этим IP-адресом взаимодействуют более 78 образцов вредоносного ПО, а сам сервер остаётся активным на момент исследования. Обнаружили исследователи и то, что на нём открыт порт 5985 (WinRM - служба удалённого управления Windows), что указывает на скомпрометированный или контролируемый злоумышленниками хост под управлением операционной системы Microsoft.
Второй образец представляет собой гораздо более сложный загрузчик, написанный на языке Rust и маскирующийся под "Microsoft OneDrive Sync Engine". Исполняемый файл размером 263 КБ несёт в себе зашифрованное полезное вложение второй стадии, а его командная инфраструктура принципиально отличается от первого случая. Адрес C2 - не рядовой IP или домен одноразового хостинга, а v52-83fbf297.govroam.cf.ac[.]uk, то есть имя хоста в сети GovRoam Кардиффского университета (Уэльс, Великобритания). Шаблон имени v52 с шестнадцатеричным суффиксом 83fbf297 характерен для устройств, прошедших аутентификацию по протоколу 802.1x или через VPN.
Фактически это означает, что злоумышленники скомпрометировали устройство исследователя, студента или государственного служащего, подключённого к сети GovRoam университета, и использовали его в качестве ретранслятора C2. Университетские сети особенно привлекательны для подобных схем: их IP-диапазоны широко включены в белые списки, точки подключения по GovRoam или eduroam часто меняются, что затрудняет атрибуцию, а мониторинг обычно сосредоточен на борьбе с перегрузкой каналов, а не на выявлении сигналов командных серверов. На момент публикации все три порта C2 (8044, 9044, 98) закрыты, что позволяет предположить, что устройство было очищено или отключено от сети.
Rust-загрузчик реализует многоуровневую систему обхода песочниц, включающую проверку имени пользователя на соответствие известным аналитическим учётным записям (sandbox, malware, virus, test, sample), детектирование переменных окружения, характерных для VMware, VirtualBox и Hyper-V, а также сканирование файловой системы на наличие инструментов отладки и мониторинга. При обнаружении любого признака анализа выполнение программы молча прекращается. Встроенная полезная нагрузка зашифрована алгоритмом AES-256-CBC и после успешного прохождения всех проверок расшифровывается, отображается в память и исполняется.
Расшифрованный код представляет собой 107-килобайтную MSVC C++ DLL - ядро ValleyRAT. Внутри обнаружены RTTI-классы CKernelManager (отвечающий за диспетчеризацию команд, закрепление в системе и управление модулями) и CTcpSocket (реализующий связь с C2). Китайские символы в строках конфигурации подтверждают принадлежность к китайскоязычной группировке.
Схождение двух принципиально разных типов инфраструктуры - активного C2 в Гонконге и скомпрометированной конечной точки британского университета - иллюстрирует, как современные APT-группировки комбинируют одноразовые академические ресурсы с постоянным коммерческим хостингом. Когда "одноразовый" ретранслятор в Кардиффе выходит из строя, основная инфраструктура кампании остаётся нетронутой.
Полученные индикаторы компрометации и YARA-правила для обнаружения уже опубликованы в открытых источниках. Специалистам по безопасности рекомендуется обратить особое внимание на активность с использованием протокола KCP и проверить свои сети на предмет взаимодействия с указанным гонконгским C2, а также на наличие устройств, подключающихся к доменам вида *.govroam.cf.ac.uk, что может указывать на использование скомпрометированных академических ретрансляторов.
Индикаторы компрометации
IPv4
- 103.215.77.17
- 131.251.242.151
IPv4 Port Combinations
- 103.215.77.17:4488
- 103.215.77.17:5985
Domains
- v52-83fbf297.govroam.cf.ac.uk
SHA256
- 4cf32bd41a17e51520ddd0b0aea06e9792ceb9c3dcb039f166324e6c73c7a65c
- 7d48049da5a7f33f4cc6a45a62b2b3a972ffd934403d9cb956c40ff28bfdab9e
- d47aac6bf3946c1fd7b88106af11dfd32c7af3d9a72089e40ffef6555c9182ba
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | rule ValleyRAT_RustLoader_CardiffRelay { meta: author = "Breakglass Intelligence" description = "Detects ValleyRAT Rust loader with AES-256-CBC encrypted stage-2" date = "2026-04-20" reference = "https://intel.breakglass.tech/post/valleyrat-cardiff-university-govroam-rust-loader-hong-kong-c2" hash1 = "4cf32bd41a17e51520ddd0b0aea06e9792ceb9c3dcb039f166324e6c73c7a65c" hash2 = "d47aac6bf3946c1fd7b88106af11dfd32c7af3d9a72089e40ffef6555c9182ba" strings: $pdb = "loader.pdb" ascii $onedrive = "Microsoft OneDrive Sync Engine" wide $campaign = "x9y8z7w6v5u4t3s2r1q0p9o8n7m6l5k4" ascii $govroam = "govroam" ascii wide $cardiff = "cf.ac.uk" ascii wide $module_cn = { 0A 4E BF 7E 6A 6B 2E 00 64 00 6C 00 6C 00 } // 上线模块.dll in UTF-16LE $kcp_init = { 4B 43 50 00 } // "KCP\x00" $rtti_kernel = "CKernelManager" ascii $rtti_socket = "CTcpSocket" ascii condition: uint16(0) == 0x5A4D and filesize < 500KB and ( ($pdb and $onedrive) or ($campaign) or ($govroam and $cardiff) or ($module_cn and $kcp_init) or ($rtti_kernel and $rtti_socket) ) } |