В июле 2021 года китайский блогер впервые обнаружил macOS.ZuRu - бекдор, распространявшийся через отравленные результаты поиска Baidu. Пользователи, искавшие популярный эмулятор терминала iTerm2, перенаправлялись на вредоносный сайт, где загружалась троянизированная версия программы. Позднее злоумышленники использовали ту же схему, подменяя результаты поиска для других популярных macOS-утилит, таких как SecureCRT, Navicat и Microsoft Remote Desktop для Mac. Выбор этих приложений указывал на целенаправленную атаку на пользователей инструментов для удалённого управления SSH-серверами.
Описание
В январе 2024 года специалисты JAMF обнаружили пиратские версии macOS-приложений с похожими техническими признаками, но теперь злоумышленники использовали открытый фреймворк Khepri C2 для управления заражёнными системами. В конце мая 2025 года в соцсетях появился новый образец трояна, на этот раз маскирующийся под кросс-платформенный SSH-клиент Termius.
В отличие от предыдущих версий, новая модификация ZuRu использует изменённый подход к заражению легальных приложений, а также модифицированную версию Khepri. В данной статье мы рассмотрим технические особенности последнего варианта вредоносного ПО и приведём новые индикаторы компрометации для специалистов по защите информации.
Метод заражения и структура поддельного приложения
Зловред распространяется через образ .dmg, внутри которого находится модифицированная версия Termius.app. Оригинальный дистрибутив Termius занимает около 225 МБ, тогда как заражённая версия весит 248 МБ из-за добавленных вредоносных компонентов. Так как злоумышленники внесли изменения в пакет приложения, они заменили цифровую подпись разработчика на свою собственную (ad hoc), чтобы обойти проверки системы безопасности macOS.
Внутри Termius Helper.app появляются два новых исполняемых файла: легитимный бинарник Termius Helper (248 КБ) заменяется и переименовывается в .Termius Helper1, а на его место помещается вредоносный Mach-O-файл размером 25 МБ. При запуске этот файл активирует как загрузчик вредоноса (.localized), так и .Termius Helper1, чтобы пользователь не заметил подмены. В фоновом режиме .localized загружает дополнительный модуль с сервера download.termius[.]info и сохраняет его в /tmp/.fseventsd. Этот файл представляет собой бекдор Khepri C2.
Раньше ZuRu использовал другой метод подмены приложений - добавлял в исполняемый файл дополнительную команду загрузки внешней библиотеки .dylib, которая, в свою очередь, запускала Khepri и модули персистентности. Новый способ с подменой Helper-приложения, вероятно, направлен на усложнение обнаружения.
Персистентность через LaunchDaemon
При запуске .localized запрашивает повышенные привилегии и, если получает их, создает файл persistence plist с именем com.apple.xssooxxagent в /Library/LaunchDaemons/. Этот модуль запрограммирован на выполнение копии .localized, расположенной в /Users/Shared/com.apple.xssooxxagent, каждый час.
Для управления зловредным демоном используется функция _writePlistAndStartDaemon(), выполняющая команды:
1 | launchctl bootout system/com.apple.xssooxxagent; launchctl bootstrap system/com.apple.xssooxxagent; sleep 1 |
Интересно, что для запроса привилегий используется устаревший API AuthorizationExecuteWithPrivileges.
Особенности загрузчика .localized
Помимо установки персистентности, загрузчик выполняет проверки и загрузку дополнительных модулей. Функция _LockManager() предотвращает запуск нескольких копий вредоноса через файл блокировки /tmp/apple-local-ipc.sock.lock. Если другой процесс уже удерживает блокировку, загрузчик завершает работу.
Функция _checkFileAndDownloadIfNeeded() проверяет наличие файла /tmp/.fseventsd и, если его нет, загружает полезную нагрузку с сервера по адресу "http[:]//download.termius[.]info/bn.log.enc", расшифровывая её с помощью ключа "my_secret_key". Если файл существует, загрузчик сверяет его хеш MD5 с удалённой версией, чтобы убедиться в актуальности.
Изменённый алгоритм расшифровки
Ранние версии ZuRu использовали XOR-шифрование с ключом 0x7a, но в новой модификации применяется более сложная схема. Функция _decryptData() обрабатывает каждый байт входных данных, выполняя последовательно четыре операции: сложение, нормализацию, вычитание и XOR с использованием ключевой строки "my_secret_key".
Такой метод обеспечивает симметричное шифрование, но не является криптографически стойким - его основная цель - затруднить автоматический анализ.
Модифицированный Khepri C2
Полезная нагрузка, загружаемая с сервера, представляет собой универсальный Mach-O-файл (174 КБ) с ad hoc-подписью. Он требует macOS Sonoma 14.1 или новее, что указывает на ориентацию злоумышленников на современные системы.
Khepri - полнофункциональный бекдор с возможностями передачи файлов, сбора информации о системе, выполнения команд и управления процессами. В данной версии злоумышленники модифицировали исходный код, добавив поддержку флагов "-s" (пропуск проверки блокировки) и "-bd" (запуск в режиме демона).
Бекдор использует интервал проверки 5 секунд (вместо стандартных 10) и маскирует трафик под запросы к www.baidu[.]com, в то время как реальный C2-сервер (ctl01.termius[.]fun) расположен на Alibaba Cloud (47.238.28.21).
Выводы
Последняя версия macOS.ZuRu продолжает традицию троянизации популярных macOS-приложений для разработчиков и ИТ-специалистов. Изменение метода заражения, вероятно, направлено на обход систем защиты, однако повторяющиеся техники (например, паттерны доменных имён и механизмы персистентности) делают этот зловред уязвимым для современных средств обнаружения.
Организациям, не использующим защитные решения вроде SentinelOne, рекомендуется проверить системы на наличие указанных индикаторов компрометации.
Индикаторы компрометации
IPv4
- 47.238.28.21
Domains
- ctl01.termius.fun
URLs
- http://download.termius.info/bn.log.enc
- http://download.termius.info/bn.log.md5
SHA1
- a7a9b0f8cc1c89f5c195af74ce3add74733b15c0
- ace81626924c34dfbcd9a485437cbb604e184426
- de8aca685871ade8a75e4614ada219025e2d6fd7
- fa9b89d4eb4d47d34f0f366750d55603813097c1