GLASSWORM.WASM атакует Open VSX через WebAssembly и Solana C2
Кампания GLASSWORM.WASM использует вредоносные расширения для Open VSX. Активность зафиксирована с 23 мая по 12 июня 2026 года. По меньшей мере семь расширений применяли одноразовые или имитированные пространства имен издателей, а злоумышленники быстро меняли содержимое и сборки, чтобы затруднить обнаружение.
Быстрая смена расширений и сборок
Среди выявленных пространств имен были exargd.vsblack@0.0.1, noellee-doc.flint-debug@0.1.1, а также несколько версий со строкой qizhao.element-vue-snippets-2.0.2.
В течение девяти часов кампания сгенерировала по меньшей мере шесть хешей содержимого. Такая частота изменений указывает на быструю итерацию пространств имен и сборок, направленную на уклонение от обнаружения.
Проанализированный образец WebAssembly имеет SHA-256 2417df8fdc0f94e22a850892e3f6f8bc7122a079073b5ea725b3b0f2076357d8.
Модуль WebAssembly получает доступ к возможностям хоста через JavaScript
Полезная нагрузка представляет собой модуль js/wasm, скомпилированный с помощью TinyGo. Он содержит 469 функций, 17 экспортов, 45 сегментов данных и 17 импортов.
В модуле нет прямых импортов для работы с сетью, файловой системой или процессами. Вместо этого он использует мост TinyGo syscall/js и встроенную JavaScript-обертку на основе wasm_exec.js. Такой подход позволяет обращаться к возможностям хост-системы через JavaScript.
Через этот мост модуль способен:
- вызывать операции
fetch, похожие на браузерные; - проверять значение
process.platform; - выполнять команды через Node.js API, включая
require('child_process').execSync.
Значимые строки в бинарном файле зашифрованы. К ним относятся конечные точки Solana, идентификаторы кошельков, имена команд и ссылки на PowerShell. Бинарный файл также содержит константы и метаданные, связанные с ChaCha20 и Salsa20. Они используются для восстановления или обработки этих значений.
Управление через транзакции Solana
Для command-and-control загрузчик обращается к конечной точке Solana JSON-RPC api.mainnet.solana.com. Сначала он использует метод getSignaturesForAddress, затем выполняет пагинацию с помощью параметра before и извлекает транзакции через getTransaction с кодировкой jsonParsed.
В инструкциях транзакций загрузчик ищет идентификаторы программы SPL Memo:
MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr;Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFM.
Значения Memo с префиксом 9 удаляются. Полученная строка используется как текущее имя хоста C2. Для поиска данных применяется фиксированный якорь кошелька 6ExrZayPZzMMSnszc42cH81DpuKT8FhCX9H6Sesn6rpz.
Безфайловая загрузка команд
После разрешения имени хоста загрузчик выбирает команду извлечения с учетом операционной системы. Затем он запускает безфайловую схему загрузки, аналогичную curl | bash в системах семейства Unix и irm | iex в Windows.
Признаки, полезные для обнаружения
Для выявления GLASSWORM.WASM можно использовать несколько групп признаков:
- импорты и экспорты, специфичные для TinyGo;
- константа ChaCha20;
- метаданные отражения RPC Solana;
- идентификаторы SPL Memo;
- подозрительная активность дочерних процессов Node, исходящая от расширений.
Отчет получен из сервиса CTT Report Hub. Права на отчет принадлежат его владельцу.
Ознакомиться подробнее с отчетом можно по ссылке.



