В экосистеме Node.js выявлена новая масштабная кампания, представляющая серьёзную угрозу безопасности цепочки поставок программного обеспечения. Специалисты исследовательской группы Socket обнаружили активное распространение червеподобного вредоносного кода через платформу npm. Эта активность, получившая название SANDWORM_MODE, использует как минимум 19 вредоносных пакетов, опубликованных под двумя псевдонимами издателей, и демонстрирует признаки наследования от ранее известного семейства червей Shai-Hulud, дополняя его новыми опасными возможностями. Инцидент затрагивает тысячи разработчиков и организаций по всему миру, поскольку вредоносные пакеты маскируются под популярные библиотеки для Node.js, инструменты криптографии и, что особенно важно, быстро набирающие популярность средства разработки с использованием ИИ.
Описание
Факты и масштаб кампании
Кампания SANDWORM_MODE использует технику тайпсквоттинга - регистрации доменных имён или, в данном случае, имён пакетов, сходных по написанию с популярными. Злоумышленники опубликовали пакеты, названия которых содержат опечатки в именах широко используемых утилит, таких как "supports-color" (вредоносный пакет "suport-color"), "claude-code" (пакеты "claud-code", "cloude", "cloude-code") и других. Это увеличивает вероятность случайной установки разработчиками. Все обнаруженные пакеты были опубликованы через учётные записи "official334" и "javaorg" и на момент обнаружения оставались доступными в реестре npm.
По своей сути вредоносный код представляет собой многостадийного червя, предназначенного для автоматического распространения через цепочку поставок. Его основная цель - кража учётных данных разработчиков и сред непрерывной интеграции (CI), последующее использование этих данных для латерального перемещения и заражения других проектов, а также сбор конфиденциальной информации, включая криптографические ключи и ключи API для языковых моделей.
Экспертиза: эволюция техник Shai-Hulud и новые угрозы
Анализ кода выявил явное сходство с ранее исследованными вариантами червя Shai-Hulud, включая многостадийное исполнение, сложную обфускацию и фокус на автоматическом распространении с использованием украденных идентификаторов npm и GitHub. Однако SANDWORM_MODE вводит несколько новых, более изощрённых векторов атаки.
Наиболее тревожным нововведением стала целенаправленная атака на инструменты разработки с искусственным интеллектом. Вредоносный код содержит модуль "McpInject", который внедряет скомпрометированный MCP-сервер (Model Context Protocol - протокол для взаимодействия языковых моделей с инструментами) в конфигурации популярных AI-ассистентов, таких как Claude Code, Cursor, VS Code Continue и Windsurf. Этот сервер маскируется под легитимный инструмент и с помощью внедрения промптов (prompt injection) тихо приказывает ИИ-модели прочитать и передать ему конфиденциальные данные пользователя: SSH-ключи, учётные данные AWS, токены npm и переменные окружения, содержащие секреты. Пользователь при этом не видит никаких подозрительных действий. Дополнительно модуль собирает API-ключи для девяти популярных провайдеров LLM, включая OpenAI, Anthropic и Google.
Ещё одной новой возможностью является подготовленный, но пока отключённый полиморфный движок. Он сконфигурирован для использования локального экземпляра Ollama с моделью deepseek-coder для автоматического переписывания собственного кода с целью усложнения анализа и обнаружения. Хотя в текущих образцах эта функция выключена, её наличие указывает на планы злоумышленников по дальнейшему развитию вредоносной программы.
Механика распространения также была усовершенствована. Помимо основного вектора через npm и GitHub API, червь имеет резервный механизм распространения через SSH-агент, который активируется, если первые два метода не сработали. Это повышает устойчивость кампании. Для эксфильтрации данных используется трёхкаскадный подход: сначала HTTPS POST на контролируемый злоумышленниками Cloudflare Worker, затем загрузка в приватные репозитории GitHub через API и, в качестве последнего средства, DNS-туннелирование с использованием генератора доменных имён (DGA).
Важной особенностью является внедрение в системы CI/CD через вредоносный GitHub Action "ci-quality/code-quality-check". Этот Action, маскирующийся под инструмент проверки качества кода, выполняет те же функции по сбору секретов и распространению, создавая петлю обратной связи: установка вредоносного npm-пакета внедряет в репозиторий workflow, который запускает этот Action; Action, в свою очередь, снова внедряет вредоносную зависимость.
Последствия и риски
Последствия успешного заражения могут быть катастрофическими для организаций и отдельных разработчиков.
- Массовая кража цифровых активов: Немедленный и безусловный дренаж криптографических ключей и мнемонических фраз из файлов конфигурации и переменных окружения создаёт прямой финансовый риск.
- Компрометация всей цепочки поставок: Получив доступ к учётным записям maintainer-ов, червь может автоматически публиковать заражённые версии легитимных пакетов с миллионами загрузок, отравляя огромное количество зависимостей.
- Утечка корпоративных секретов: Сбор токенов CI/CD, ключей облачных провайдеров (AWS) и внутренних переменных окружения открывает доступ к внутренним системам компаний.
- Долгосрочное закрепление в инфраструктуре: Установка глобальных git-хуков через "init.templateDir" и внедрение в конфигурации AI-ассистентов обеспечивают персистентность, которая может сохраняться даже после удаления изначального вредоносного пакета.
- Скрытый потенциал для разрушительных атак: Код содержит «аварийный выключатель» (dead switch), который, будучи активированным, может уничтожить все файлы в домашней директории пользователя при потере доступа к каналам управления.
Рекомендации по защите и выводы
В ответ на угрозу npm, GitHub и Cloudflare уже приняли меры по удалению вредоносных пакетов и инфраструктуры. Однако защита требует активных действий со стороны сообщества.
Если вы или ваша организация могли быть затронуты, необходимо немедленно выполнить следующие шаги:
- Проверить проекты на наличие установленных вредоносных пакетов из списка компрометации (IoC) и удалить их.
- Рассмотреть среду, где они выполнялись (рабочая станция разработчика или CI), как потенциально скомпрометированную.
- Отозвать и заменить все npm- и GitHub-токены, а также секреты CI, которые могли быть доступны в этой среде.
- Провести аудит недавних изменений в "package.json", lock-файлах и директории ".github/workflows/" на предмет неожиданных зависимостей или workflow, особенно тех, что используют "pull_request_target".
- Проверить глобальные настройки git: "git config --global init.templateDir".
- Изучить конфигурации AI-ассистентов (например, "~/.claude/settings.json", "~/.cursor/mcp.json") на предмет подозрительных записей "mcpServers".
Для долгосрочного усиления защиты эксперты рекомендуют:
- Внедрить принцип наименьших привилегий для токенов CI/CD, использовать OIDC и Trusted Publishing вместо долгоживущих секретов.
- Требовать обязательного ревью для любых изменений в CI-конфигурациях и зависимостях.
- Минимизировать количество секретов, доступных в средах CI.
- Внедрить инструменты для анализа зависимостей и мониторинга аномальной активности, такие как Socket, которые могут блокировать известные вредоносные пакеты на этапе pull request.
Кампания SANDWORM_MODE наглядно демонстрирует, как угрозы для цепочки поставок эволюционируют, становясь более сложными и целенаправленными. Атаки теперь затрагивают не только традиционные инструменты разработки, но и стремительно набирающий популярность стек ИИ, что требует от специалистов по безопасности постоянной бдительности и глубокого понимания меняющегося ландшафта угроз.
Индикаторы компрометации
Malicious Packages
- claud-code@0.2.1
- cloude-code@0.2.1
- cloude@0.3.0
- crypto-locale@1.0.0
- crypto-reader-info@1.0.0
- detect-cache@1.0.0
- format-defaults@1.0.0
- hardhta@1.0.0
- locale-loader-pro@1.0.0
- naniod@1.0.0
- node-native-bridge@1.0.0
- opencraw@2026.2.17
- parse-compat@1.0.0
- rimarf@1.0.0
- scan-store@1.0.0
- secp256@1.0.0
- suport-color@1.0.1
- veim@2.46.2
- yarsg@18.0.1
Sleeper Packages (not malicious yet)
- ethres
- iru-caches
- iruchache
- uudi
Threat Actor npm Aliases
- official334
- javaorg
Threat Actor Email Addresses
- official334@proton.me
- JAVAorg@proton.me
GitHub User
- official334
- Created: 2026-02-17
GitHub Organization
- ci-quality
GitHub Repository
- ci-quality/code-quality-check
- Tags: v1, v1.0.0
- GitHub Action entrypoint: dist/index.js
- Secondary propagation module: dist/propagate-core.js
Action Usage String
- uses: ci-quality/code-quality-check@v1
Injected Workflow Filename
- .github/workflows/quality.yml
Drain Authentication
- Bearer token: fa31c223d78b02d2315770446b9cb6f79ffc497db36d0f0b403e77ff4466cafb
Cryptographic and Stage-Loader Artifacts
- AES-256-GCM Parameters (Stage 2)
- IV (base64): dko6mG8AmQVECvVP
- Auth Tag (base64): /6rzsm9K+mflC4uguMJriA==
Stage 2 Keying / Integrity
- Stage 2 AES key (hex): 5ce544f624fd2aee173f4199da62818ff78deca4ba70d9cf33460974d460395c
- Stage 2 Plaintext SHA-256: 5440e1a424631192dff1162eebc8af5dc2389e3d3b23bd26e9c012279ae116e4
Embedded GitHub URL pattern
- https://github.com/node-util-${randomBytes(3).toString("hex")}/...
C2 Endpoints
- https://pkg-metrics.official334.workers.dev/exfil
- https://pkg-metrics.official334.workers.dev/drain
DNS exfiltration domains
- freefan.net
- fanfree.net
Local LLM probing endpoints
- http://localhost:11434/api/tags
- http://localhost:11434/api/generate
- http://localhost:1234/v1/models
- http://localhost:5000/v1/models
- http://localhost:8000/v1/models
- http://localhost:8080/v1/models
Simulation / Testing registry (Verdaccio)
- http://localhost:4873
TLD Pool (Exfil / DGA)
- cc, io, xyz, top, pw, tk, ws, gg, ly, mx
Environment-variable controls
- SANDWORM_MODE
- SANDWORM_REGISTRY_URL
- SANDWORM_GITHUB_API
- SANDWORM_MAX_PACKAGES
- SANDWORM_DELAY_MIN
- SANDWORM_DELAY_MAX
- SANDWORM_DNS_DOMAIN
- SANDWORM_DGA_SEED
- SANDWORM_DRAIN_ENDPOINT
- SANDWORM_DRAIN_AUTH_TOKEN
- SANDWORM_STAGE2_DELAY
- SANDWORM_SKIP_MTIME
- SANDWORM_SKIP_DELAY
- SANDWORM_ACTION_REF
- SANDWORM_CARRIER_NAME
- SANDWORM_EXFIL_ENDPOINT
- SANDWORM_DNS_SECONDARY