Введение
CoolClient — семейство бэкдоров, связываемое с APT-группой HoneyMyte (также известной как Mustang Panda). Эти бэкдоры применялись в различных кампаниях данной группы по кибершпионажу за организациями в России и странах Азии. Он поддерживает такие функции, как кейлоггинг, перехват данных из буфера обмена, извлечение учетных данных, управление файлами и сбор информации о системе. Кроме того, его функциональность может быть расширена плагинами.
После первого публичного описания CoolClient компанией Sophos в 2022 году и последующего анализа Trend Micro в 2023 году бэкдор продолжил эволюционировать. В 2025 году мы исследовали более новую разновидность CoolClient, в которой появились функции кражи данных из буфера обмена и перехвата HTTP-трафика с целью сбора учетных данных.
Наше актуальное исследование, которое мы проводили в конце 2025 года и в 2026 году, выявило еще один значительный этап эволюции этого семейства. Новейший вариант CoolClient способен устанавливать подписанный драйвер режима ядра в качестве службы Windows и взаимодействовать с ним посредством IOCTL-запросов. Драйвер делает зловред еще менее заметным для обнаружения, скрывая процесс CoolClient, защищая связанные с ним файлы и записи реестра, а также препятствуя их анализу и изменению. Такой подход в целом сопоставим с новыми возможностями работы в режиме ядра, ранее замеченными в ToneShell. При этом драйвер CoolClient предоставляет специальные обработчики IOCTL, с помощью которых бэкдор пользовательского режима может взаимодействовать с ним напрямую.
Мы обнаружили этот обновленный вариант CoolClient и связанный с ним драйвер в ходе атак, затронувших ряд стран Азии, включая Пакистан, Монголию и Мьянму.
Технический анализ
В исследуемой кампании, нацеленной на Мьянму, группа HoneyMyte использовала PlugX в качестве первичного импланта на стадии посткомпрометации для развертывания компонентов CoolClient. Перед развертыванием зловреда злоумышленники добавили в исключения Защитника Windows поддельный каталог установки Windows Defender и переименованный в defender.exe исполняемый файл, необходимый для реализации техники DLL sideloading (загрузки вредоносных DLL-библиотек легитимным приложением).
|
1 2 |
wmic /Node:localhost /Namespace:\\Root\Microsoft\Windows\Defender Path MSFT_MpPreference call Add ExclusionPath="$programfiles\Microsoft\Windows Defender" wmic /Node:localhost /Namespace:\\Root\Microsoft\Windows\Defender Path MSFT_MpPreference call Add ExclusionPath="$programfiles\Microsoft\Windows Defender\defender.exe" |
Затем злоумышленники создали поддельный каталог установки Windows Defender, скопировали в него компоненты CoolClient и переименовали легитимный исполняемый файл Sangfor (обычно называющийся Sang.exe) в defender.exe.
|
1 |
xcopy "$programfiles\Windows Defender\*" "$programfiles\Microsoft\Windows Defender" /a /s /v /e /f |
Закрепление в системе обеспечивалось с помощью задачи планировщика, запускавшей defender.exe с привилегиями SYSTEM при загрузке системы.
|
1 |
schtasks /create /sc onstart /tn "\Microsoft\Windows\Windows Defender Advanced Threat Protection Service" /tr "\"$programfiles\Microsoft\Windows Defender\defender.exe\"" /ru "system" /F |
При запуске defender.exe загружает вредоносную библиотеку libngs.dll, инициируя цепочку выполнения CoolClient, описанную в следующих разделах.
Компоненты CoolClient
Как и в предыдущих вариантах, компонент пользовательского режима последней версии CoolClient полагается на многоэтапную цепочку выполнения, в которой каждому компоненту отведена определенная роль.
| Компонент | Описание |
| defender.exe / Sang.exe | Легитимное приложение Sangfor, используемое для загрузки вредоносной DLL-библиотеки с помощью техники DLL sideloading. |
| libsrapc.dll | Безвредная зависимость, необходимая для нормального запуска приложения Sangfor. |
| libngs.dll | Загрузчик первого этапа, расшифровывающий следующий этап и загружающий его в память. |
| loadcert.ini | Зашифрованная DLL-библиотека с основными функциями CoolClient, включая обработку команд, внедрение в процессы, развертывание драйвера и закрепление в системе (второй этап). |
| cert.ini | Имплант последнего этапа, выполняющий роль бэкдора и отвечающий за связь с командным сервером. |
| time.ini | Конфигурационный файл CoolClient. |
Наш предыдущий анализ CoolClient был сосредоточен главным образом на импланте последнего этапа (main.dat), в том числе на поддерживаемых командах бэкдора и механизме плагинов, тогда как загрузчик первого этапа (libngs.dll) и компонент второго этапа (loader.dat) были рассмотрены лишь кратко. В последнем варианте бэкдора CoolClient файлы loader.dat и main.dat были переименованы в loadcert.ini и cert.ini соответственно. В этой статье мы вернемся к ранним этапам цепочки выполнения, уделив основное внимание компоненту второго этапа и новому драйверу режима ядра, который наделяет CoolClient функциональностью руткита.
Первый этап: libngs.dll
Цепочка выполнения начинается с того, что легитимное приложение Sangfor (defender.exe или Sang.exe) загружает вредоносную DLL libngs.dll с использованием техники DLL sideloading. Это приложение использовалось для запуска загрузчика первого этапа и в предыдущих вариантах CoolClient.
Чтобы библиотека выглядела легитимной, libngs.dll экспортирует множество фиктивных функций. Каждый экспорт вызывает функцию OutputDebugStringA, передавая ей имя соответствующей фиктивной функции, после чего немедленно вызывает ExitProcess. Иными словами, эти функции не имеют иного функционального назначения, кроме имитации таблицы экспорта легитимной DLL.
Сам вредоносный код выполняется из функции DllMain (DllEntryPoint). Несмотря на сильную обфускацию потока управления путем объединения переходов в специальные управляющие блоки (control flow flattening) и добавления многочисленных безусловных переходов, в конечном итоге эта функция выполняет простую задачу: загружает, расшифровывает и запускает зашифрованную DLL второго этапа — loadcert.ini.
Загрузчик резолвит адреса необходимых функций Windows API, считывает файл loadcert.ini в память и расшифровывает его с помощью повторяющейся ключевой XOR-последовательности длиной 0x32 байта, получаемой путем преобразований начального значения 0xA4. После расшифровки DLL загружается непосредственно в память, после чего управление передается коду loadcert.ini.
Второй этап: loadcert.ini (до внедрения в synchost.exe)
DLL-библиотека второго этапа loadcert.ini отвечает за подготовку среды выполнения перед перемещением вредоносного кода в целевой процесс. Сначала она определяет контекст выполнения, проверяя, запущена ли она в процессе synchost.exe.
Если DLL работает в контексте исходного процесса (например, Sang.exe), она выполняет первоначальную настройку, включая закрепление в системе, обход UAC, изменение реестра и внедрение кода в другой процесс.
Если DLL уже выполняется внутри synchost.exe, она выбирает альтернативную ветвь выполнения: расшифровывает time.ini, развертывает драйвер режима ядра и загружает имплант последнего этапа cert.ini.
Обработчик команд
Обработчик команд в целом не претерпел изменений по сравнению с предыдущими вариантами CoolClient, за одним заметным исключением: теперь вредоносное ПО внедряется в процесс synchost.exe вместо write.exe.
Для управления выполнением предусмотрены три параметра командной строки:
| Параметр | Назначение |
| install | Проведение первоначальной настройки, включающей закрепление в системе, проверку привилегий и подготовку к дальнейшему выполнению с внедрением кода. |
| work | Внедрение в процесс synchost.exe и выполнение основных операций второго этапа, включая развертывание драйвера и загрузку третьего этапа. |
| passuac | Продолжение выполнения после повышения привилегий. |
Если параметр не указан, зловред запускает новый процесс Sang.exe с параметром install с помощью функции CreateProcessW.
Закрепление в системе через автозапуск
При запуске с параметром install CoolClient создает запись для автозапуска в следующем разделе:
|
1 |
HKCU\Software\Microsoft\Windows\CurrentVersion\Run |
Параметр реестра с именем goopdate запускает Sang.exe или defender.exe (в зависимости от способа развертывания) с параметром work при каждом входе пользователя в систему.
Внедрение в процесс synchost.exe
После создания записи автозапуска в реестре CoolClient расшифровывает loadcert.ini с помощью повторяющейся ключевой XOR-последовательности длиной 0x32 байта, получаемой из жестко заданного базового ключа 0x4D.
Затем расшифрованная DLL внедряется в специально созданный для этого приостановленный экземпляр процесса synchost.exe. Зловред выделяет память в целевом процессе, записывает расшифрованную полезную нагрузку, перенаправляет контекст потока на внедренный код, возобновляет выполнение и завершает исходный процесс с помощью ExitProcess.
С этого момента выполнение продолжается исключительно из процесса synchost.exe, где вредоносный код переходит к развертыванию драйвера режима ядра перед загрузкой импланта последнего этапа (cert.ini).
Установка службы
При запуске с параметром install бэкдор CoolClient закрепляется в системе дополнительным способом, регистрируя себя в качестве службы Windows. Перед этим он проверяет, достаточно ли у него прав для доступа к диспетчеру служб Service Control Manager (SCM) и отсутствуют ли запущенные процессы защитного ПО 360 Total Security (360sd.exe, zhudongfangyu.exe или 360desktopservice64.exe).
Если обе проверки завершаются успехом, зловред расшифровывает time.ini, чтобы получить конфигурацию службы, включая ее имя и описание. Затем он проверяет, существует ли служба media_updaten. Если служба обнаружена, зловред останавливает и удаляет ее перед созданием новой.
Новая служба создается с помощью CreateServiceA и настраивается для запуска Sang.exe с параметром work. После этого вредоносное ПО запускает службу, выполняя команду sc start media_updaten через WinExec.
Проверка привилегий администратора
Если механизм установки службы не был задействован, CoolClient проверяет наличие административных привилегий у текущего процесса, определяя, входит ли задействованная учетная запись в локальную группу Administrators.
При наличии административных привилегий вредоносное ПО перезапускает себя с параметром passuac, после чего продолжает выполнение оставшейся части цепочки.
Запуск с повышенными привилегиями и обход UAC
Для дальнейшей работы с повышенными привилегиями и скрытия исходного родительского процесса CoolClient использует технику создания процессов через RPC, аналогичную описанной Google Project Zero. Эта техника сочетает создание процесса через RPC с подменой идентификатора родительского процесса (PPID), что позволяет зловреду запустить новый экземпляр самого себя с повышенными привилегиями.
Сначала вредоносное ПО проверяет наличие процесса escanmon.exe. Если процесс запущен, зловред формирует путь к файлу C:\Windows\System32\winver.exe и устанавливает соединение с локальной конечной точкой ncalrpc (201ef99a-7fa0-444c-9399-19ba84f12a1a). Затем он вызывает NdrAsyncClientCall для запуска winver.exe через интерфейс RPC.
После запуска winver.exe CoolClient получает объект отладки этого процесса с помощью NtQueryInformationProcess, отключает отладчик от процесса через NtRemoveProcessDebug и завершает процесс. Полученный объект отладки затем повторно используется на последующих этапах процедуры обхода UAC.
Далее вредоносное ПО запускает computerdefaults.exe, повторяя все шаги создания процесса через RPC. Затем оно привязывает ранее полученный объект отладки к текущему потоку с помощью DbgUiSetThreadDebugObject, ожидает событие создания целевого процесса через WaitForDebugEvent и дублирует дескриптор процесса с помощью NtDuplicateObject, в результате получая дескриптор с полными правами доступа.
Наконец, CoolClient повторно запускает себя командой Sang.exe passuac с помощью CreateProcessW с расширенным списком атрибутов запуска. Используя функцию UpdateProcThreadAttribute, вредоносное ПО задает атрибут PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, указывая продублированный дескриптор процесса в качестве родительского для нового процесса. В итоге новый экземпляр Sang.exe passuac выполняется в контексте с повышенными привилегиями и при этом выглядит так, будто он был запущен доверенным процессом Windows, а не исходным процессом CoolClient.
Второй этап: loadcert.ini (выполнение после внедрения)
После внедрения в synchost.exe библиотека loadcert.ini продолжает выполнение, разворачивая драйвер режима ядра и запуская имплант последнего этапа (cert.ini). При отсутствии административных привилегий она пропускает этап развертывания драйвера и переходит непосредственно к внедрению кода третьего этапа.
Развертывание драйвера режима ядра
Процедура развертывания начинается с расшифровки time.ini. Затем CoolClient проверяет наличие необходимых прав для установки драйвера режима ядра, а именно полного доступа к диспетчеру служб (SCM) и привилегии SeTcbPrivilege.
Если оба условия соблюдены, CoolClient извлекает встроенный в loadcert.ini драйвер, сжатый по алгоритму LZMA, распаковывает его и записывает на диск под именем msagent.sys в том же каталоге, где находится cert.ini, например:
|
1 |
C:\Program Files\Microsoft\Windows Defender\msagent.sys |
Далее вредоносное ПО проверяет, существует ли уже служба с именем msagent. Если служба обнаружена, зловред останавливает и удаляет ее перед созданием и запуском новой службы драйвера, которая загружает компонент режима ядра в операционную систему.
Инициализация драйвера
После загрузки драйвера CoolClient устанавливает с ним связь, открывая устройство \\.\msagent с помощью CreateFileW. Затем компонент пользовательского режима инициализирует драйвер, отправляя три запроса через DeviceIoControl.
| IOCTL | Назначение |
| 0x222120 | Регистрация текущего процесса CoolClient в драйвере. |
| 0x2221E0 | Передача драйверу заданного в настройках IPv4-адреса командного сервера. |
| 0x2220F0 | Регистрация путей в файловой системе и реестре, которые должны быть защищены или скрыты. |
Первый запрос (0x222120) регистрирует текущий процесс CoolClient в драйвере как доверенный. Запрос содержит идентификатор процесса, код операции и флаг, указывающий на доверенный статус процесса: ему разрешено взаимодействовать с защищаемыми файлами, разделами реестра и процессами.
Второй запрос (0x2221E0) передает настроенный злоумышленниками IPv4-адрес командного сервера, извлеченный из time.ini.
Наконец, запрос 0x2220F0 регистрирует в драйвере каталог установки CoolClient (например, C:\Program Files\Microsoft\Windows Defender) и путь к разделу службы в реестре (\Registry\Machine\SYSTEM\CurrentControlSet\Services\media_updaten). Так драйвер будет знать, какие связанные со зловредом файлы и объекты реестра нужно защищать от анализа, изменения или удаления.
В рамках инициализации CoolClient обновляет значение реестра HKLM\SYSTEM\RNG\Wid_H1deF5Dirs, добавляя в него свой каталог установки, если он еще не зарегистрирован. В дальнейшем это значение реестра понадобится драйверу при активации механизмов скрытия и защиты.
Реализация обработчиков этих IOCTL-запросов и соответствующие функции драйвера рассматриваются в разделе, посвященном msagent.sys.
Внедрение cert.ini в процесс
После инициализации драйвера CoolClient переходит к запуску импланта последнего этапа (cert.ini). Перед созданием целевого процесса вредоносное ПО перебирает активные сессии WinStation в поисках подходящей интерактивной пользовательской сессии.
После выбора сессии CoolClient дублирует ее токен доступа, обновляет идентификатор сессии и создает новый процесс synchost.exe с помощью функции CreateProcessAsUserA. Затем расшифрованная DLL-библиотека cert.ini внедряется в приостановленный процесс с использованием описанной ранее процедуры выделения памяти, изменения контекста потока и вызова ResumeThread.
На этом основной этап цепочки выполнения завершается: имплант третьего этапа принимает на себя взаимодействие с командным сервером и выполнение остальных функций бэкдора.
Драйвер msagent.sys
В ходе анализа развернутого драйвера режима ядра был выявлен встроенный путь к PDB-файлу:
E:\work\南京实验室\2024项目\张雪杰云南m\研发\FTool\Tool\x64\Release\FTool.pdb
Этот путь содержит несколько примечательных фрагментов, включая «Nanjing Laboratory» (南京实验室) и «Zhang Xuejie Yunnan m» (张雪杰云南m), которые, вероятно, связаны со средой разработки драйвера. Тем не менее в ходе OSINT-анализа нам не удалось установить связь этих строк с известными организациями, разработчиками или APT-группами.
Драйвер подписан сертификатом, выданным Nanjing Ranyi Technology Co., Ltd., с серийным номером 3E 62 DC 5D 8D 61 2A 26 33 E7 6B DF D6 07 19 DD. Сертификат был действителен с августа 2013 года по сентябрь 2014 года.
Мы выявили несколько более старых вредоносных драйверов, подписанных этим же сертификатом и скомпилированных примерно в 2013 году. Однако доказательств, напрямую связывающих эти образцы с активностью CoolClient, описанной в данной статье, обнаружено не было.
Конфигурация драйвера
В ходе инициализации драйвер загружает свою конфигурацию скрытного режима из раздела реестра \REGISTRY\MACHINE\SYSTEM\RNG. Она определяет, какие системные объекты должны быть скрыты или защищены, и управляет режимом работы драйвера.
Два значения REG_DWORD определяют режим работы драйвера:
| Значение реестра | По умолчанию | Описание |
| Hid_State | 1 | Включает возможности руткита, встроенные в драйвер. |
| Hid_StealthMode | 0 | Управляет дополнительными функциями маскировки, которые используются в отдельных процедурах драйвера. |
Кроме того, драйвер загружает несколько значений REG_MULTI_SZ, определяющих, какие объекты нужно скрыть или защитить.
| Значение реестра | Назначение |
| Wid_H1deF5Dirs | Скрываемые папки |
| Wid_H1deF5Files | Скрываемые файлы |
| Wid_H1deRegKeys | Скрываемые разделы реестра |
| Wid_H1deRegValues | Скрываемые значения реестра |
| Hid_IgnoredImages | Игнорируемые процессы |
| Hid_ProtectedImages | Защищаемые процессы |
В совокупности эти значения реестра определяют, какие пути файловой системы, объекты реестра и процессы контролируются механизмами защиты драйвера.
После загрузки конфигурации драйвер преобразует записи реестра во внутренние референсные структуры, общие для различных компонентов защиты. В дальнейшем на эти структуры ссылаются мини-фильтр файловой системы, обработчики IOCTL-запросов и механизмы обратного вызова при загрузке образов и операциях с реестром, процессами и объектами, чтобы определить, следует ли скрывать, защищать или игнорировать конкретный файл, объект реестра или процесс.
Подготовка к скрытию процессов
Далее драйвер динамически определяет расположение поля ActiveProcessLinks (LIST_ENTRY) в структуре EPROCESS, не полагаясь на заранее заданные смещения. Сначала он проверяет несколько предопределенных смещений и, если ни одно из них не подходит, выполняет линейное сканирование структуры EPROCESS для определения точного смещения. Такой подход позволяет драйверу сохранять совместимость с различными версиями Windows, в которых структура EPROCESS может отличаться.
После определения точного смещения оно сохраняется для дальнейшего использования механизмом скрытия процессов. Чтобы скрывать и восстанавливать процессы по требованию, драйвер использует IOCTL-запросы 0x22219C и 0x2221A0, позволяющие исключать и повторно включать элементы в список активных процессов Windows.
Обратные вызовы для процессов, объектов и загрузки образов
После подготовки структур отслеживания процессов драйвер инициализирует несколько АВЛ-деревьев и заполняет их конфигурационными данными, загруженными из реестра, в частности из Wid_H1deF5Dirs, Wid_H1deF5Files, Wid_H1deRegKeys, Wid_H1deRegValues, Hid_IgnoredImages, Hid_ProtectedImages и Hid_HideImages. АВЛ-деревья позволяют эффективно сопоставлять защищаемые файлы, объекты реестра и отслеживаемые процессы и используются как процедурами обратных вызовов, так и обработчиками IOCTL.
Затем драйвер регистрирует три типа обратных вызовов ядра, которые лежат в основе его механизмов защиты и мониторинга:
- обратные вызовы для объектов через
ObRegisterCallbacks; - обратные вызовы для создания и завершения процессов через
PsSetCreateProcessNotifyRoutineEx; - обратные вызовы для загрузки образов через
PsSetLoadImageNotifyRoutine.

