Специалисты SentinelLABS обнаружили и проанализировали новый Rust-имплант для macOS, получивший название macOS.Gaslight. Установка встраивает в себя 38 поддельных системных сообщений, предназначенных для того, чтобы сбить с толку LLM-агента, выполняющего триаж вредоносных образцов. Канал управления построен на основе Telegram Bot API, шифрование трафика реализовано через AES-GCM с привязкой к сертификату (certificate pinning). Имплант содержит встроенный Python-стилер, интерактивную оболочку и механизм самомаскировки токена бота в логах. SentinelLABS с высокой степенью уверенности связывает macOS.Gaslight с кластером северокорейской активности (DPRK) под macOS.
Описание
Образец был загружен на VirusTotal 22 мая, а в начале июня Apple выпустила обновление XProtect, которое детектирует файл исключительно по хешу, а не по строкам или байткоду. При этом на момент написания статьи ни один статический движок VirusTotal не распознаёт угрозу. Бинарный файл имеет ad hoc-подпись и идентификатор "endpoint-macos-aarch64-5555494492fc075f441637fb9d894913dde3a2ea". Apple использует правило MACOS_BONZAI_COBUCH, а SentinelLABS связывает семейство BONZAI с северокорейской активностью. Ещё один родственный образец попадает под правило AIRPIPE, которое также ассоциировано с DPRK.
Главная особенность macOS.Gaslight - встроенная промпт-инъекция. В теле импланта содержится 3,5-килобайтный блок текста в формате Markdown с 38 поддельными системными сообщениями, разделёнными токенами {{DATA}}. Эти сообщения имитируют сообщения об истечении токена, нехватке памяти, заполнении диска, повторяющихся сбоях операций и ложно предупреждают об уязвимостях инъекций и проблемах статического анализа. Такой блок спроектирован так, чтобы LLM-агент, обрабатывающий образец, воспринял эти сообщения как часть собственного промпта и прервал, сократил или отказался от анализа. Ранее Check Point продемонстрировала публично подобную технику в 2025 году для Windows, Socket описал атаку на цепочку поставок Hades, а в утёкшем коде Shai-Hulud использовалась "Anthropic Magic String". Однако все предыдущие примеры полагались на один внедрённый блок, тогда как macOS.Gaslight использует каскад из 38 сообщений, полностью имитирующих структуру промпта LLM-триажа. SentinelLABS ранее исследовали использование LLM для генерации кода вредоносного ПО, но не для атаки на инструменты анализа.
Канал управления построен на механизме getUpdates Telegram Bot API. Имплант запускает цикл опроса, который выполняется только при отсутствии вебхука. Обработчик реагирует на три кода ошибок Telegram: BotBlocked, InvalidToken и Conflict. Ответ Conflict возникает при одновременном опросе двух экземпляров с одним токеном, и имплант использует его как блокировку двойного запуска - второй экземпляр завершается. После активации оператор получает интерактивную оболочку с шестью командами: help, id, shell (выполнение команды через execvp или posix_spawnp), kill (завершение процесса по PID), upload (передача файла через Telegram) и stop (остановка). Имплант создаёт утверждение управления питанием IOPMAssertionCreateWithName, предотвращая переход системы в сон при длительных сеансах сбора данных.
Транспортное шифрование использует AES-GCM с помощью крейта aes-gcm 0.10.3 на чистом Rust. Ключ AES передаётся в runtime в конфигурации, а не вшит в образец. Для каждого сообщения генерируется новый nonce через CCRandomGenerateBytes. Поверх шифрования имплант настраивает собственный доверенный корневой сертификат и вызывает SecTrustSetAnchorCertificatesOnly, ограничивая проверку TLS только этим якорем. Это предотвращает перехват трафика стандартными прокси-сертификатами и затрудняет сетевой анализ. Кроме того, имплант учитывает системные прокси, читая конфигурацию через SCDynamicStoreCopyProxies, что позволяет работать в корпоративных сетях с обязательным прокси-сервером.
Конфигурация оператора передаётся на этапе запуска в виде 15 полей, десериализуемых через serde. В образце присутствуют поля tg_room_id, github_token, github_repo, github_polling_interval, main_upload_url, main_base_url, aes_key, payload_path_linux, payload_path_macos, persist_name_linux, persist_name_macos, persist_type_linux, persist_type_macos, init_python_enable, persist_enable. Поля, связанные с Linux и GitHub, не задействованы в данном образце, что указывает на использование общей операторской схемы для более широкого инструментария.
Сбор данных реализован через встроенный Python-стилер размером 6,6 КБ в кодировке base64. После декодирования скрипт собирает данные браузеров Chrome, Brave, Firefox и Safari, историю команд терминала, список установленных приложений, снимок процессов через ps aux, аппаратный и программный профиль через system_profiler и копию файла login.keychain-db. Все артефакты архивируются в "temp/collected_data.zip" и отправляются оператору через Telegram. SentinelLABS ранее документировали похожие цели у Atomic macOS Stealer (AMOS) и ранних Rust-стилеров, но способ доставки отличается. Отдельный bash-скрипт на 2 КБ загружает и разворачивает standalone CPython 3.10.18 из проекта astral-sh/python-build-standalone, что является новым подходом - ранее для таких целей использовали PyInstaller или Nuitka, как отмечала Microsoft. Загрузка CPython происходит только при необходимости, сохраняя основное тело импланта компактным.
Персистентность реализована через LaunchAgent с меткой "com.apple.system.services.activity". Имплант маскируется под системный сервис Apple, что характерно для многих macOS-вредоносных программ, включая связанные с DPRK. Для записи абсолютного пути к себе в plist используется "__NSGetExecutablePath". Поведение персистентности управляется полем persist_enable в конфигурации.
Особого внимания заслуживает механизм саморедактирования токена бота. Когда URL-путь содержит литерал "file" (4 байта little-endian 0x656c6966), конструктор подменяет следующий за ним токен на placeholder "file/token:redacted". Предоставленный анализ SentinelLABS показывает, что это предотвращает попадание живого токена в логи, сообщения об ошибках или дампы краша. Поскольку токен отсутствует в самом образце и передаётся отдельно, его перехват через артефакты выполнения становится невозможным. NVISO Labs ранее отмечали, что большинство Telegram-ботов в малвари имеют извлекаемые токены; саморедактирование macOS.Gaslight выглядит новым приёмом.
Выводы. macOS.Gaslight объединяет в одном Rust-бинарнике стилер учётных данных, интерактивную оболочку и цепочку Python-сбора с автономным рантаймом. За исключением загрузки CPython из внешнего репозитория, все техники ранее встречались. Однако аналитическая промпт-инъекция представляет собой новую угрозу для инструментов LLM-триажа, которые всё активнее внедряются в процессы реверс-инжиниринга. Разработчикам таких систем следует рассматривать содержимое любых анализируемых образцов как потенциально враждебные входные данные и изолировать их от модели. По мере распространения LLM-ассистированного анализа можно ожидать появления новых образцов, нацеленных на его компрометацию.
Индикаторы компрометации
SHA256
- 6328567511d88fdc2ae0939c5ef17b7a63d2a833881900de018a4f12f4982525
- 77b4fd46994992f0e57302cfe76ed23c0d90101381d2b89fc2ddf5c4536e77ca
- b3c56d689414343589f38394d19ba2fe9a518133281200faa0556ba4e4136394
- baabf249c77bc54c54ab0e66e15af798bd28aa5b4683554456a8b73ab8741239