Исследователи кибербезопасности обнаружили новую вредоносную кампанию, нацеленную на пользователей macOS. Угроза под названием MacSync использует фишинговую страницу, имитирующую установщик облачного хранилища, чтобы заставить жертв добровольно выполнить вредоносную команду в терминале. Этот подход позволяет зловреду обойти встроенные защитные механизмы операционной системы, такие как Gatekeeper и проверку подписей.
Описание
Цепочка заражения: от фишинга до скрытого исполнения
Атака начинается с фишинговой страницы, на которую пользователи попадают через цепочку перенаправлений, например, с поддельного сайта Microsoft. Страница убедительно имитирует официальный портал загрузки и содержит инструкцию скопировать и вставить одну команду в Терминал для «установки». Команда, содержащая закодированный URL, загружает и немедленно исполняет сценарий второй стадии.
Этот сценарий, написанный на Zsh, действует как загрузчик. Его ключевая задача - демонизировать процесс, то есть запустить его в фоновом режиме, отсоединив от сессии терминала. После этого он связывается с командным сервером злоумышленников (C2) по заранее заданному домену (например, jmpbowl[.]xyz), используя уникальный токен для идентификации жертвы, и загружает основную полезную нагрузку - скрипт на AppleScript, который исполняется прямо в памяти, не оставляя файлов на диске.
Кража данных и фишинг пароля системы
Основной скрипт AppleScript выполняет агрессивный сбор конфиденциальной информации. Первым делом он пытается получить пароль учетной записи macOS, который необходим для офлайн-дешифровки украденных данных. Для этого зловред многократно показывает пользователю поддельное диалоговое окно, стилизованное под «Системные настройки», с просьбой ввести пароль. Многие пользователи, чтобы избавиться от навязчивого окна, в конечном итоге вводят свои учетные данные.
После успешного фишинга пароля скрипт приступает к систематической краже данных. Он копирует профили популярных браузеров на основе Chromium (Chrome, Brave, Edge, Opera и другие), где хранятся сохраненные логины, cookies и история. Отдельное внимание уделяется расширениям для криптокошельков, таким как MetaMask и Phantom. Специальный список идентификаторов позволяет скрипту находить и копировать локальные хранилища этих расширений, где часто содержатся сид-фразы и приватные ключи.
Кроме того, зловред ищет и архивирует данные настольных криптокошельков (Exodus, Electrum, Atomic), директории с SSH-ключами, облачными учетными данными (AWS), сессиями Telegram и базой данных приложения «Заметки». Весь собранный «улов» упаковывается в архив и загружается на сервер злоумышленников.
Долгосрочная угроза: троянизация приложений для аппаратных кошельков
Наиболее опасной частью атаки является механизм условного троянирования. Если на зараженном компьютере обнаруживаются приложения для управления аппаратными кошельками Ledger или Trezor, MacSync внедряет в них вредоносный код для долгосрочной персистентности (устойчивости) и фишинга.
Для приложения Ledger Wallet используется метод частичной замены. Зловред скачивает архив, содержащий только модифицированные ключевые файлы - основной пакет кода (app.asar) и файл метаданных (Info.plist). Он заменяет именно эти компоненты в оригинальном приложении, сохраняя его внешний вид и часть функциональности. Приложение Trezor Suite заменяется полностью на вредоносную сборку.
Фишинговый интерфейс внутри троянизированных приложений
Модифицированные приложения выглядят и работают как обычные, пока не срабатывает определенный триггер. Затем они показывают пользователю многошаговый фишинговый «мастер восстановления», идеально имитирующий официальный интерфейс. Сначала появляется сообщение об ошибке с заверениями, что средства в безопасности. Затем пользователя просят ввести PIN-код от аппаратного кошелька, а на последнем этапе - полную сид-фразу (восстановительную фразу) из 24 слов.
Введенные данные тайно пересылаются злоумышленникам. Получив сид-фразу, атакующие получают полный контроль над криптоактивами жертвы, даже если они хранятся на аппаратном кошельке. Это превращает единичный инцидент кражи данных в постоянную угрозу, которая может реализоваться спустя недели или месяцы после заражения.
Инфраструктура и защита
Кампания использует как минимум восемь ротирующихся C2-доменов с единым шаблоном именования. На основном фишинговом домене обнаружены несколько параллельных путей (/v1, /v2, /v3), что указывает на активное тестирование и развитие атаки.
Эксперты подчеркивают, что лучшей защитой от подобных угроз остается осторожность и соблюдение базовых правил кибергигиены. Ни при каких обстоятельствах не следует копировать и выполнять в Терминале команды, полученные из непроверенных источников, даже если они выглядят безобидно или имитируют официальные инструкции. Регулярное обновление ПО и использование антивирусных решений для macOS также могут помочь в обнаружении подобных угроз.
Индикаторы компрометации
Domains
- jmpbowl.coupons
- jmpbowl.fun
- jmpbowl.shop
- jmpbowl.space
- jmpbowl.today
- jmpbowl.top
- jmpbowl.world
- jmpbowl.xyz
- macclouddrive.com
- maccloudsafe.com
- maccloudvault.com
- macfilebackup.com
- macfiledrive.com
- macfilevault.com
SHA256
- c99dea85f0ef8d3e2f3771c8ebd02d7dee0d90efc5c8392e5c266a59640a4206
- ec6bc84be18ce4cb55fb915370c00f2a836ffefc65c6b728efb8d2d28036e376
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | rule MacSync_AppleScript_Stealer { meta: description = "Detects MacSync infostealer AppleScript payload" author = "WaterBucket" date = "2025-12-16" reference = "MacSync Technical Analysis" strings: $s1 = "MacSync Stealer" ascii $s2 = "osalogging.zip" ascii $s3 = "Enter your system password to continue verification" ascii $s4 = "GrabFolderLimit" ascii $s5 = "jmpbowl.xyz" ascii $ext1 = "nkbihfbeogaeaoehlefnkodbefgpgknn" ascii // MetaMask extension ID $ext2 = "bfnaelmomeimhlpmgjnjophhpkkoljpa" ascii // Phantom condition: 4 of ($s*) or all of ($ext*) } |
| 1 2 3 4 5 6 7 8 9 10 11 | rule MacSync_Trojanized_Ledger { meta: description = "Detects known malicious files from trojanized Ledger Wallet.app" author = "Waterbucket" date = "2025-12-16" condition: hash.sha256(0, filesize) == "ec6bc84be18ce4cb55fb915370c00f2a836ffefc65c6b728efb8d2d28036e376" or // app.asar hash.sha256(0, filesize) == "c99dea85f0ef8d3e2f3771c8ebd02d7dee0d90efc5c8392e5c266a59640a4206" // Info.plist } |