Регистрация обратных вызовов для объектов, процессов и загрузки образов во время инициализации драйвера
После регистрации эти обратные вызовы актуализируют внутренние структуры отслеживания драйвера по мере создания процессов и потоков, а также загрузки образов.
Обратные вызовы для объектов
Для защиты выбранных процессов драйвер регистрирует обратные вызовы объектов процессов (PsProcessType) и потоков (PsThreadType) с помощью ObRegisterCallbacks, задавая значение Altitude («высота»), равное 1203. Эти обратные вызовы перехватывают запросы на открытие дескрипторов процессов и потоков. Если целевой процесс находится под защитой, драйвер ограничивает права доступа запрашивающего процесса, предотвращая такие операции, как завершение целевого процесса, внедрение кода и другие виды манипуляций с ним. В данном образце под защитой находился внедренный код CoolClient, выполняющийся внутри synchost.exe.
Обратные вызовы для процессов и загрузки образов
Драйвер регистрирует обратные вызовы создания и завершения процессов с помощью PsSetCreateProcessNotifyRoutineEx, а также обратный вызов загрузки образов с помощью PsSetLoadImageNotifyRoutine.
При создании процесса имя его образа сравнивается с конфигурационными списками Hid_IgnoredImages, Hid_ProtectedImages и Hid_HideImages. Соответствующие процессы добавляются во внутренние структуры отслеживания драйвера, что позволяет в дальнейшем защищать их, скрывать или управлять ими посредством IOCTL-запросов. При завершении отслеживаемого процесса соответствующая запись удаляется из структур отслеживания.
Обратный вызов загрузки образов отслеживает модули, загружаемые в отслеживаемые процессы, и обновляет внутренние структуры драйвера для корректной работы механизмов скрытия и защиты.
Чтобы процессы, запущенные до инициализации драйвера, также отслеживались, после регистрации обратных вызовов драйвер однократно перебирает все активные процессы и добавляет те из них, которые подлежат защите, в структуры отслеживания.
Регистрация мини-фильтра
Для защиты файлов и папок драйвер регистрирует мини-фильтр файловой системы. В ходе инициализации он создает внутренние списки фильтрации путей, загружает заданные злоумышленниками записи папок и файлов (Wid_H1deF5Dirs и Wid_H1deF5Files) и создает необходимые записи мини-фильтра в реестре по пути HKLM\SYSTEM\CurrentControlSet\Services\msagent\Instances. В случае конфликта значений Altitude драйвер динамически изменяет Altitude мини-фильтра и повторяет попытки его регистрации, пока не будет найдено уникальное значение.

