В мире разработки программного обеспечения разворачивается одна из наиболее масштабных и изощренных атак на цепочку поставок ПО (software supply chain) за последние годы. Угроза, получившая название ForceMemo, демонстрирует, как умелое сочетание кражи учетных данных, скрытного внедрения в код и использования блокчейна в качестве канала управления позволяет злоумышленникам массово заражать проекты с открытым исходным кодом. Уже скомпрометированы сотни репозиториев Python, включая проекты для машинного обучения, веб-приложения на Django и библиотеки для PyPI, что подвергает риску тысячи разработчиков и компаний по всему миру.
Описание
Команда аналитиков угроз StepSecurity обнаружила продолжающуюся кампанию, в рамках которой злоумышленник, взламывая учетные записи разработчиков на GitHub, внедряет идентичный вредоносный код в сотни репозиториев Python. Первые случаи заражения датируются 8 марта 2026 года, и на момент публикации отчёта кампания остаётся активной - новые репозитории продолжают попадать под удар. Целями становятся проекты на Python, включая приложения Django, код для исследований в области машинного обучения, панели управления на Streamlit и пакеты для PyPI. Вредоносная нагрузка добавляется в конец ключевых файлов, таких как "setup.py", "main.py" и "app.py". Любой, кто выполнит команду "pip install" из скомпрометированного репозитория или склонирует и запустит код, активирует вредоносную программу.
Механизм атаки отличается высокой степенью скрытности. Вместо создания нового коммита или запроса на слияние, что было бы заметно в ленте активности, злоумышленник использует технику принудительной отправки (force-push) изменений. Он берёт последний легитимный коммит в основной ветке, перебазирует его, добавляя обфусцированный вредоносный код, и принудительно отправляет изменения обратно. При этом сообщение коммита, автор и дата автора сохраняются из оригинала, что создаёт иллюзию неизменности кодовой базы. Единственным признаком вмешательства становится дата коммиттера, которая соответствует моменту атаки, а сам коммиттер в ряде случаев указывается как «null». Такой подход затрудняет обнаружение взлома как владельцами репозиториев, так и автоматическими системами мониторинга.
Аналитики StepSecurity в своём отчёте детально описали, как происходит компрометация аккаунтов. Установлен механизм захвата учётных записей: разработчики заражались вредоносным ПО GlassWorm через скомпрометированные расширения для редакторов кода VS Code и Cursor. Полезная нагрузка третьей стадии GlassWorm включает специализированный модуль для кражи учетных данных, который собирает токены GitHub из множества источников: "git credential fill", хранилища расширений VS Code, файла "~/.git-credentials" и переменной окружения "GITHUB_TOKEN". Получив эти данные, злоумышленник использует их для принудительной отправки вредоносного кода во все репозитории жертвы. Явным доказательством компрометации на уровне аккаунта служит тот факт, что при взломе одной учётной записи вредоносный код внедряется сразу во все принадлежащие ей репозитории.
После запуска обфусцированный код, добавленный в файлы Python, проходит три слоя дешифровки: декодирование base64, распаковку zlib и расшифровку XOR с ключом 134. После этого исполняется основная вредоносная логика. Интересной особенностью является проверка на русскоязычную локализацию системы - анализ настроек локали, часового пояса и смещения UTC. Если система определена как российская, выполнение кода прекращается. Эта тактика, характерная для киберпреступных группировок из Восточной Европы, призвана избегать атак на системы внутри определённого региона, снижая риск привлечения внимания местных правоохранительных органов.
Вместо подключения к традиционному серверу управления и контроля, который может быть отключен, вредоносная программа читает свои инструкции из блокчейна Solana. Она запрашивает определённый адрес Solana на предмет транзакций, в мемо которых содержится JSON-данные с URL-адресом полезной нагрузки. Использование блокчейна в качестве канала C2 делает инфраструктуру злоумышленника чрезвычайно устойчивой: инструкции, однажды записанные в распределённый реестр, не могут быть удалены или подвергнуты цензуре, а злоумышленник может обновлять URL-адрес полезной нагрузки в любой момент, отправляя новую транзакцию. Для повышения отказоустойчивости вредоносная программа пробует подключиться к девяти различным RPC-нодам Solana.
Получив URL-адрес полезной нагрузки, вредоносная программа загружает Node.js версии 22.9.0 с официального сайта, затем получает зашифрованный JavaScript-код по указанному адресу. Ключи для расшифровки доставляются через заголовки HTTP-ответа. После расшифровки код выполняется с помощью загруженного Node.js, а в системе создается файл для обеспечения постоянного присутствия с таймером повторной проверки в 2 дня. Хотя финальная полезная нагрузка зашифрована с использованием AES, что затрудняет статический анализ, вся инфраструктурная цепочка - исключение стран СНГ, использование Node.js для доступа к данным браузера, шифрование и таймеры - указывает на кампанию по хищению данных, вероятно, нацеленную на расширения криптокошельков, сохранённые учётные данные и сессионные cookies.
Важно отметить, что кампания ForceMemo тесно связана с более ранней активностью вредоносного ПО GlassWorm. Адрес Solana, используемый в качестве C2 в этой атаке, идентичен адресу кошелька, применяемого в кампании GlassWorm, что свидетельствует об одном и том же операторе угроз. Это означает, что злоумышленник расширил свои методы доставки, перейдя от компрометации расширений для редакторов кода к массовому захвату аккаунтов GitHub. Анализ транзакций в блокчейне Solana показал, что активность по этому адресу началась ещё в ноябре 2025 года, за несколько месяцев до первых инъекций в репозитории GitHub, что указывает на длительную подготовку и тестирование инфраструктуры.
Для специалистов по информационной безопасности и разработчиков эта кампания служит суровым напоминанием о критической важности защиты цепочки поставок ПО. Недостаточно полагаться только на сканирование зависимостей на наличие известных уязвимостей. Необходимо внедрять практики, такие как мониторинг исходящего сетевого трафика в средах CI/CD, использование аппаратных ключей безопасности для учётных записей с высокими привилегиями, регулярный аудит истории коммитов на аномалии и строгий контроль над установкой сторонних расширений и инструментов. Разработчикам, которые устанавливают пакеты Python напрямую из GitHub, рекомендуется вручную проверять, что код в основной ветке соответствует последнему легитимному коммиту от оригинального автора, особенно если в истории появились подозрительные принудительные отправки изменений. Текущая кампания продолжается, и её полные последствия ещё предстоит оценить, однако она уже наглядно демонстрирует, насколько уязвимой может быть экосистема open-source перед лицом целевых и хорошо организованных атак.
Индикаторы компрометации
IPv4
- 217.69.0.159
- 217.69.11.57
- 217.69.11.99
- 45.32.150.97
- 45.32.151.157
- 45.76.44.240
Domains
- api.blockeden.xyz
- api.mainnet-beta.solana.com
- go.getblock.us
- solana.api.onfinality.io
- solana.api.pocket.network
- solana.drpc.org
- solana.leorpc.com
- solana-mainnet.gateway.tatum.io
- solana-rpc.publicnode.com
Solana C2 address
BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC
Solana funding wallet
G2YxRa6wt1qePMwfJzdXZG62ej4qaTC7YURzuh2Lwd3t