Растущая популярность криптовалют и кросс-платформенной среды разработки Electron привлекла внимание киберпреступников, которые адаптируют свои методы для атак на пользователей macOS. Вместо создания сложных исполняемых файлов, злоумышленники всё чаще выбирают тактику подмены компонентов легитимных приложений, что позволяет им эффективно маскировать вредоносную функциональность под знакомый пользователю софт. Этот подход демонстрирует эволюцию угроз для macOS, которые становятся всё более изощрёнными и нацеленными на конкретные активы.
Описание
В марте 2026 года специалисты Intego Antivirus Labs исследовали вредоносную кампанию, нацеленную на macOS и распространяющую похититель данных OSX/Amos. Анализ цепочки заражения, начинавшейся с "очищенных" бинарных файлов Mach-O и сильно обфусцированных shell-скриптов, привёл экспертов к необычной конечной полезной нагрузке. Она выглядела как простые "данные", а не стандартный исполняемый файл. В новом отчёте исследователи подробно описывают, как этот файл оказался архивом Electron ASAR (Atom Shell Archive) - форматом, который становится всё более распространённым вектором атаки в угрозах для macOS.
Суть техники заключается в троянизации легитимных кроссплатформенных приложений на Electron. Вместо распространения скомпилированных бинарников злоумышленники заменяют основной архив ASAR в установленном приложении на модифицированную, вооружённую версию, содержащую вредоносную логику. В данном случае скомпрометированное приложение маскировалось под официальный криптокошелёк Ledger Live. Его вредоносная версия совмещала в себе отключение проверки TLS-сертификатов с реалистичной фишинговой накладкой, предназначенной для кражи сид-фраз (Secret Recovery Phrase) криптовалютных кошельков и их последующей передачи на инфраструктуру злоумышленников.
Для практического анализа такого артефакта эксперты применяют конкретный рабочий процесс. Первым шагом является идентификация архива ASAR. Когда подозрительный файл не имеет очевидных заголовков, самый быстрый путь - анализ сырых байтов. Ключевым сигналом служит 16-байтовый заголовок, за которым сразу следует структура JSON, начинающаяся с "{"files":{…}". Эта комбинация является однозначным отпечатком формата ASAR. Приложения Electron упаковывают внутренний исходный код и ресурсы в такие архивы, где JSON-блок действует как таблица размещения файлов, за которой следуют сырые данные каждого файла. Если полезная нагрузка является ASAR, аналитик, скорее всего, имеет дело с ядром троянизированного приложения, включая код, ответственный за кражу учётных данных, показ фишинговых окон и сетевое взаимодействие.
Следующий этап - извлечение содержимого архива для анализа JavaScript-логики. В чистых лабораторных средах стандартный инструмент "npx asar extract" может быть недоступен, поэтому полезно иметь запасной вариант на Python. После распаковки структура каталога начинает напоминать Node.js или Electron проект. Чтобы найти точку входа, аналитик обращается к файлу "package.json", который действует как карта приложения. Критическое поле "main" указывает, какой файл исполняется первым (например, "./.webpack/main.bundle.js"). Именно здесь начинается охота за внедрённым вредоносным кодом.
В троянизированных сборках угрозы обычно внедряют логику либо в начало файла, до загрузки легитимного приложения, либо добавляют обфусцированный блок в конец, часто используя паттерны с "eval()". При анализе данного образца изучение начала основного бандла выявило ключевую деталь компрометации - явное отключение проверки TLS-сертификатов. Это достигалось через командный переключатель Electron для игнорирования ошибок сертификатов и установку переменной окружения "NODE_TLS_REJECT_UNAUTHORIZED = '0'". Для легитимного приложения криптокошелька в продакшен-среде нет ни одной разумной причины глобально отключать проверку TLS. Для операторов похитителей данных этот обходной путь является практическим "слоем надёжности", так как они часто используют дешёвую, быстро меняющуюся инфраструктуру с просроченными или самоподписанными сертификатами. Без такого отключения фоновые запросы на эксфильтрацию могут вызывать ошибки проверки, приводить к падению приложения или создавать заметные пользователю сбои.
Обнаружив механизм обхода безопасности, аналитики переходят к выяснению, какие данные собираются и куда они отправляются. В распакованном каталоге ".webpack/" были найдены подозрительные HTML-файлы, имитирующие интерфейс, например, "recovery-step-1.html". Эти файлы перехватывают пользовательский интерфейс и предлагают жертве "верифицировать" свою сид-фразу из 12 или 24 слов. Чтобы найти конечную точку сбора данных, фокус смещается на примитивы отправки данных в этих файлах, такие как "fetch()" или "XMLHttpRequest". Поиск по соответствующим файлам и фильтрация легитимных доменов позволила выявить командный сервер, используемый как точка сброса данных: "https://main.mon2gate.net/modules/wallets". Когда жертва отправляет завершающий шаг "восстановления", накладка незаметно передаёт сид-фразу злоумышленникам, а отключенная проверка TLS гарантирует, что ошибки сертификата не помешают запросу.
Эта техника не является изолированной и отражает созревание экосистемы вредоносного ПО как услуги (Malware-as-a-Service) для macOS. Троянизация приложений-кошельков путём отключения проверки TLS и внедрения фишинговых накладок в бандлы Electron ASAR стала повторяемым сценарием для множества семейств похитителей данных. Атакующие также диверсифицируют каналы распространения, выходя за рамки фальшивых обновлений и взломанных установщиков, и внедряют новые механизмы доставки, рассчитанные на обман как пользователей, так и в некоторых случаях автоматических инструментов. Для защитников даже без полного реверс-инжиниринга существуют высокоуровневые индикаторы компрометации: наличие архивов ASAR со структурой "{"files":{…}", необычно модифицированные Webpack-бандлы, указанные в "package.json", глобальные индикаторы отключения TLS, присутствие HTML-страниц, запрашивающих секреты, и исходящие запросы к доменам, не связанным с вендором, из кода интерфейса.
Индикаторы компрометации
URLs
- https://main.mon2gate.net/modules/wallets
MD5
- 70fe9f59cd3aac7e307131a9d917c33d
SHA1
- 7f23988444eb596141eed201ce73707c69ddd988
SHA256
- eeb14ff7262367f891168268ca8d64a306968e579be1136cbd7a48107698f405