Механизм повторной регистрации мини-фильтра с увеличением значения Altitude до успешного выполнения вызова FltRegisterFilter
Затем драйвер активирует мини-фильтр с помощью FltRegisterFilter. Фильтр работает совместно с интерфейсом IOCTL, который динамически добавляет, удаляет или очищает записи защищаемых путей (0x2220F0, 0x2220F4 и 0x2220F8). При выполнении операций с файловой системой мини-фильтр сопоставляет запрашиваемые пути с внутренними списками путей и блокирует доступ при совпадении, тем самым скрывая защищаемые файлы и папки от пользователей и приложений.
Регистрация обратного вызова при операциях с реестром
Для защиты разделов и значений реестра драйвер регистрирует обратный вызов при операциях с реестром с помощью CmRegisterCallbackEx со значением Altitude, равным 320000. В ходе инициализации он создает отдельные референсные структуры для защищаемых разделов и значений реестра, а затем заполняет их на основе записей Wid_H1deRegKeys и Wid_H1deRegValues из конфигурации.

Регистрация обратного вызова при операциях с реестром с помощью CmRegisterCallbackEx с указанием значения Altitude, равного 320000
После регистрации обратный вызов перехватывает операции с реестром и проверяет, является ли запрашиваемый раздел или значение защищаемым. При запросах на перечисление защищаемые разделы и значения удаляются из результатов до их передачи в пользовательский режим, что позволяет скрывать эти записи от средств просмотра реестра. При попытках прямого доступа, таких как открытие, изменение или удаление защищаемых объектов реестра, обратный вызов возвращает STATUS_ACCESS_DENIED, предотвращая выполнение соответствующей операции.
Перед применением этих ограничений драйвер проверяет, является ли запрашивающий процесс доверенным. Процессы, зарегистрированные с помощью IOCTL-запроса 0x222120, включая компонент CoolClient пользовательского режима, исключаются из логики фильтрации и сохраняют неограниченный доступ. На все остальные процессы распространяются правила защиты реестра, реализованные драйвером.
Диспетчер команд IOCTL
Для взаимодействия с компонентом пользовательского режима драйвер создает объект устройства с именем \Device\ToolTool и соответствующую символическую ссылку \DosDevices\ToolTool, что позволяет компоненту CoolClient пользовательского режима обмениваться данными с драйвером посредством запросов DeviceIoControl.
В драйвере предусмотрено 33 обработчика IOCTL, однако проанализированный образец CoolClient запрашивал при штатных операциях только три из них:
0x222120— регистрация текущего процесса CoolClient в драйвере;0x2221E0— передача заданного в настройках IPv4-адреса командного сервера;0x2220F0— регистрация путей в файловой системе и реестре, которые должны быть защищены.
Остальные обработчики IOCTL в проанализированном образце не вызывались.
| IOCTL | Обработчик | Назначение |
| 0x222000 | 0x140001E04 | Включение или отключение руткита. |
| 0x222004 | 0x1400020B0 | Запрос текущего состояния руткита. |
| 0x2220F0 | 0x140002320 | ● Регистрация защищаемых путей файловой системы или реестра. ● Используется CoolClient для регистрации собственного каталога установки и раздела реестра службы. |
| 0x2220F4 | 0x1400034DC | Удаление защищаемого пути файловой системы или реестра. |
| 0x2220F8 | 0x140003464 | Очистка всех записей защищаемых путей файловой системы и реестра. |
| 0x222118 | 0x1400024B0 | Регистрация записей защиты процессов или путей. |
| 0x22211C | 0x140002A20 | Запрос зарегистрированных записей защиты. |
| 0x222120 | 0x140003794 | Обновление записей защиты процессов. Используется CoolClient для регистрации собственного процесса в качестве доверенного. |
| 0x222124 | 0x14000362C | Удаление записи защиты. |
| 0x222128 | 0x14000349C | Очистка всех записей защиты процессов. |
| 0x222130 | 0x14000265C | Регистрация защищаемого процесса по его идентификатору (PID). |
| 0x222134 | 0x140010E88 | Внедрение шелл-кода в целевой процесс с помощью NtCreateThreadEx. |
| 0x222138 | 0x14000F498 | Скрытие модуля ядра путем исключения его из списка PsLoadedModuleList. |
| 0x222144 | 0x14000270C | Удаление файла. |
| 0x222148 | 0x14000286C | Расшифровка встроенного буфера и запись его на диск. |
| 0x22214C | 0x1400027F4 | Чтение и расшифровка зашифрованного файла. |
| 0x222168 | 0x140002780 | Отвязка секции образа от адресного пространства целевого процесса. |
| 0x22216C | 0x140013984 | Завершение процесса по его PID. |
| 0x222194 | 0x140011F50 | Снятие защиты Protected Process Light (PPL). |
| 0x222198 | 0x140002940 | Создание или изменение значения реестра. |
| 0x22219C | 0x140010630 | Скрытие процесса путем исключения его из списка активных процессов. |
| 0x2221A0 | 0x140010670 | Восстановление ранее скрытого процесса. |
| 0x2221A4 | 0x14000F8A0 | Скрытие модуля внутри процесса. |
| 0x2221A8 | 0x14000F954 | Восстановление скрытого модуля. |
| 0x2221AC | 0x140016368 | Перечисление и восстановление обратных вызовов уведомлений ядра. |
| 0x2221B0 | 0x140016458 | Отключение или восстановление обратных вызовов уведомлений ядра. |
| 0x2221B4 | 0x140012408 | Ручная загрузка вторичного драйвера в режиме ядра. |
| 0x2221B8 | 0x14001262C | Обработчик отладки и тестирования. |
| 0x2221BC | 0x1400165F6 | Запись по произвольному адресу в памяти ядра. |
| 0x2221C0 | 0x14000BB00, 0x14000BB78 | Включение режима deny-rootkit путем регистрации мониторинга загрузки образов и активации логики патчинга. |
| 0x2221C4 | 0x14000BB6C, 0x14000BB10 | Отключение режима deny-rootkit путем очистки состояния и отмены регистрации или удаления логики мониторинга. |
| 0x2221E0 | 0x1400126C0 | Регистрация IPv4-адреса командного сервера. |
После инициализации диспетчера IOCTL драйвер освобождает временный буфер конфигурации, который ранее был загружен из \REGISTRY\MACHINE\SYSTEM\RNG.
Перечисление и скрытие модулей ядра
Для скрытия модулей ядра драйвер во время выполнения резолвит адрес неэкспортируемой переменной ядра PsLoadedModuleList посредством MmGetSystemRoutineAddress. В этом глобальном связанном списке есть сведения обо всех загруженных модулях и драйверах ядра, что позволяет руткиту перечислять соответствующие записи и манипулировать ими.

