В середине мая 2026 года аналитики зафиксировали свежую волну атак, в которой злоумышленники маскируют вредоносное ПО под архивы телеметрии Windows. Два файла с именами WindowsTelemetry.zip и WindowsTelemetry.rar, впервые замеченные 19 мая, содержат многоступенчатую цепочку заражения, включающую подгрузку DLL, отключение Microsoft Defender, использование уязвимого драйвера и запуск трояна удалённого доступа. Кампания получила рабочее название PoisonX - этот тег был присвоен образцам на платформе MalwareBazaar. Несмотря на то, что название PoisonX ранее ассоциировалось с другими семействами вредоносных программ (Ailurophile Stealer, MrAnon Stealer), в данном случае речь идёт об уникальной разработке: в полученных образцах не найдено общих фрагментов кода с прежними версиями.
Описание
На первый взгляд архивы выглядят безобидно: внутри лежит легитимный исполняемый файл Microsoft dashost.exe, который в обычных условиях загружает библиотеку VERSION.dll. Однако в том же каталоге расположена подменённая VERSION.dll, содержащая вредоносный код. При запуске dashost.exe операционная система по стандартному алгоритму поиска DLL подхватывает локальную версию библиотеки - так срабатывает классическая техника подгрузки DLL. Вредоносная VERSION.dll расшифровывает собственные строки с помощью простой операции XOR, затем считывает файл scheduler.cache, применяет к нему побайтовое XOR-преобразование с изменяющимся ключом, загружает полученный код в память и передаёт ему управление.
Декодированный файл scheduler.cache представляет собой 64-разрядный планировщик, который выполняет сразу несколько функций: обеспечивает закрепление в системе, устанавливает персистентность через службы и автозагрузку, отключает защитные механизмы Windows, загружает собственный уязвимый драйвер и запускает полезную нагрузку - троян удалённого доступа. Планировщик создаёт папку развёртывания по пути ProgramData\Microsoft\WindowsTelemetry и копирует туда все компоненты. Он регистрирует службы "WinHealthSvc" и "Windows Diagnostics Service", а также добавляет запись в ветку Run реестра. Для предотвращения повторного запуска используются два мьютекса - на уровне системы и пользователя.
Перед тем как приступить к работе с драйвером, планировщик целенаправленно отключает Microsoft Defender. Он добавляет исключения для каталога развёртывания, отключает защиту в реальном времени, меняет политики отправки образцов в облако и отключает уведомления центра безопасности. В качестве запасного варианта используется PowerShell-команда Add-MpPreference, если прямые манипуляции с реестром не срабатывают.
Ключевой технический приём в этой атаке - использование уязвимого драйвера, который злоумышленники несут с собой. Эта техника известна как BYOVD (Bring Your Own Vulnerable Driver - принеси свой уязвимый драйвер). Планировщик несёт внутри себя зашифрованный образ драйвера GLCKIo/WinIo, подписанного цифровой подписью 2014 года. Драйвер создаёт устройство \Device\GLCKIo и предоставляет набор IOCTL-команд (кодов управления вводом-выводом) для прямого доступа к портам ввода-вывода, отображения физической памяти и выполнения инструкций rdmsr/wrmsr. Планировщик отключает список блокировки уязвимых драйверов в реестре, записывает драйвер на диск, создаёт и запускает службу. Затем он перечисляет загруженные модули ядра, находит ntoskrnl.exe, получает адреса экспортируемых функций, отвечающих за уведомления о создании процессов, потоков и загрузке образов, и с помощью драйвера обнуляет соответствующие callback-записи (функции обратного вызова). После этого продукты безопасности, полагающиеся на эти callback-функции, перестают получать уведомления о действиях вредоносного кода, оставаясь полностью слепыми к атаке.
После завершения этапа с драйвером планировщик загружает файл cache.db, расшифровывает его тем же методом и запускает экспортируемую функцию StartPayload, передавая управление самому трояну удалённого доступа.
Извлечённый троян - это 64-разрядная программа, работающая поверх сырого TCP и имеющая собственный протокол взаимодействия с командным сервером. C2-адрес (командный сервер) - 101.32.190[.]202:8080. Пассивный анализ показал, что IP находится в Гонконге, принадлежит инфраструктуре Tencent (AS132203). На этом же хосте открыты порты SMB, RDP и WinRM, что может указывать на использование Windows Server 2019, однако порт 8080 Shodan не видит, вероятно, он открывается только по запросу.
Протокол передачи данных использует 12-байтовый заголовок с магической последовательностью "10FX", длиной полезной нагрузки и типом пакета. Среди типов пакетов обнаружены эхо-ответ, выполнение команд оболочки, передача бинарных данных, JSON-задач, загрузка зашифрованных плагинов и организация SOCKS5-туннеля. После подключения троян отправляет JSON-блок регистрации, запускает поток контрольных сигналов и входит в цикл приёма команд. При обрыве соединения он переподключается через пять секунд.
Встроенный набор JSON-задач включает управление процессами (запуск, завершение, заморозка), работу со службами, управление окнами, сбор информации о системе (установленное ПО, сетевые соединения, автозагрузка), снятие снимков экрана (через GDI/GDI+), а также самозамну через замену исполняемого файла и смену адреса C2. Некоторые функции, например работа с рабочим столом, перехват нажатий клавиш, крипто-подмена адресов, очистка следов и повышение привилегий, реализованы через систему плагинов, которые должны быть загружены отдельно. В проанализированных образцах ни одного плагина не обнаружено, что может говорить о том, что они доставляются позднее или по запросу оператора.
Особого внимания заслуживает встроенная поддержка SOCKS5-туннеля. Она позволяет злоумышленникам использовать заражённую машину в качестве прокси, перенаправляя через неё трафик к другим целям. Туннелирование мультиплексируется поверх существующего соединения с C2, что делает его менее заметным для сетевого мониторинга.
Данная кампания демонстрирует высокую степень технической подготовки авторов. Использование легитимного бинарного файла для DLL-подгрузки, отключение Defender на уровне реестра и PowerShell, а также применение BYOVD с последующим удалением kernel-коллбэков - это методы, которые ранее встречались в атаках APT-групп. В отчёте образцы классифицируются как Win64.Trojan.Midie и Win64.Trojan.Ravartar, хотя в базах Malpedia таких имён пока нет. Рабочее название PoisonX - это, скорее, условный тег аналитиков, а не устоявшееся имя семейства.
Последствия успешной атаки могут быть серьёзными: злоумышленник получает полный удалённый контроль над системой, может выполнять команды, красть данные, перехватывать нажатия клавиш, делать скриншоты экрана, использовать заражённый компьютер как точку входа во внутреннюю сеть. Отключенный антивирус и удалённые callback-функции безопасности делают обнаружение особенно сложным. Специалистам по информационной безопасности рекомендуется обращать внимание на появление необычных архивов с именем WindowsTelemetry, а также на активность процессов dashost.exe, запущенных не из системных каталогов. В корпоративных средах стоит усилить политики блокировки BYOVD-драйверов и настроить мониторинг на попытки отключения защиты Windows.
Индикаторы компрометации
IPv4
- 101.32.190.202
IPv4 Port Combinations
- 101.32.190.202:8080
SHA256
- 0ea1335fefc490622dae07b1a5936a539fa4152f89b64f4b270c8e23846deba6
- 0f841b7bddf9788589fce191bb3e7f9f52ec76adb67ff8c360618df8745ee320
- 0fb45474ca58bd67220f79b0e3b07f940270c371ba56e27d3e2b99bf4dbb5174
- 38c18db050b0b2b07f657c03db1c9595febae0319c746c3eede677e21cd238b0
- 62431e499db7c6a02e93c5f9c79fbcff954144db1b016695d3f34f30c89d0b44
- b892981af3ca699d13f07ddcf75c2df62c1543b071278b4cc1ac0993d8b9dc01
- c07573810f5f4578315681ca9108ada8a56eefc1b4786b4e93b54b7abf4b028c
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | rule PoisonX_WindowsTelemetry { meta: id = "4D836ABE06CF42568E2EE4" fingerprint = "663a4ef0fbe353750e5950c91c9de20df0e7fdfa33e0921b91cbce54df5d9929" version = "2.0" date = "2026-05-19" modified = "2026-05-19" status = "RELEASED" sharing = "TLP:CLEAR" source = "https://github.com/kirkderp/yara" author = "derp.ca" description = "PoisonX WindowsTelemetry case rule for VERSION.dll loader, rolling-XOR cache blobs, decoded BYOVD scheduler, and decoded 10FX RAT core." category = "MALWARE" malware = "POISONX" malware_type = "RAT" mitre_att = "T1574.002" reference = "https://github.com/kirkderp/yara" triage_score = 10 triage_description = "PoisonX WindowsTelemetry chain with sideload loader, rolling-XOR cache blobs, BYOVD scheduler, and 10FX RAT core." yarahub_uuid = "4d836abe-06cf-4256-8e2e-e4145fdddc29" yarahub_license = "CC0 1.0" yarahub_rule_matching_tlp = "TLP:WHITE" yarahub_rule_sharing_tlp = "TLP:WHITE" yarahub_reference_md5 = "b327aa9db2451507af259642ae840bdc" strings: $ldr_pdb = "xml_loader.pdb" ascii $ldr_dll = "xml_loader.dll" ascii $ldr_cache = "scheduler.cache" ascii $ldr_encoded_cache = "z2)%)./8%>3(zscheduler.cache" ascii $raw_seed_29_hdr = { 29 64 70 BB 2C 2E 2E 2F 30 35 32 33 34 CA C9 37 38 81 3A 3B 3C 3D 3E 3F 40 01 42 43 44 45 } $raw_seed_4a_hdr = { 4A 07 11 DC 4D 4D 4F 50 51 56 53 54 55 A9 A8 58 59 E2 5B 5C 5D 5E 5F 60 61 22 63 64 65 66 } $code_sch_export_stub = { 48 83 EC 38 49 89 D0 48 8D 44 24 34 83 20 00 48 89 44 24 20 BA 44 20 10 80 4D 89 C1 E8 ?? ?? ?? ?? 90 48 83 C4 38 C3 } $code_sch_dllmain = { 56 48 83 EC 20 48 89 CE FF 15 ?? ?? ?? ?? 85 C0 75 1D E8 ?? ?? ?? ?? 48 8B 0D ?? ?? ?? ?? BA 8D 42 9E D2 E8 ?? ?? ?? ?? 48 } $sch_persist = "\\Microsoft\\WindowsTelemetry" ascii $sch_service = "WinHealthSvc" ascii $sch_blocklist = "VulnerableDriverBlocklistEnable" ascii $sch_cb_process = "PsSetCreateProcessNotifyRoutine" ascii $sch_cb_thread = "PsSetCreateThreadNotifyRoutine" ascii $sch_cb_image = "PsSetLoadImageNotifyRoutine" ascii $sch_byovd_log = "[byovd] driver blocklist disabled" ascii $sch_startpayload = "StartPayload export not found" ascii $code_rat_plugin_load = { 41 57 41 56 41 55 41 54 55 57 56 53 48 81 EC 38 02 00 00 48 8D 05 ?? ?? ?? ?? 8B B4 24 A0 02 00 00 48 85 C9 44 89 C5 49 89 CD 49 89 D6 48 0F 45 C1 } $code_rat_process_data = { 41 57 41 56 41 55 41 54 55 57 56 53 48 83 EC 78 4D 89 C4 45 8B 00 49 89 CD 48 89 D5 41 83 F8 0B 0F 8E ?? ?? ?? ?? 48 8D 35 ?? ?? ?? ?? } $code_rat_json_get = { 41 57 41 56 41 55 41 54 55 57 56 53 48 81 EC D8 00 00 00 0F 11 74 24 70 0F 11 BC 24 80 00 00 00 44 0F 11 84 24 90 00 00 00 } $rat_proto = "10FX" ascii $rat_task_shell = "SHELL_EXEC" ascii $rat_task_service = "CONTROL_SERVICE" ascii $rat_task_window = "CONTROL_WINDOW" ascii $rat_task_socks = "SOCKS5_START" ascii $rat_task_update = "SELF_UPDATE_PAYLOAD" ascii $rat_plugin_entry = "PluginEntry" ascii $rat_plugin_load = "LoadEncrypted: name=" ascii $rat_plugin_cache = "%s\\plugin.dat" ascii $rat_plugin_req = "{\"plugin\":\"%s\"}" ascii condition: ( (filesize == 355420 or filesize == 557230) and any of ($raw_seed_*) ) or ( uint16(0) == 0x5A4D and ( ( filesize < 20KB and pe.is_dll() and pe.machine == pe.MACHINE_AMD64 and all of ($ldr_*) ) or ( filesize > 300KB and filesize < 400KB and pe.is_dll() and pe.machine == pe.MACHINE_AMD64 and pe.exports("SetSuspendState") and 1 of ($code_sch_*) and $sch_blocklist and 2 of ($sch_cb_*) and 2 of ($sch_persist, $sch_service, $sch_startpayload, $sch_byovd_log) ) or ( filesize > 500KB and filesize < 600KB and pe.is_dll() and pe.machine == pe.MACHINE_AMD64 and pe.exports("StartPayload") and 2 of ($code_rat_*) and $rat_proto and 4 of ($rat_task_*) and 2 of ($rat_plugin_*) ) ) ) } |