В мире информационной безопасности угрозы из цепочки поставок программного обеспечения продолжают эволюционировать, становясь все более изощренными и опасными. Недавно обнаруженная активность группировки, отслеживаемой под именем GlassWorm, демонстрирует новый уровень сложности. После компрометации сотен репозиториев на GitHub и популярного пакета для работы с номерами телефонов в экосистеме npm, исследователи продолжили анализ и раскрыли детали многоступенчатого вредоносного фреймворка. Этот фреймворк не только устанавливает стойкий удаленный доступ, но и на третьей стадии насильственно инсталлирует в браузер Chrome расширение, маскирующееся под "Google Docs Offline". Цели атаки - перехват нажатий клавиш, кража файлов cookie и токенов сессий, создание скриншотов и выполнение команд с сервера управления, скрытого в блокчейне Solana. Этот случай наглядно показывает, как современные злоумышленники используют публичную и децентрализованную инфраструктуру для создания практически неуязвимых систем командования и управления.
Описание
Первая стадия: незаметное внедрение и геофильтрация
Изначальное проникновение GlassWorm происходит через вредоносные пакеты, распространяемые через npm, PyPI, GitHub и магазин расширений OpenVSX. Угроза действует по двум направлениям: создание новых вредоносных пакетов с нуля и компрометация аккаунтов поддерживающих разработчиков для внедрения вредоносного кода в легитимные проекты. Известны два основных варианта загрузчика. Первый использует так называемый "невидимый" загрузчик на основе символов Юникода, который сложно обнаружить при визуальном просмотре кода. Второй, более прямой вариант, применяет обычный обфусцированный скрипт "preinstall", как это было видно в скомпрометированном пакете "react-native-country-select". Независимо от метода доставки, логика выполнения первой стадии одинакова.
После 10-секундной задержки загрузчик выполняет две ключевые проверки. Во-первых, проводится геофильтрация: система анализирует локаль пользователя, имя пользователя ОС и временную зону, сверяя их со списком, соответствующим России и странам СНГ. Если обнаруживается русскоязычная локаль или часовой пояс от Москвы до Анадыря, выполнение вредоносного кода немедленно прекращается. Во-вторых, реализовано ограничение частоты запросов: загрузчик проверяет временную метку в файле "init.json" в домашней директории пользователя. Если с момента последней записи прошло менее двух часов, выполнение также останавливается. Это позволяет избегать частых обращений к инфраструктуре злоумышленника и снижает шансы на обнаружение.
Использование блокчейна Solana как неуязвимого сервера управления
Наиболее инновационной особенностью первой стадии является механизм получения адреса сервера управления. Вместо хранения URL в коде пакета, что позволило бы быстро заблокировать домен или IP-адрес, злоумышленники используют блокчейн Solana в качестве "мёртвой почты". Загрузчик запрашивает транзакции для заранее заданных кошельков, обращаясь к одному из девяти публичных RPC-эндоинтов. Адрес для загрузки следующей стадии хранится в поле "memo" (примечание) одной из транзакций. Это поле, предназначенное для аннотаций, становится скрытым каналом передачи данных. Такие "мемо" являются постоянными, публично видимыми в блокчейне и хранятся на децентрализованной инфраструктуре, которую невозможно отключить силами одного регулятора или компании. Оператор может в любой момент обновить URL для второй стадии, просто отправив новую транзакцию с новым "memo", не внося изменений в уже распространённые пакеты. Исследователи [обнаружили] два активных кошелька, каждый связанный с разным вариантом загрузчика. Полученный из "memo" URL, закодированный в Base64, ведёт на IP-адрес 45.32.150[.]251, с которого в ответ на запрос с указанием операционной системы ("win32", "darwin", "linux") отправляется зашифрованная полезная нагрузка второй стадии.
Вторая стадия: комплексный сбор конфиденциальных данных
Вторая стадия представляет собой полноценный фреймворк для кражи данных, ориентированный в первую очередь на разработчиков программного обеспечения. Его функционал впечатляет своим размахом. Во-первых, модуль занимается кражей криптокошельков: он рекурсивно сканирует профили браузерных расширений и данные настольных приложений, targeting 71 идентификатор расширения, включая MetaMask, Phantom, Coinbase Wallet и другие. Также собираются текстовые файлы и изображения с названиями, которые могут содержать сид-фразы. Во-вторых, крадутся учётные данные разработчика: токены из ".npmrc" и переменной окружения "NPM_TOKEN", которые валидируются в реальном времени через запрос к официальному реестру npm, а также токены Git и из хранилища VS Code. В-третьих, осуществляется сбор секретов облачных платформ: файлы учётных данных для AWS, Google Cloud Platform, Microsoft Azure, Docker, Kubernetes, SSH-ключи и конфигурации Terraform. Всё собранное упаковывается в архив и отправляется на сервер эксфильтрации 217.69.3[.]152. Перед переходом к третьей стадии фреймворк готовит две компоненты: фишинговый бинарный файл для атаки на аппаратные кошельки Ledger и Trezor, а также стойкий RAT на базе WebSocket.
Третья стадия: стойкий шпионаж и фишинг аппаратных кошельков
Третья стадия разделена на два независимых модуля. Первый модуль нацелен на кражу сид-фраз аппаратных криптокошельков. Если на машине жертвы обнаружена директория Ledger Live, загружается .NET-приложение, которое маскируется под легитимное ПО кошельков. Оно отслеживает подключение устройств Ledger или Trezor через USB и показывает реалистичные фишинговые окна с сообщениями об ошибке конфигурации или сбое прошивки, требуя ввести 24 слова восстановления. Приложение агрессивно препятствует закрытию окна и убивает процессы настоящего Ledger Live. Украденная сид-фраза отправляется на контролируемый злоумышленниками сервер.
Второй модуль - это продвинутый RAT, сохраняемый в папке AppData. Он обладает механизмами "бессмертия", перехватывая сигналы завершения процесса и перезапуская себя. Для получения конфигурации C2 он использует гибридный подход: сначала пытается найти её в распределённой хэш-таблице (DHT, Distributed Hash Table) по публичному ключу, а в случае неудачи возвращается к описанному выше механизму с блокчейном Solana. После установки соединения по WebSocket оператор получает широкий набор команд: развёртывание скрытого удалённого рабочего стола (HVNC), запуск SOCKS5-прокси на машине жертвы для использования её IP-адреса в других атаках, выполнение произвольного JavaScript-кода и принудительная перезагрузка модуля кражи данных из браузера.
Браузерное расширение-шпион и выводы
Одной из наиболее коварных компонент является вредоносное расширение для Chrome, маскирующееся под официальное "Google Docs Offline". Его сервер управления также получается из поля "memo" специального кошелька в блокчейне Solana. Расширение обладает обширным шпионским функционалом: перехват нажатий клавиш, кража cookies, localStorage, истории браузера, закладок, создание скриншотов вкладок и чтение буфера обмена. Особенно опасно, что оно может осуществлять целевой мониторинг сессий на определённых сайтах, например, на криптобирже Bybit, и немедленно перехватывать аутентификационные cookies.
Атака GlassWorm демонстрирует тревожную тенденцию: злоумышленники всё чаще используют легитимную, устойчивую и публичную инфраструктуру - такую как блокчейн-сети, публичные календари и DHT - для создания практически неуязвимых каналов управления. Это сводит на нет традиционные методы защиты, основанные на блокировке доменов или IP-адресов. Защита от подобных угроз требует смещения фокуса на поведенческий анализ, мониторинг аномальной активности в системах разработки и использование специализированных инструментов для сканирования зависимостей, способных выявлять сложные обфускации и подозрительные сетевые взаимодействия уже на этапе установки пакетов. Для разработчиков и компаний критически важно внедрять практики безопасной разработки, использовать многофакторную аутентификацию для учётных записей в репозиториях и регулярно проводить аудит зависимостей в своих проектах.
Индикаторы компрометации
IPv4
- 217.69.0.159
- 217.69.3.152
- 45.150.34.158
- 45.32.150.251
URLs
- http://217.69.3.152/wall
- http://217.69.3.152:80/log
- http://45.32.150.251/3e4Tg8V%2F8aCmOJKipASADg%3D%3D
- http://45.32.150.251/get_arhive_npm/nt70c2J3PG%2BfPBSFHJKoWQ%3D%3D
- http://45.32.150.251/get_encrypt_file_exe/E/E%2BT9tEjmURMwNnCCY2CA%3D%3D
- http://45.32.150.251/led-win32
- http://45.32.150.251/module/wrtc
- http://45.32.150.251:4787
- https://calendar.app.google/2NkrcKKj4T6Dn4uK6
SHA256
- 06fab21dc276e3ab9b5d0a1532398979fd377b080c86d74f2c53a04603a43b1d
- 43253a888417dfab034f781527e08fb58e929096cb4ef69456c3e13550cb4e9e
- 4a60afa085fe5a847aef164578537bc33b9b58954143381e0c65c6354e4501e3
- 9df62cefd87784c7ee1ca8b4e6fc49737a90492fa6c23901e3b7981b18c6c988
- de81eacd045a88598f16680ce01bf99837b1d8170c7fc38a18747ef10e930776
- ee3e4dd5c1e073b8805f4107ccc7bc7e6e3c209fe13ea04ff3f2173c8dbe74a6
- f171c383e21243ac85b5ee69821d16f10e8d718089a5c090c41efeaa42e81fca
- fdba5be3da2467e642bd8710f971e6b266b30ac15f5f413982fd719d7e0bffd9
Solana Wallets
- BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC
- 6YGcuyFRJKZtcaYCCFba9fScNUvPkGXodXE1mJiSzqDJ
- DSRUBTziADDHSik7WQvSMjvwCHFsbsThrbbjWMoJPUiW