Процедура инициализации драйвера, которая резолвит адрес PsLoadedModuleList для последующего скрытия модулей ядра
Эта функциональность доступна через IOCTL-запрос 0x222138, который принимает имя или путь к модулю от компонента пользовательского режима. При обнаружении защищаемого модуля драйвер находит соответствующую запись в PsLoadedModuleList и исключает ее из списка, обновляя ее указатели Flink и Blink. В результате скрытый модуль больше не отображается в стандартных процедурах перечисления модулей ядра.
Перехват и фильтрация данных nsiproxy
Драйвер также устанавливает хук в драйвере nsiproxy для фильтрации сетевых данных, возвращаемых в пользовательский режим. Этот механизм привязан к IOCTL-запросу 0x2221E0, который позволяет компоненту пользовательского режима регистрировать в драйвере IPv4-адреса командных серверов.
Для установки хука драйвер получает ссылку на \Driver\nsiproxy с помощью ObReferenceObjectByName и заменяет один из указателей на обработчик nsiproxy собственной процедурой фильтрации. Хук сохраняет оригинальный обработчик и передает ему управление после обработки возвращаемых данных.

Установка хука в nsiproxy путем резолвинга \Driver\nsiproxy и замены исходного обработчика на процедуру фильтрации драйвера
Когда процедура с прикрепленным хуком обрабатывает сетевую информацию, драйвер сравнивает возвращаемые записи со списком зарегистрированных IP-адресов командных серверов. Совпадающие IP-адреса удаляются до передачи данных в пользовательский режим, что препятствует обнаружению адресов командных серверов вредоносного ПО приложениями, которые получают сетевую информацию через nsiproxy.
Наконец, драйвер регистрирует процедуру DriverUnload для освобождения выделенных ресурсов в случае его выгрузки.
Жертвы
Последняя версия CoolClient продолжает атаковать организации, профиль которых соответствует ранее наблюдаемой активности HoneyMyte. В ходе расследований мы выявили жертвы в Мьянме, Монголии, Пакистане и России, при этом есть подтвержденные случаи компрометации государственных организаций.
В зафиксированных атаках CoolClient разворачивался как вторичный бэкдор после первоначального заражения PlugX. Таким образом, группа HoneyMyte, как и ранее, предпочитает использовать PlugX в качестве первичного импланта на этапе посткомпрометации, а затем устанавливать CoolClient.
Атрибуция
Наш анализ подтверждает, что исследованное вредоносное ПО представляет собой новый вариант бэкдора CoolClient, связанного с APT-группой HoneyMyte. Хотя схема выполнения в целом совпадает с уже изученными вариантами CoolClient, данный образец содержит ранее не документированный драйвер режима ядра, который существенно повышает уровень скрытности зловреда.
Цепочка развертывания, рассмотренная в рамках данного расследования, также соответствует ранее наблюдавшимся кампаниям HoneyMyte, в которых PlugX используется в качестве первоначального импланта для закрепления, после чего CoolClient разворачивается как вторичный бэкдор. Это дополнительно подтверждает атрибуцию данной активности группе HoneyMyte.
Заключение
Новая версия CoolClient знаменует собой значительный этап в развитии этого вредоносного семейства. В отличие от более ранних версий, которые функционировали преимущественно как бэкдоры пользовательского режима с поддержкой плагинов, новая версия разворачивает драйвер режима ядра и взаимодействует с ним, существенно расширяя свои возможности. С помощью этого драйвера CoolClient способен скрывать и защищать процессы, файлы и объекты реестра, а также фильтровать определенные сетевые данные, что значительно затрудняет обнаружение и анализ вредоносной активности.
Группа HoneyMyte уже внедрила функциональность режима ядра в ToneShell. Появление драйвера режима ядра в составе CoolClient позволяет предположить, что группа продолжает внедрять функциональность руткита в свои инструменты для повышения скрытности, обеспечения устойчивого закрепления и обхода средств защиты на стадии посткомпрометации.
Индикаторы компрометации
2d7c8780e97409770a9d4f31c66c9d63 msagent.sys
9460E150E1981D5C165043520C5C12FE msagent.sys
9717F005C5FB98E08D2AD983D88F94EE libngs.dll
F518D8E5FE70D9090F6280C68A95998F libngs.dll
EB79558B037669792652A816E2C669DE ctxmui.dll
C:\Program Files\microsoft\windows defender\
C:\Program Files\windows media player\mediares\
C:\ProgramData\symantecdir\
C:\ProgramData\virtualstore\
C:\Windows\identitycrl\production\
C:\Windows\serviceprofiles\networkservice\
C:\Users\<user>\AppData\Local\viber24.8\
C:\Users\<user>\AppData\Roaming\dsassistant\
C:\Program Files\common files\microsoft shared\office14\
C:\programdata\msdn\
cloudtroe.giize[.]com
employers.theworkpc[.]com
freeread.casacam[.]net
us.lenovoappstore[.]com
sundanish.freeddns[.]org
torinarlabs.webredirect[.]org
news.dursamjbataar[.]org
video.dursamjbataar[.]org
black-popular[.]com
whatismybestthing[.]com










APT-группа HoneyMyte обновила CoolClient: бэкдор получил руткит уровня ядра Windows